2

我有一个非常复杂的程序,它使用内部 FFT 算法。我最近决定尝试使用 FFTW 来提高性能。作为确保 FFTW 链接和运行的简单测试,我将以下代码添加到应用程序的开头,但是,当我运行时,我在创建时遇到分段错误fftwf_plan

const size_t size = 1024;
vector<complex<float> > data(size);
for(size_t i = 0; i < size; ++i) data[i] = complex<float>(i, -i);

fftwf_plan plan =
    fftwf_plan_dft_1d(size,
                      (fftwf_complex*)&data[0],
                      (fftwf_complex*)&data[0],
                      FFTW_FORWARD,
                      FFTW_ESTIMATE);
// ^ seg faults here ^

fftwf_execute(plan);
fftwf_destroy_plan(plan);

有什么想法会导致这种情况吗?

使用 FFTW 3.3。尝试了 2 种不同的编译器,g++ 4.1.1 和 icc 11.1。此外,核心文件文件没有任何意义:

Thread 1.1: Error at 0x00000000
Stack Trace: PC: 000000, FP=Hex Address

编辑

我使用以下命令重新配置 FFTW 以添加调试:

setenv CFLAGS "-fPIC -g -O0"
configure --enabled-shared --enable-float --enable-debug
make
make install

当程序出现分段错误时,它位于fftwf_plan_dft_1d()方法中的随机位置,但是,堆栈跟踪始终显示它位于或低于search调用的函数mkplan

4

3 回答 3

3

显然,问题源于多线程。尽管 FFTW 中的主要函数是线程安全的(例如fftwf_execute),但创建计划的函数却不是。这并不能完全解释为什么在启动时运行测试失败,但是,当我在互斥锁中解释计划创建时,分段错误停止了。

于 2011-10-03T14:39:36.020 回答
2

计划的创建和销毁必须是单线程的

fftw_init_threads();
#pragma omp parallel for
for(i=0;i<n;i++) {
   #pragma omp critical {
     plan = fftw_create_plan....
   }
   fftw_execute(plan); // or the fftw_execute_dft for multiple in/out fft operations
   #pragma omp critical {
     fftw_destroy_plan(plan);
   }
}
fftw_cleanup_threads();
于 2018-08-01T19:12:59.723 回答
0

我迟到了 3 年,但我偶然发现了一个非常相似的问题,在使用多线程(--enable-openmpfftw_plan_with_nthreads(omp_get_max_threads()))时也是如此。我的 seg 出现故障fftw_destroy_plan(p)

原来我在重构代码时没有注意,而且我在调用fftw_cleanup_threads()之前先调用fftw_destroy_plan(p)......我知道,这很傻,但它让我追了大约1小时。

使用多线程时,fftw_cleanup_threads()需要在所有 fftw* 函数之后调用,就像fftw_init_threads()需要在任何 fftw* 函数之前调用一样。

于 2014-10-20T04:32:19.167 回答