包含 FFTW3 的 DFT 函数的 .DLL 文件的多线程处理

Multithreading Of The .DLL File That Contains The DFT Function Of FFTW3

提问人:Hansov 提问时间:8/9/2023 最后编辑:Hansov 更新时间:8/10/2023 访问量:43

问:

我生成一个包含FFTW3库的傅里叶函数的.dll文件。由于 .dll 中的变量依赖性,我无法实现多线程。我正在使用傅里叶并获取变量,对它们做一些工作,然后再次计算傅里叶。在这里,我的FFT(用于DST计算)函数部分在.dll中。

void dst(fftwf_complex* x, size_t n)
{
   fftwf_complex* y = fftwf_alloc_complex(size_t);
   
   ffywf_plan plan = 
   fftwf_plan_dft_1d(size_t,y,y,FFTW_FORWARD,FFTW_ESTIMATE);
   
   // write x to y

   fftwf_execute(plan);

   fftwf_destroy_plan(plan);
   fftwf_cleanup();

   // write y to x again

   fftwf_free(y);
}

代码在它们之间经过一些处理后,多次转到上面的代码(也有一个 IDST 函数)。

因此,当我想在不同情况下将 .dll 与多线程一起使用时,FFTW3 库给了我一些错误。

double Class::Function1(Class& Inputs, int x, int y, int z)
{
   dllFunction(Inputs.a, Inputs.b, Inputs.c, x, y, z);

   return Inputs.z;
}



void Class::Function2(Class& Inputs)
{
   #pragma omp parallel
   {
      #pragma omp for
      for (int i=0;i<5;i++)
      {
         Inputs.z = Obj.Function1(Inputs,x,y,z);
      }
   }
}

当我尝试这样做时,它会在 dllFunction() .cpp文件 dst 函数中出现错误。错误是“访问冲突读取位置”。(// 将 x 写入 y 部分)(位于不同的目录,我不知道它如何找到.cpp文件)。

不久,我想将多线程与不在 .dll 中的 .dll 一起使用。FFTW3有什么问题?我不能使用线程运行 .dll 吗?我希望我能够解释。

注释 1:我使用 DFT 函数进行 DST 计算,所以我在 dst 函数中做了一些处理。另外,我知道 FFTW3 中有一个 dst 函数,但对于大型计算来说它非常慢。所以我改用 fft。

C++ 多线程 DLL FFT FFTW

评论

1赞 Cris Luengo 8/10/2023
你是如何进行多线程的?您使用的 FFTW 版本中使用了哪种多线程方法(有不同的选项)?请显示一个最小的可重现示例,并向我们显示您收到的错误消息。如果我们不知道你做了什么或发生了什么,真的很难帮助你。
0赞 user207421 8/10/2023
“由于 .dll 中的变量依赖性,我无法实现多线程”:请解释。
0赞 Hansov 8/10/2023
这样想,我有 10 个部分要计算。第二个是取决于第一个的结果。第三个是取决于第二个。事情是这样的。在这里,我不想同时计算 10 个零件。我想复制 10 个零件,并同时计算它们。
0赞 user207421 8/10/2023
这听起来像是自相矛盾的,或者至少是很多毫无意义的冗余计算。
0赞 Ted Lyngmo 9/1/2023
fftwf_complex* y = fftwf_alloc_complex(size_t);...请显示真实代码而不是伪代码。

答: 暂无答案