2012-08-14 33 views
1

我對通過調用fftwf_plan_many_dft_r2c()創建many_plan以及使用OpenMP執行它有點困惑。我試圖在這裏實現的目的是看看是否明確使用OpenMP並組織FFTW數據可以一起工作。 (我知道我應該使用fftw的多線程版本,但是我沒有得到預期的加速)。在創建多個計劃和執行計劃時出現問題

我的代碼如下所示:

/* I ignore some helper APIs */ 
#define N 1024*1024 //N is the total size of 1d fft 
fftwf_plan p; 
float * in; 
fftwf_complex *out; 

omp_set_num_threads(threadNum); // Suppose threadNum is 2 here 
in = fftwf_alloc_real(2*(N/2+1)); 
std::fill(in,in+2*(N/2+1),1.1f); // just try with a random real floating numbers 
out = (fftwf_complex *)&in[0]; // for in-place transformation 
/* Problems start from here */ 
int n[] = {N/threadNum}; // according to the manual, n is the size of each "howmany" transformation 
p = fftwf_plan_many_dft_r2c(1, n, threadNum, in, NULL,1 ,1, out, NULL, 1, 1, FFTW_ESTIMATE); 

#pragma omp parallel for 
for (int i = 0; i < threadNum; i ++) 
{ 
    fftwf_execute(p); 
    // fftwf_execute_dft_r2c(p,in+i*N/threadNum,out+i*N/threadNum); 
} 

我得到了什麼是這樣的:

如果我使用fftwf_execute(P),該計劃成功執行,但結果似乎不正確。 (我將結果與不使用many_plan和openmp的版本進行比較)

如果我使用fftwf_execute_dft_r2c(),我得到了段錯誤。

有人可以幫我嗎?我應該如何在多個線程間分割數據?或者首先它不正確。

預先感謝您。

flyree

回答

1
  • 你正確地分配用於內存不足?這是否:
out = (fftwf_complex *)&in[0]; // for in-place transformation 

做與此相同:

out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfOutputColumns); 
  • 您試圖訪問 'P' 您的並行塊中,沒有具體告訴OPENMP如何用它。它應該是:

編譯OMP並行共享(P)

  • 如果你要分開工作了n個線程,我想你會明確要告訴OMP使用n個線程:

編譯OMP並行共享(p)NUM_THREADS(n)的

  • 此代碼是否在沒有多線程的情況下工作?如果你刪除了for循環並且openMP調用並且只執行了一次fftwf_execute(p),它會起作用嗎?

  • 我對許多關於FFTW的計劃瞭解不多,但看起來p是真的很多計劃,而不是一個單一的計劃。所以,當你「執行」p時,你正在執行所有的計劃,對吧?你並不需要迭代執行p。

我還在學習OpenMP + FFTW,所以我可能在這些上出錯。當我把一個#放在編譯指示前面時,StackOverflow不喜歡它,但你需要一個。