Paralel olarak birkaç FFT gerçekleştirmeye çalışıyorum. FFTW ve OpenMP kullanıyorum. Her bir FFT farklıdır, bu yüzden FFTW'nin çoklu katmanı (OpenMP kullanır biliyorum) güvenmiyorum.OpenMP kullanarak FFTW planı oluşturma
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
Bu her şey düzgün çalışıyor. Ancak, kritik yapıyı plan oluşturma işleminden kaldırırsam (fftw_plan_dft_r2c_2d) kodum başarısız olur. Birisi nedenini açıklayabilir mi? fftw_plan_dft_r2c_2d gerçekten bir "yetim" değil, doğru mu? İki iş parçacığının her ikisi de aynı anda numberOfRows veya numberOfColumns bellek konumunu vurmaya çalışabilir mi?
Fftw'nin çok iş parçacıklı yeteneklerini KULLANMAYIN. Aslında, 36 tek iş parçacıklı dönüşümü paralel yapıyorsunuz. –
Biliyorum. İlk sorumda _Each FFT'nin farklı olduğunu söylüyorum, bu yüzden FFTW'nin çoklu yapıya güvenmiyorum. Paralel olarak 36 tek-dişli dönüşüm yapmak istiyorum. – tir38
Üzgünüm, benim hatam, tam tersini okudum ;-) –