2012-10-05 54 views
4

我正在尝试CUDA编程的“hello world”程序:将两个向量加在一起。以下是我已经尝试过的节目:编译时无法获得简单的CUDA程序

#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); 
} 

nvcc cuda.cu 

输出是这样的:

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 

我每次运行它,我得到了C [8不同的答案],但所有其他元素的结果始终为0.000000。

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

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

+0

你从[这里]安装CUDA软件开发包(http://developer.nvidia.com/cuda/cuda-downloads)? (不是工具箱) – none

+2

我的猜测是CUDA无法初始化。我建议为每个CUDA API调用添加错误检查。 – njuffa

+0

@gokcehan我从该网站下载了驱动程序,工具包和SDK。不过,我不确定如何处理SDK。它似乎主要包含文档和示例代码。 –

回答

1

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

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

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

+0

值得指出的是,这个问题的解决方案已经在Linux发行说明和/或Linux入门PDF中得到了明确的涵盖。 – talonmies

+2

很高兴知道。如果只有NVIDIA驱动程序的安装者指示我在那里。相反,它表示“请参阅供应商分发的文档”,而Ubuntu的文档假定每个人都在运行GUI。 –

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__)) 

现在开始打电话就像你的函数:

HANDLE_ERROR(cudaMemcpy(...));