【发布时间】:2018-02-26 09:00:18
【问题描述】:
我正在我自己的本地机器上(在 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。
- 在第二个集群上,我们使用 K80 和 nvidia 驱动程序版本 367.44 和 cuda 版本 8.0.44。请注意,在此硬件上使用 cuda 版本 7.5.18 运行代码时,上述代码仍会返回错误,但这实际上不会影响代码的执行(据我所知)。
根据this,cuda 版本与可用的驱动程序版本应该没问题;但是,当我之前在本地 ubuntu 机器上安装不正确的驱动程序和 cuda 时,我收到了类似的错误。
我完全不知道如何在这里继续,只能想到几件事:
- 我在本地计算机上使用的消费类硬件(Titan X、pascal 和 GTX 970)与集群 HPC 硬件之间存在一些差异。
- 有一些我没有考虑过的驱动程序配置问题。我尽我所能尝试了不同的 cuda 版本,但它们似乎都不起作用,除了 7.5.18,它返回了相同的错误,但似乎没有影响性能。
- cuda 7.5.18 之后 cufft 发生了一些我没有意识到的变化。
请注意:这只是一个示例,但我有一个更大的代码库,由于此错误似乎无法运行,我正在尝试找出当前如何解决该问题。
感谢您的阅读,如果您对如何进行有任何想法,请告诉我!
编辑 -- 在 Rob 的评论之后添加了评论并修复了主代码中的错字。
【问题讨论】:
-
1.
cufftPlan1d的返回类型不是int。 2. 使用正确的 CUDA 错误检查。 3. 用cuda-memcheck运行你的代码 -
Hey Rob 1. 很抱歉打错字了,
int和cufftResult在这种情况下在功能上是相同的(据我所知) 2. 为了可读性,我忽略了对这个示例的错误检查因为写这样的东西:devtalk.nvidia.com/default/topic/542160/cufft-error-handling/… 会使代码难以阅读,并且在功能上与我写的没有什么不同 3. cuda-memcheck 不会返回任何错误,cufft 会。谢谢! -
docs.nvidia.com/cuda/cufft/index.html#function-cufftplan1d -- 文档说 cufftPlan1d 不能返回 CUFFT_INVALID_DEVICE。要么某些东西严重损坏,要么您发现了一个错误,要么您在问题中的示例实际上并不是您正在运行的。不知道是哪个
-
就在上面,结果 11 显示为 CUFFT_INVALID_DEVICE:docs.nvidia.com/cuda/cufft/index.html#cufftresult 我肯定在运行示例代码,毫无疑问。我已经在 nvidia 论坛上发布了这个,看看有没有人知道。