【问题标题】:calling fftw in multi thread program在多线程程序中调用 fftw
【发布时间】:2013-01-14 13:04:00
【问题描述】:

我想在线程中使用 fftw3。但是粘贴在http://codepad.org/lIjdGF5z 的代码会导致“双重释放或损坏”错误。如何正确调用线程中的 fftw3 例程。谢谢!可以通过命令“g++ test.cpp -lfftw3_threads -lfftw3 -lboost_thread”编译代码

【问题讨论】:

  • 您不应该在每次进行 FFT 时都创建和破坏计划。只做一次。

标签: c++ multithreading fftw


【解决方案1】:

我相信对fftw_plan_dft_2d 的调用是不可重入的,这意味着它不能同时在多个线程中调用,即使您正在创建不同的计划。根据文档Thread Safety page 的第 2 段,唯一线程安全的 fftw 函数是 fftw_execute 变体。

此外,正如 Paul R. 在 cmets 中提到的,您应该只在开始时创建一次计划,然后一遍又一遍地使用它们。它会快得多。此外,根据线程安全文档页面的第 3 段,您可以在多个同时调用 fftw_execute 时使用相同的计划。因此,如果您的变换大小相同,则所有线程只需要一个计划。

【讨论】:

  • 粘贴在codepad.org/nHSAN1lJ的程序怎么样。线程只包含fftw的可重入例程
  • 有效吗?如果没有,我认为你不需要在这里使用fftw_plan_many_dft 接口。这是因为如果您有多个 2D FFT 需要通过单个 fftw_execute 调用按顺序执行。您使用 howmany == 1 调用它的事实意味着您仍然只对每个 fftw_execute 进行一次 2D 变换。您仍然可以只使用更简单的fftw_plan_dft_2d 接口。
  • 如何在多个同时呼叫fftw_execute 时使用相同的计划?由于计划封装了它的输入/输出,那不会给您未定义或充其量相同的结果吗?
  • 标准的fftw_execute 调用确实如此,但您也可以使用此处提到的“新数组执行函数”:fftw.org/fftw3_doc/…。在这些中,只要数据格式相同,就可以将不同的输入和输出指针传递给每个执行调用。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多