0

我正在我自己的本地机器上(在 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 安装不正确时,我收到了类似的错误。

我完全不知道如何在这里继续,只能想到几件事:

  1. 我在本地机器(Titan X、pascal 和 GTX 970)上使用的消费类硬件与集群 HPC 硬件之间存在一些差异。
  2. 有一些我没有考虑过的驱动程序配置问题。我尽我所能尝试了不同的 cuda 版本,但它们似乎都不起作用,除了 7.5.18,它返回了相同的错误,但似乎并没有影响性能。
  3. cuda 7.5.18 之后 cufft 发生了一些我没有意识到的变化。

注意:这只是一个例子,但我有一个更大的代码库,由于这个错误似乎没有运行,我正在尝试找出当前如何解决这个问题。

感谢您阅读,如果您对如何进行有任何想法,请告诉我!

编辑——在 Rob 的评论之后添加了评论并修复了主代码中的错字。

4

1 回答 1

1

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

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

于 2018-03-16T18:03:56.343 回答