source: trunk/platforms/tsarv4_multi_cluster_ring_vdspin/soft/main.c @ 9

Last change on this file since 9 was 9, checked in by simerabe, 14 years ago

updating multi-cluster platform

  • Property svn:executable set to *
File size: 8.7 KB
Line 
1#include "system.h"
2#include "stdio.h"
3#include "stdlib.h"
4#include "matrice.h"
5
6#include "../segmentation.h"
7
8#define NPROCS 16
9#define SIZE 1000
10#define SORT_TYPE 0
11
12/* DMA mapped registers offset */
13#define DMA_SRC_REG          0
14#define DMA_DST_REG          1
15#define DMA_LEN_REG          2
16#define DMA_RESET_REG        3
17#define DMA_IRQ_DISABLED     4
18
19uint32_t lock=0;
20volatile int compteur=NPROCS;
21
22volatile int nprocs=NPROCS;
23
24unsigned int SortArr0[NPROCS*(SIZE+200)];
25//unsigned int SortArr0[4*4*SIZE];
26unsigned char DmaSourceArray[NPROCS*512]; 
27unsigned char DmaDestArray[NPROCS*512]; 
28
29void SORT(unsigned int *base, unsigned int n, int type);
30void insertion_sort(unsigned int *base, unsigned int n); // type 2
31void selection_sort(unsigned int *base, unsigned int n); // type 1
32void bubble_sort(unsigned int *base, unsigned int n);    // type 3
33void shellSortPhase(unsigned int a[],unsigned int length, int gap);
34void shellSort(unsigned int *base, unsigned int n);     // type 0
35
36void dma_memcpy(unsigned char *source,unsigned char *dest,unsigned int length);
37void end_simulation_error(unsigned int restval);
38void end_simulation_good();
39
40int main()
41{
42  register int p; 
43
44  int beg_cycle, end_cycle;
45
46  beg_cycle = cpu_cycles();
47   
48  p=procnum();
49
50  puts("Hello from processor ");
51  puti(p);
52  putchar('\n');
53
54  int i;
55  int j;
56  unsigned int* SortArray;
57   
58  if(p >= NPROCS){
59        while(1) {
60            asm volatile("nop");
61        }
62  }
63
64//*------------------------------------
65  for(i=0;i<4;i++){
66    puts("Memory copy \n");
67    SortArray = SortArr0 + p*(SIZE+200);
68    memcpy(SortArray, gQSortNum0 + p*SIZE+10*i,SIZE*4);
69    puts("Sort... \n");
70    SORT((unsigned int *) (SortArray), (unsigned int) SIZE, i);
71
72    for (j = 1; j < SIZE; j++)
73    {
74      if (SortArray[j] < SortArray[j-1])
75      {
76        puts("ucbqsort: failed\n");
77        end_simulation_error((p+1)*i);
78      }
79
80    }
81
82    puts("ucbqsort: success\n");
83    end_cycle = cpu_cycles();
84    printf( "nombre cycles cpu : %i\n", end_cycle-beg_cycle);
85    beg_cycle = end_cycle;
86  }
87
88
89//
90 if(!p){
91    puts("Create the DMA source array");
92    unsigned int *isptr = gQSortNum0;
93    unsigned char *cdptr = DmaSourceArray;
94    int k;
95    for(k=0; k<512*NPROCS;k++){
96      *cdptr = (char) *isptr;
97      cdptr++;
98      isptr++;
99      //puti(k); // added for debug
100      putchar('\n'); 
101    }
102  }
103
104
105  puts("Decrement the counter");
106  int wait=0;
107  if(p+1 <= nprocs){
108    lock_lock(&lock);
109    compteur--;
110    putchar('\n');
111    puti(compteur);
112    putchar('\n');
113    if(compteur)
114      wait=1;
115    lock_unlock(&lock);
116  }
117
118  puts("Waiting for barrier");
119  while(compteur&&wait);
120  puts("Barrier released");
121
122  unsigned int m_lfsr = -1;
123  for(i=0; i<1000;i++)
124    m_lfsr = (m_lfsr >> 1) ^ ((-(m_lfsr & 1)) & 0xd0000001);
125  for(i=0; i<200 ; i++){ 
126    m_lfsr = (m_lfsr >> 1) ^ ((-(m_lfsr & 1)) & 0xd0000001);
127    unsigned int length = m_lfsr % (256);
128    m_lfsr = (m_lfsr >> 1) ^ ((-(m_lfsr & 1)) & 0xd0000001);
129    unsigned int src_offset = m_lfsr %(128);
130    m_lfsr = (m_lfsr >> 1) ^ ((-(m_lfsr & 1)) & 0xd0000001);
131    unsigned int dest_offset = m_lfsr %(128);
132    unsigned int source_sum=0;
133    unsigned int dest_sum=0;
134    for(j=0;j<length;j++){
135      source_sum+=(unsigned int)DmaSourceArray[512*p+j+src_offset];
136    }
137    for(j=0;j<512;j++){
138      DmaDestArray[p*512+j] = 0;
139    }
140    lock_lock(&lock);
141    puts("Copying with the DMA... ");
142    dma_memcpy(DmaSourceArray+src_offset+512*p,DmaDestArray+dest_offset+512*p,length);
143    lock_unlock(&lock);
144    for(j=0;j<512;j++){
145      dest_sum+=(unsigned int)DmaDestArray[512*p+j];
146    }
147    if(source_sum!=dest_sum){
148    /*
149      puts("Source sum, Dest sum :");
150      puti(source_sum);
151      putchar('\n');
152      puti(dest_sum);
153      putchar('\n');
154      puts("Source addr, Dest addr :");
155      puti(DmaSourceArray+src_offset+512*p);
156      putchar('\n');
157      puti(DmaDestArray+dest_offset+512*p);
158      putchar('\n');
159      puts("Length :");
160      puti(length);
161      putchar('\n');
162    */
163      end_simulation_error((p+1)*5);
164    }
165    puts("done !");
166  }
167  if(p+1 <= nprocs){
168    lock_lock(&lock);
169    compteur++;
170    putchar('\n');
171    puti(compteur);
172    putchar('\n');
173    if(compteur != NPROCS)
174      wait=1;
175    lock_unlock(&lock);
176  }
177
178  while((compteur!=NPROCS) && wait);
179
180  end_simulation_good();
181}
182
183void dma_memcpy(unsigned char *source,unsigned char *dest,unsigned int length){
184  int i;
185  volatile unsigned int *dma_base = (volatile unsigned int*) DMA_BASE;
186  *(dma_base + DMA_RESET_REG) = 0;
187  *(dma_base + DMA_SRC_REG) = (unsigned int) source;
188  *(dma_base + DMA_DST_REG) = (unsigned int) dest;
189  *(dma_base + DMA_IRQ_DISABLED) = 1;
190  *(dma_base + DMA_LEN_REG) = length;
191  do{
192    for(i=0 ; i<300; i++){
193      asm volatile("nop");
194    } 
195  }while( *(dma_base + DMA_LEN_REG)!= 0 );
196
197}
198
199void end_simulation_good(){
200    puts("\n Simulation Good !!!!!!!!");
201    while(1);   
202//  return;
203}
204
205void end_simulation_error(unsigned int retval){
206    puts("\n Simulation error ********");
207    while(1);
208}
209
210//---- insertion sort : non adapté pour tableaux de grande taille (> 100) --
211void insertion_sort(unsigned int *base, unsigned int n) 
212{
213  /* Spécifications externes : Tri du tableau base par insertion séquentielle */
214  int i,p,j;
215  int x;
216
217  puts("Insertion Sort\n");
218
219  for (i = 1; i < n; i++) 
220  {
221
222    putchar('-'); // added for debug
223
224    /* stockage de la valeur en i */
225    x = base[i]; 
226
227    /* recherche du plus petit indice p inférieur à i tel que base[p] >= base[i] */
228    for(p = 0; base[p] < x; p++);
229    /* p pointe une valeur de base supérieure à celle en i */ 
230
231    /* décalage avant des valeurs de base entre p et i */         
232    for (j = i-1; j >= p; j--) {
233      base[j+1] = base[j]; 
234    }   
235
236    base[p] = x; /* insertion de la valeur stockée à la place vacante */
237
238    putchar('+'); // added for debug
239
240  }
241}
242
243//------ simple_sort -------------------------------
244void selection_sort(unsigned int *base, unsigned int n)
245{
246  int i, min, j , x;
247  puts("Selection Sort\n");
248
249  for(i = 0 ; i < n - 1 ; i++)
250  {
251
252    putchar('-'); // added for debug
253
254    min = i;
255
256
257    for(j = i+1 ; j < n ; j++)
258    {
259
260      if(base[j] < base[min])
261        min = j;
262
263         }
264
265         if(min != i)
266         {
267             x = base[i];
268             base[i] = base[min];
269             base[min] = x;
270         }
271
272         putchar('+'); // added for debug
273
274     }
275}
276//-------------------------------
277void bubble_sort(unsigned int *base, unsigned int n)
278{
279        int i   = 0; /* Indice de répétition du tri */
280        int j   = 0; /* Variable de boucle */
281        int tmp = 0; /* Variable de stockage temporaire */
282        int en_desordre = 1; /* Booléen marquant l'arrêt du tri si le tableau est ordonné */
283
284        puts("Bubble Sort\n");
285
286        /* Boucle de répétition du tri et le test qui arrête le tri dès que le tableau est ordonné */
287        for(i = 0 ; (i < n) && en_desordre; i++)
288        {
289                putchar('-'); // added for debug
290
291                /* Supposons le tableau ordonné */
292                en_desordre = 0;
293                /* Vérification des éléments des places j et j-1 */
294                for(j = 1 ; j < n - i ; j++)
295                {
296                        /* Si les 2 éléments sont mal triés */
297                        if(base[j] < base[j-1])
298                        {
299                                /* Inversion des 2 éléments */
300                                tmp = base[j-1];
301                                base[j-1] = base[j];
302                                base[j] = tmp;
303 
304                                /* Le tableau n'est toujours pas trié */
305                                en_desordre = 1;
306                        }
307                }
308
309                putchar('+'); // added for debug
310        }
311
312}
313//------------------------------------------------------
314/*
315 * Exécute un tri par insertion avec la séparation donnée
316 * If gap == 1, on fait un tri ordinaire.
317 * If gap >= length, on ne fait rien.
318 */
319void shellSortPhase(unsigned int a[],unsigned int length, int gap) {
320    int i;
321 
322    puti(gap);
323    for (i = gap; i < length; ++i) {
324        unsigned int value = a[i];
325        int j;
326        for (j = i - gap; j >= 0 && a[j] > value; j -= gap) {
327            putchar('+');
328            a[j + gap] = a[j];
329            putchar('-');
330        }
331        a[j + gap] = value;
332    }
333}
334 
335void shellSort(unsigned int *base, unsigned int n) {
336    /*
337     * gaps[] doit approximer une Série géométrique.
338     * La sequence suivante est la meilleure connue en terme
339     * de nombre moyen de comparaisons. voir:
340     * http://www.research.att.com/~njas/sequences/A102549
341     */
342    static const int gaps[] = {
343        1, 4, 10, 23, 57, 132, 301, 701
344    };
345    int sizeIndex;
346 
347    puts("Shell Sort\n");
348    for (sizeIndex = sizeof(gaps)/sizeof(gaps[0]) - 1;
349               sizeIndex >= 0;
350               --sizeIndex)
351        shellSortPhase(base, n, gaps[sizeIndex]);
352}
353
354//-------------------------------------*/
355void SORT(unsigned int *base, unsigned int n, int type)
356{
357  switch(type)
358  {
359  case 0:
360    shellSort(base, n);
361    break;
362  case 1:
363    selection_sort(base, n);
364    break;
365  case 2:
366    insertion_sort(base, n);
367    break;
368  case 3:
369    bubble_sort(base, n);
370    break;
371  default:
372    break;
373  }
374}
375
Note: See TracBrowser for help on using the repository browser.