0

これが私の最初の(盗用された)CUDAプログラムです。

  __global__  void vecAdd(float* A, float* B, float* C) 
  { 

      int i = threadIdx.x; 
      A[i]=0; 
      B[i]=i; 
      C[i] = A[i] + B[i]; 
   } 

   #include  <stdio.h> 
   #define  SIZE 10 
    int  main() 
   { 
        int N=SIZE; 
       float A[SIZE], B[SIZE], C[SIZE]; 
       float *devPtrA; 
       float *devPtrB; 
       float *devPtrC; 
       int memsize= SIZE * sizeof(float); 

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

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

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

        cudaFree(devPtrA); 
       cudaFree(devPtrA); 
       cudaFree(devPtrA); 
   } 

出力は次のとおりです。

erin@ubuntu:~$ nvcc -lcudart vecadd.cu

erin@ubuntu:~$ ./a.out

C[0]=0.000000 B[0]=0.000000

C[1]=0.000000 B[1]=0.000000

C[2]=-0.344699 B[2]=0.000000

C[3]=0.000000 B[3]=0.000000

C[4]=-0.344700 B[4]=0.000000

C[5]=0.000000 B[5]=0.000000

C[6]=0.000000 B[6]=0.000000

C[7]=0.000000 B[7]=0.000000

C[8]=0.000000 B[8]=-0.344690

C[9]=0.000000 B[9]=0.000000 erin@ubuntu:~$

これは、Pathetic Panda(?) 12.04 の Ubuntu 64 ビットにあります。

助けてくれてありがとう!

心から、

エリン


予想される出力は、およびの値iを出力するはずです。B[i]C[i]

4

2 に答える 2

1

単純なCUDA呼び出しはまったく機能しないようです。システムにすべてが正しくインストールされていますか?次のことを試してください。

コードの前に次のものを付けます。

void check() {
    cudaError_t err = cudaGetLastError();
    if (err != cudaSuccess) {
        printf("%s\n",cudaGetErrorString(err));
    }
    exit(1);
}

そして、check()各CUDA呼び出しの後に置きます。より大きなコードでこれを何らかの方法で自動化することもできますが、テスト目的ではそれで十分です。何か問題がある場合は、人間が読めるメッセージを受け取る必要があります。私の場合、私は次のようになりました。

CUDA driver version is insufficient for CUDA runtime version

更新する必要があります;)

于 2012-07-23T09:01:21.147 に答える
0

まず、ホスト配列 B にコピーするための cudaMemcpy 呼び出しがありません。追加する必要がありますcudaMemcpy(B, devPtrB, memsize, cudaMemcpyDeviceToHost);。次に、デバイスコードをそれに置き換えてみてください

    #include "device_launch_parameters.h"
    __global__  void vecAdd(float* A, float* B, float* C) 

  {     
      int i = threadIdx.x; 
      A[i]=0; 
      B[i]=(float)i; 
      C[i] = (float)(A[i] + B[i]); 
   } 

device_launch_parameters.h ヘッダーには、threadIdx.x 呼び出しの定義が含まれています。float への型キャストはオプションです。私の場合、このコードはそれがなくても正常に動作します。

于 2012-07-23T17:16:19.817 に答える