// jscott: added 3d Fourier transform - cost 3N^2 void idFFT::FFT3D( cpxFloat_t *data, int N, int ISI ) { cpxFloat_t *orig; int i, j; orig = data; // Transform each slice for( j = 0; j < N; j++ ) { // 1D transform data = orig + j * N * N; for( i = 0; i < N; i++ ) { FFT1D( data, N, ISI, 1 ); data += N; } // 1D transform data = orig + j * N * N; for( i = 0; i < N; i++ ) { FFT1D( data, N, ISI, N ); data++; } } // Transform the volume data = orig; for( j = 0; j < N * N; j++ ) { FFT1D( data, N, ISI, N * N ); data++; } }
// RAVEN BEGIN // jscott: added 2d Fourier transform - cost 2N void idFFT::FFT2D( cpxFloat_t *data, int N, int ISI ) { cpxFloat_t *orig; int i; orig = data; // 1D horizontal transform for( i = 0; i < N; i++ ) { FFT1D( data, N, ISI, 1 ); data += N; } // 1D vertical transform data = orig; for( i = 0; i < N; i++ ) { FFT1D( data, N, ISI, N ); data++; } }
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); }