我有一个使用内部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中或以下。

最佳答案

显然,问题出在多线程。即使主要功能在FFTW中是线程安全的(例如fftwf_execute),创建计划的功能也不是。这并不能完全解释为什么仅在启动时运行测试失败的原因,但是,当我将计划创建封装在互斥锁中时,分段错误就停止了。

关于c++ - 使用FFTW的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7574350/

10-14 08:26