2012-10-05 93 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(...));