【发布时间】:2011-09-27 19:02:27
【问题描述】:
我有一个非常复杂的程序,它使用内部 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 调用的函数search。
【问题讨论】:
-
你应该找出它在哪一行出现了段错误,然后用更多信息更新问题。
-
你说这都是内部代码。这意味着您可以确定 seg 故障发生在 fftwf_plan_dft_1d 的哪一行。
-
一进入
fftwf_plan_dft_1d,调试器就会突然停止,没有任何错误或状态,如果我检查一个核心文件,它什么也没有显示。 -
我猜如果
i是size_t,-i不会给你预期的结果。通过查看标题fftw3.h,我看到他们期望 C99 复合体具有相同的布局。您确定 std::complex 具有相同的布局/兼容吗? -
您可能需要使用调试符号重新编译 FFTW 以查看发生了什么。在类似 Linux 的系统上,将 FFTW-3.3 源代码分发版
cd解压缩到解压缩的文件夹中,然后键入CFLAGS='-g -O0' FFLAGS='-g -O0' ./configure