我正在我自己的本地机器上(在 Archlinux 和使用 nvidia 驱动程序 390 和 cuda 9.1 的 Ubuntu 16.04 上)和我们的本地 HPC 集群上测试以下代码:
#include <iostream>
#include <cufft.h>
int main(){
// Initializing variables
int n = 1024;
cufftHandle plan1d;
double2 *h_a, *d_a;
// Allocation / definitions
h_a = (double2 *)malloc(sizeof(double2)*n);
for (int i = 0; i < n; ++i){
h_a[i].x = sin(2*M_PI*i/n);
h_a[i].y = 0;
}
cudaMalloc(&d_a, sizeof(double2)*n);
cudaMemcpy(d_a, h_a, sizeof(double2)*n, cudaMemcpyHostToDevice);
cufftResult result = cufftPlan1d(&plan1d, n, CUFFT_Z2Z, 1);
// ignoring full error checking for readability
if (result == CUFFT_INVALID_DEVICE){
std::cout << "Invalid Device Error\n";
exit(1);
}
// Executing FFT
cufftExecZ2Z(plan1d, d_a, d_a, CUFFT_FORWARD);
//Executing the iFFT
cufftExecZ2Z(plan1d, d_a, d_a, CUFFT_INVERSE);
// Copying back
cudaMemcpy(h_a, d_a, sizeof(double2)*n, cudaMemcpyDeviceToHost);
}
我编译nvcc cuda_test.cu -lcufft
在我的两台本地机器上,代码都运行良好;但是,我尝试在我们的 HPC 集群上使用相同的代码,它会在该硬件/配置上返回 CUFFT_INVALID_DEVICE 错误。这是这些设备的硬件和驱动程序配置。
- 对于一个集群,我们有多个 P100 可用,并且使用 nvidia 驱动程序版本 384.90 和 cuda 版本 8.0.61。
- 在第二个集群上,我们使用带有 nvidia 驱动程序版本 367.44 和 cuda 版本 8.0.44 的 K80。请注意,在此硬件上使用 cuda 版本 7.5.18 运行代码时,上述代码仍会返回错误,但这实际上不会影响代码的执行(据我所知)。
据此, cuda 版本应该可以与可用的驱动程序版本一起使用;但是,当我之前在本地 ubuntu 机器上的驱动程序和 cuda 安装不正确时,我收到了类似的错误。
我完全不知道如何在这里继续,只能想到几件事:
- 我在本地机器(Titan X、pascal 和 GTX 970)上使用的消费类硬件与集群 HPC 硬件之间存在一些差异。
- 有一些我没有考虑过的驱动程序配置问题。我尽我所能尝试了不同的 cuda 版本,但它们似乎都不起作用,除了 7.5.18,它返回了相同的错误,但似乎并没有影响性能。
- cuda 7.5.18 之后 cufft 发生了一些我没有意识到的变化。
注意:这只是一个例子,但我有一个更大的代码库,由于这个错误似乎没有运行,我正在尝试找出当前如何解决这个问题。
感谢您阅读,如果您对如何进行有任何想法,请告诉我!
编辑——在 Rob 的评论之后添加了评论并修复了主代码中的错字。