调试 CUFFTW 接口计划创建

Debugging CUFFTW interface plan creation

我开始移植现有的 fftw3 应用程序以利用 cuda fftw 库。初始阶段是简单地将 fftw3.h header 替换为 cufft.h header 和 link cufft 库而不是 fftw3 库。

这很简单,代码用nvcc编译。但是,当我执行代码时,应用程序无法使用 fftw_plan_guru_dft 命令创建计划(它只是 returns 0 而不是有效计划)。

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

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;
}

除非其他人知道我做错了什么,否则 cufftw 可能不支持 fftw3 的这个特殊功能。

正如 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;
}