无法获得简单的CUDA程序

Bar*_*own 4 cuda

我正在尝试CUDA编程的"hello world"程序:将两个向量相加.这是我尝试过的程序:

#include <cuda.h>
#include <stdio.h> 
#define  SIZE 10

__global__  void vecAdd(float* A, float* B, float* C) 
{ 
   int i = threadIdx.x; 
   C[i] = A[i] + B[i]; 
} 

int  main() 
{ 
     float A[SIZE], B[SIZE], C[SIZE]; 
     float *devPtrA, *devPtrB, *devPtrC; 
     size_t memsize= SIZE * sizeof(float); 

     for (int i=0; i< SIZE; i++) {
        A[i] = i;
        B[i] = i;
     }

     cudaMalloc(&devPtrA, memsize); 
     cudaMalloc(&devPtrB, memsize); 
     cudaMalloc(&devPtrC, memsize); 
     cudaMemcpy(devPtrA, A, memsize,  cudaMemcpyHostToDevice); 
     cudaMemcpy(devPtrB, B, memsize,  cudaMemcpyHostToDevice); 

     vecAdd<<<1, SIZE>>>(devPtrA,  devPtrB, devPtrC); 
     cudaMemcpy(C, devPtrC, memsize,  cudaMemcpyDeviceToHost); 

     for (int i=0; i<SIZE; i++) 
         printf("C[%d]: %f + %f => %f\n",i,A[i],B[i],C[i]); 

     cudaFree(devPtrA); 
     cudaFree(devPtrB); 
     cudaFree(devPtrC); 
}
Run Code Online (Sandbox Code Playgroud)

编译:

nvcc cuda.cu
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

C[0]: 0.000000 + 0.000000 => 0.000000
C[1]: 1.000000 + 1.000000 => 0.000000
C[2]: 2.000000 + 2.000000 => 0.000000
C[3]: 3.000000 + 3.000000 => 0.000000
C[4]: 4.000000 + 4.000000 => 0.000000
C[5]: 5.000000 + 5.000000 => 0.000000
C[6]: 6.000000 + 6.000000 => 0.000000
C[7]: 7.000000 + 7.000000 => 0.000000
C[8]: 8.000000 + 8.000000 => 366987238703104.000000
C[9]: 9.000000 + 9.000000 => 0.000000
Run Code Online (Sandbox Code Playgroud)

每次我运行它时,我得到一个不同的答案C [8],但所有其他元素的结果总是0.000000.

Ubuntu 11.04系统是一个64位Xeon服务器,带有4个内核,运行最新的NVIDIA驱动程序(2012年10月4日下载).该卡是EVGA GeForce GT 430,具有96核和1GB RAM.

我该怎么做才能弄清楚发生了什么?

Seç*_*şçı 5

看来您的驱动程序没有初始化,但是不检查cuda返回代码总是不好的做法,你应该避免这种情况.这是一个简单的函数+宏,你可以用于cuda调用(引自Cuda的例子):

static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
Run Code Online (Sandbox Code Playgroud)

现在开始调用你的函数:

HANDLE_ERROR(cudaMemcpy(...));
Run Code Online (Sandbox Code Playgroud)


Bar*_*own 1

最可能的原因是:未加载 NVIDIA 驱动程序。在无头 Linux 系统上,X Windows 未运行,因此驱动程序不会在启动时加载。

以 root身份运行nvidia-smi -a以加载它们并以报告的形式获得确认。

尽管现在已加载驱动程序,但每次运行 CUDA 程序时仍需要对其进行初始化。将驱动程序置于持久模式,nvidia-smi -pm 1以便它们始终保持初始化状态。将其添加到启动脚本(例如 rc.local)中,以便它在每次启动时发生。

  • 很高兴知道这一点。如果 NVIDIA 驱动程序的安装程序能将我指向那里就好了。相反,它说“请参阅您的供应商发行版的文档”,并且 Ubuntu 的文档假设每个人都在运行 GUI。 (2认同)