gpt4 book ai didi

c - 创建许多计划和执行计划时遇到的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:00:41 24 4
gpt4 key购买 nike

我对通过调用 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(),我会遇到段错误。

有人可以帮我吗?我应该如何跨多个线程划分数据?或者它一开始就不正确。

提前谢谢你。

飞翔

最佳答案

  • 您是否为out 正确分配了内存?这样做:
out = (fftwf_complex *)&in[0];  // for in-place transformation

做同样的事情:

out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*numberOfOutputColumns);
  • 您正在尝试访问并行 block 中的“p”,但没有具体告诉 openMP 如何使用它。应该是:

pragma omp parallel for shared(p)

  • 如果您要为 n 个线程拆分工作,我认为您会明确地告诉 omp 使用 n 个线程:

pragma omp parallel for shared(p) num_threads(n)

  • 这段代码是否可以在没有多线程的情况下工作?如果您删除了 for 循环和 openMP 调用并仅执行一次 fftwf_execute(p),它是否有效?

  • 我不太了解 FFTW 的许多计划,但看起来 p 确实是很多计划,而不是一个单一的计划。所以,当你“执行”p 时,你是在同时执行所有计划,对吧?你真的不需要迭代执行 p。

我仍在学习 OpenMP + FFTW,所以我在这些方面可能是错误的。 StackOverflow 不喜欢我在 pragma 前面放一个 #,但你需要一个。

关于c - 创建许多计划和执行计划时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11949083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com