5

私は CUDA プログラミングの "hello world" プログラムを試しています: 2 つのベクトルを一緒に追加します。これが私が試したプログラムです:

#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 ドライバー (2012 年 10 月 4 日にダウンロード) を実行する 4 コアの 64 ビット Xeon サーバーです。カードは 96 コアと 1GB の RAM を搭載した EVGA GeForce GT 430 です。

何が起こっているのかを理解するにはどうすればよいですか?

4

2 に答える 2

1

最も考えられる原因: NVIDIA ドライバーがロードされていません。ヘッドレス Linux システムでは、X Windows が実行されていないため、ブート時にドライバーがロードされません。

nvidia-smi -aroot として実行してロードし、レポートの形式で確認を取得します。

ドライバーはロードされましたが、CUDA プログラムを実行するたびに初期化する必要があります。ドライバーを永続モードにしnvidia-smi -pm 1て、常に初期化されたままにします。これを起動スクリプト (rc.local など) に追加して、起動のたびに実行されるようにします。

于 2012-10-09T04:50:36.067 に答える