我有一个使用内部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/