我开始移植现有的fftw3应用程序来使用cuda fftw库。最初阶段是简单地用fftw3.h
标题替换cufft.h
标题,并链接cufft库而不是fftw3库。
这很简单,代码用nvcc
编译。但是,当我执行代码时,应用程序无法使用fftw_plan_guru_dft
命令创建计划(它只返回0而不是有效计划)。
由于没有报告错误,我对如何调试此问题感到茫然。 cuda-gdb
和gdb
未提供任何进一步的见解。他们只是报告
Error: Internal error reported by CUDA debugger API (error=7). The application cannot be further debugged.
更新:所以这是最小的工作示例。正如我对Talonmies的评论中所提到的,这个代码是由科学微分方程求解器自动生成的。请原谅功能名称等。
#define real Re
#define imag Im
#include <complex>
#undef real
#undef imag
#include <cufftw.h>
#include <stdio.h>
int main(void) {
int _transform_sizes_index = 1, _loop_sizes_index = 0;
fftw_iodim _transform_sizes[1], _loop_sizes[2];
_transform_sizes[0].n = 128;
_transform_sizes[0].is = 0;
_transform_sizes[0].os = 0;
fftw_complex _data_in[128] = {0.};
static fftw_plan _fftw_forward_plan = NULL;
_fftw_forward_plan = fftw_plan_guru_dft(
_transform_sizes_index, _transform_sizes,
_loop_sizes_index, _loop_sizes,
reinterpret_cast<fftw_complex*>(_data_in),
reinterpret_cast<fftw_complex*>(_data_in),
FFTW_FORWARD, FFTW_PATIENT);
if (!_fftw_forward_plan)
printf("Error: Unable to create forward plan\n");
return 0;
}
除非其他人知道我做错了什么,否则看起来这个fftw3的特定功能可能不受袖带支持。
答案 0 :(得分:0)
正如talonmies指出的那样,fftw_plan_guru_dft
仅在cufftw库中有部分支持。如果您改为使用基本级fftw_plan_dft
,则会运行上面的示例。更具体地说
#define real Re
#define imag Im
#include <complex>
#undef real
#undef imag
#include <cufftw.h>
#include <stdio.h>
int main(void) {
int _transform_sizes_index = 1, _loop_sizes_index = 0;
int _transform_sizes[1] = {128};
fftw_complex _data_in[128] = {0.};
static fftw_plan _fftw_forward_plan = NULL;
_fftw_forward_plan = fftw_plan_dft(
_transform_sizes_index, _transform_sizes,
reinterpret_cast<fftw_complex*>(_data_in),
reinterpret_cast<fftw_complex*>(_data_in),
FFTW_FORWARD, FFTW_PATIENT);
if (!_fftw_forward_plan)
printf("Error: Unable to create forward plan\n");
return 0;
}