2012-08-14 73 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不喜欢它,但你需要一个。