Sto cercando di eseguire più FFT in parallelo. Sto usando FFTW e OpenMP. Ogni FFT è diversa, quindi non sto facendo affidamento sul multithreading incorporato di FFTW (che conosco utilizza OpenMP).Creazione di piani FFTW tramite OpenMP
int m;
// assume:
// int numberOfColumns = 100;
// int numberOfRows = 100;
#pragma omp parallel for default(none) private(m) shared(numberOfColumns, numberOfRows)// num_threads(4)
for(m = 0; m < 36; m++){
// create pointers
double *inputTest;
fftw_complex *outputTest;
fftw_plan testPlan;
// preallocate vectors for FFTW
outputTest = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfRows*numberOfColumns);
inputTest = (double *)fftw_malloc(sizeof(double)*numberOfRows*numberOfColumns);
// confirm that preallocation worked
if (inputTest == NULL || outputTest == NULL){
logger_.log_error("\t\t FFTW memory not allocated on m = %i", m);
}
// EDIT: insert data into inputTest
inputTest = someDataSpecificToThisIteration(m); // same size for all m
// create FFTW plan
#pragma omp critical (make_plan)
{
testPlan = fftw_plan_dft_r2c_2d(numberOfRows, numberOfColumns, inputTest, outputTest, FFTW_ESTIMATE);
}
// confirm that plan was created correctly
if (testPlan == NULL){
logger_.log_error("\t\t failed to create plan on m = %i", m);
}
// execute plan
fftw_execute(testPlan);
// clean up
fftw_free(inputTest);
fftw_free(outputTest);
fftw_destroy_plan(testPlan);
}// end parallelized for loop
Tutto funziona correttamente. Tuttavia, se rimuovo il costrutto critico dalla creazione del piano (fftw_plan_dft_r2c_2d) il mio codice fallirà. Qualcuno può spiegare perché? fftw_plan_dft_r2c_2d non è davvero un "orfano", giusto? È perché due thread potrebbero entrambi tentare di raggiungere la posizione di memoria numeroOfRows o numberOfColumns allo stesso tempo?
NON si utilizzano le funzionalità multi-threading di fftw. Realizzate in realtà 36 trasformazioni a thread singolo in parallelo. –
Lo so. Dico questo nella mia domanda iniziale: "Ogni FFT è diverso, quindi non sto facendo affidamento sul multithreading built-in di FFTW. VOGLIO realizzare 36 trasformazioni a thread singolo in parallelo. – tir38
Scusa, mio errore, ho letto esattamente il contrario ;-) –