void SlaveStart() { long i; long MyNum; double *upriv; long initdone; long finish; long l_transtime=0; long MyFirst; long MyLast; LOCK(Global->idlock); MyNum = Global->id; Global->id++; UNLOCK(Global->idlock); BARINCLUDE(Global->start); /* POSSIBLE ENHANCEMENT: Here is where one might pin processes to processors to avoid migration */ BARRIER(Global->start, P); upriv = (double *) malloc(2*(rootN-1)*sizeof(double)); if (upriv == NULL) { fprintf(stderr,"Proc %ld could not malloc memory for upriv\n",MyNum); exit(-1); } for (i=0;i<2*(rootN-1);i++) { upriv[i] = umain[i]; } MyFirst = rootN*MyNum/P; MyLast = rootN*(MyNum+1)/P; TouchArray(x, trans, umain2, upriv, MyFirst, MyLast); BARRIER(Global->start, P); /* POSSIBLE ENHANCEMENT: Here is where one might reset the statistics that one is measuring about the parallel execution */ if ((MyNum == 0) || (dostats)) { CLOCK(initdone); } /* perform forward FFT */ FFT1D(1, M, N, x, trans, upriv, umain2, MyNum, &l_transtime, MyFirst, MyLast, pad_length, test_result, dostats); /* perform backward FFT */ if (test_result) { FFT1D(-1, M, N, x, trans, upriv, umain2, MyNum, &l_transtime, MyFirst, MyLast, pad_length, test_result, dostats); } if ((MyNum == 0) || (dostats)) { CLOCK(finish); Global->transtimes[MyNum] = l_transtime; Global->totaltimes[MyNum] = finish-initdone; } if (MyNum == 0) { Global->finishtime = finish; Global->initdonetime = initdone; } }
void SlaveStart() { long i; long MyNum; double *upriv; //int a = 2*(rootN-1)*sizeof(double); //double upriv[a]; long initdone; long finish; long l_transtime=0; long MyFirst; long MyLast; BARRIER(Global->start, P); LOCK(Global->idlock); MyNum = Global->id; Global->id++; UNLOCK(Global->idlock); BARINCLUDE(Global->start); BARRIER(Global->start, P); //upriv = (double *) malloc(2*(rootN-1)*sizeof(double)); upriv = (double *) our_malloc(2*(rootN-1)*sizeof(double)); if (upriv == NULL) { fprintf(stderr,"Proc %ld could not malloc memory for upriv\n",MyNum); exit(-1); } for (i=0;i<2*(rootN-1);i++) { upriv[i] = umain[i]; } MyFirst = rootN*MyNum/P; MyLast = rootN*(MyNum+1)/P; TouchArray(x, trans, umain2, upriv, MyFirst, MyLast); BARRIER(Global->start, P); if ((MyNum == 0) || (dostats)) { CLOCK(initdone); } //printf("\nentrando em forward FFT\n"); /* perform forward FFT */ FFT1D(1, M, N, x, trans, upriv, umain2, MyNum, &l_transtime, MyFirst, MyLast, pad_length, test_result, dostats); /* perform backward FFT */ if (test_result) { FFT1D(-1, M, N, x, trans, upriv, umain2, MyNum, &l_transtime, MyFirst, MyLast, pad_length, test_result, dostats); } if ((MyNum == 0) || (dostats)) { CLOCK(finish); Global->transtimes[MyNum] = l_transtime; Global->totaltimes[MyNum] = finish-initdone; } if (MyNum == 0) { Global->finishtime = finish; Global->initdonetime = initdone; } join_point(&myJoinPoint); }