无法为 cufftComplex 数据类型分配 CUDA 设备内存

Unable to allocate CUDA device memory for cufftComplex data type

我正在尝试使用以下代码将 cufftComplex 数组分配到 CUDA 设备 (GEFORCE GTX 1080) 的内存中:

cufftComplex *d_in, *d_out;
int ds = sizeof(cufftComplex) * width * height;
CUResult test_din = cuMemAlloc((void**)&d_in, ds);
CUResult test_dout = cuMemAlloc((void**)&d_out, ds);
printf("test_din:  %s\n", cudaGetErrorString(test_din));
printf("test_dout:  %s\n", cudaGetErrorString(test_dout));

当我 运行 此代码时,我得到的错误是:

test_din: initialization error

test_dout: initialization error

当我编译代码时,我确实收到了关于使用 void** 的警告,但我看到的所有 cufft 示例,包括 Cuda 9.1 附带的代码示例,都包含 void** 类型转换。警告措辞如下:

/usr/local/cuda/include/cuda.h:90:49: note: expected 'CUdeviceptr *' but argument is of type 'void **'

有什么明显的地方我做错了吗?

cuMemAlloc 来自 CUDA 驱动 API.

如果你研究任何适当的驱动程序 API 程序,你会发现你需要做的第一件事就是发出:

cuInit();

开始使用 CUDA。也许您还没有这样做(您应该提供 MCVE)。这可能是导致此特定错误的原因。

如果您将两者混合,您将 运行 进入 CUDA 驱动程序 API 和 CUDA 运行time API 之间的其他断开连接。对于大部分代码来说应该不是必须的,我也不推荐新手使用。

研究示例代码以了解如何使用其中一个。例如,研究vectorAdd sample code to learn the basics of a CUDA runtime API program. Study the corresponding vectorAddDrv to learn the basics of a CUDA driver API程序。

这里最简单的解决方法可能就是将对 cuMemAlloc 的调用替换为 cudaMalloc:

cufftComplex *d_in, *d_out;
int ds = sizeof(cufftComplex) * width * height;
cudaError_t test_din = cudaMalloc((void**)&d_in, ds);
cudaError_t test_dout = cudaMalloc((void**)&d_out, ds);
printf("test_din:  %s\n", cudaGetErrorString(test_din));
printf("test_dout:  %s\n", cudaGetErrorString(test_dout));