我对通过调用fftwf_plan_many_dft_r2c()并使用OpenMP执行它来创建many_plan感到有些困惑。我在这里想要实现的是看看是否明确使用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
答案 0 :(得分:1)
out = (fftwf_complex *)&in[0]; // for in-place transformation
做同样的事情:
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfOutputColumns);
pragma omp parallel for shared(p)
pragma omp parallel for shared(p)num_threads(n)
这段代码没有多线程吗?如果你删除了for循环和openMP调用并执行了fftwf_execute(p)只是一次有效吗?
对于很多人来说,我对FFTW的计划知之甚少,但看起来p确实是很多计划,而不是单一的计划。所以,当你“执行”p时,你正在一次执行所有计划,对吧?您实际上不需要迭代执行p。
我还在学习OpenMP + FFTW,所以我可能错了。当我把#放在pragma前面时,StackOverflow不喜欢它,但你需要一个。