Cuda 在HPC上创建袖口计划时,袖口设备无效

Cuda 在HPC上创建袖口计划时,袖口设备无效,cuda,driver,hpc,cufft,Cuda,Driver,Hpc,Cufft,我正在使用nvidia驱动程序390和cuda 9.1在Archlinux和Ubuntu 16.04上以及本地HPC群集上测试以下代码: #include <iostream> #include <cufft.h> int main(){ // Initializing variables int n = 1024; cufftHandle plan1d; double2 *h_a, *d_a; // Allocation /

我正在使用nvidia驱动程序390和cuda 9.1在Archlinux和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_设备错误。下面是这些设备的硬件和驱动程序配置

对于一个集群,我们有几个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,它们似乎都不起作用。7.5.18返回了相同的错误,但似乎没有影响性能。 cuda 7.5.18之后,Cuft有一些变化,我没有意识到。 请注意:这只是一个示例,但我有一个更大的代码库,由于这个错误,它似乎无法运行,我正在尝试找出当前如何解决这个问题

感谢阅读,如果您对如何继续有任何想法,请告诉我


编辑-在Rob的评论之后添加了一条评论并修复了主代码中的一个打字错误。

我也遇到了类似的问题,结果是Cray包装器和cuda工具包之间存在冲突。 不加载cudatoolkit模块、启用动态链接和使用编译器提供的库解决了问题


PS:我使用的是PGI Fortran 17.5,因此不完全匹配。

1。cufftPlan1d的返回类型不是int.2。使用正确的CUDA错误检查。3.使用cuda memcheckHey Rob 1运行代码。就我所知,在本例中,int和cufftResult在功能上是完全相同的,对此我深表歉意。我忽略了这个示例的可读性错误检查,因为编写这样的代码:会使代码难以阅读,并且在功能上与我写的代码3没有什么不同。cuda memcheck不会返回任何错误,Cuft会。谢谢文件上说cufftPlan1d不能返回无效的CUFFT_设备。要么某个东西严重损坏,要么你发现了一个bug,要么你在问题中的示例实际上不是你正在运行的。没有办法知道上面是哪一个,它将结果11显示为CUFFT_INVALID_设备:我肯定在运行示例代码,毫无疑问。我已经在英伟达论坛上张贴了这篇文章,看看有没有人知道。