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 调用 simple 根本不起作用。您确定系统中的所有内容都正确安装了吗?尝试以下操作:

在您的代码前加上:

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

首先,没有 cudaMemcpy 调用来复制回主机阵列 B,您需要添加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 回答