여러 FFT를 동시에 수행하려고합니다. 나는 FFTW와 OpenMP를 사용하고있다. 각 FFT가 다르기 때문에 FFTW의 멀티 스레딩 (OpenMP를 사용하는 것으로 알고 있음)에 의존하지 않습니다.OpenMP를 사용한 FFTW 계획 생성
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
이 모든 것이 정상적으로 작동합니다. 그러나 계획 작성 (fftw_plan_dft_r2c_2d)에서 중요한 구성을 제거하면 코드가 실패합니다. 왜 누군가가 설명 할 수 있습니까? fftw_plan_dft_r2c_2d는 실제로 "고아"가 아닙니다. 맞습니까? 두 스레드가 모두 numberOfRows 또는 numberOfColumns 메모리 위치를 동시에 지정하려고했기 때문입니까?
fftw의 멀티 스레딩 기능을 사용하고 있지 않습니다. 실제로 36 개의 단일 스레드 변환을 병렬로 수행하고 있습니다. –
알아. 내 첫 질문에서 말하기 _ 각 FFT가 다르기 때문에 FFTW의 멀티 쓰레딩 (build-in multithreading)에 의존하지 않습니다 ._ 36 개의 단일 스레드 변환을 병렬로 수행하고 싶습니다. – tir38
죄송합니다, 저의 실수, 정확히 반대쪽을 읽었습니다 .- –