Cuda 调试CUFFTW接口计划创建

Cuda 调试CUFFTW接口计划创建,cuda,fftw,cufft,Cuda,Fftw,Cufft,我开始移植一个现有的fftw3应用程序,以利用CUDAFFTW库。初始阶段是简单地将fftw3.h头替换为cufft.h头,并链接cufft库而不是fftw3库 这很简单,代码使用nvcc编译。但是,当我执行代码时,应用程序无法使用fftw\u plan\u guru\u dft命令创建计划(它只返回0而不是有效的计划) 由于没有报告错误,我不知道如何调试这个问题cuda gdb和gdb不提供任何进一步的见解。他们只是报告 Error: Internal error reported by CU

我开始移植一个现有的fftw3应用程序,以利用CUDAFFTW库。初始阶段是简单地将
fftw3.h
头替换为
cufft.h
头,并链接cufft库而不是fftw3库

这很简单,代码使用
nvcc
编译。但是,当我执行代码时,应用程序无法使用
fftw\u plan\u guru\u dft
命令创建计划(它只返回0而不是有效的计划)

由于没有报告错误,我不知道如何调试这个问题
cuda gdb
gdb
不提供任何进一步的见解。他们只是报告

Error: Internal error reported by CUDA debugger API (error=7). The application cannot be further debugged.
更新:下面是最简单的工作示例。正如我在对Talonmes的评论中提到的,这段代码是由一个科学的微分方程求解器自动生成的。所以请原谅函数名等

#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;
}
#定义真正的Re
#定义imag Im
#包括
#未定义实数
#未定义图像
#包括
#包括
内部主(空){
int(int)变换(u size)索引=1,(u loop)循环(u size)索引=0 ;;
fftw_iodim_变换_大小[1],_循环_大小[2];
_变换大小[0]。n=128;
_变换大小[0]。is=0;
_转换大小[0]。os=0;
[128]={0}中的fftw_复数_data_;
静态fftw_计划(fftw_前进)计划=NULL;
_fftw\u前进计划=fftw\u计划\u大师\u dft(
_转换大小索引,转换大小,
_循环大小索引,循环大小,
重新解释铸件(_data_in),
重新解释铸件(_data_in),
FFTW_向前,FFTW_患者);
如果(!\u fftw\u forward\u plan)
printf(“错误:无法创建远期计划\n”);
返回0;
}
除非其他人知道我做错了什么,否则看起来fftw3的这个特定功能可能不受cufftw的支持。

正如所指出的,
fftw\u plan\u guru\u dft
在cufftw库中只有部分支持。如果使用基本级别
fftw\u plan\u 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;
}
#定义真正的Re
#定义imag Im
#包括
#未定义实数
#未定义图像
#包括
#包括
内部主(空){
int(int)变换(u size)索引=1,(u loop)循环(u size)索引=0 ;;
int_变换_大小[1]={128};
[128]={0}中的fftw_复数_data_;
静态fftw_计划(fftw_前进)计划=NULL;
_fftw_前进_计划=fftw_计划_dft(
_转换大小索引,转换大小,
重新解释铸件(_data_in),
重新解释铸件(_data_in),
FFTW_向前,FFTW_患者);
如果(!\u fftw\u forward\u plan)
printf(“错误:无法创建远期计划\n”);
返回0;
}

你能为这件事做一个重做的理由吗?否则很难知道你在这里期待什么样的答案(或者你真正想问什么),好吧,我看看我能做些什么。原始代码是由科学微分方程求解器(xmds.org)自动生成的,所以有点乱。鉴于fftw_plan_guru_dft没有输出任何错误,我只是想知道从何处开始。仅供参考:您可以看到,
fftw_plan_guru_dft()
在cuFFT中仅部分受支持。你确定你的用例是受支持的吗?哈哈。它似乎既受支持又不受支持。这可能与此有关。我回到办公室后,必须检查一下。谢谢,我会及时通知你的。