CUDA程序输出错误

时间:2012-07-23 05:46:24

标签: cuda

这是我的第一个(剽窃)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位上。

感谢您的帮助!

此致

埃林


预期输出应打印iB[i]的值C[i]

2 个答案:

答案 0 :(得分:1)

在我看来,你的CUDA调用简单根本不起作用。 您确定系统中的所有内容都已正确安装吗?请尝试以下方法:

使用以下代码来代替您的代码:

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

在每个CUDA调用之后放置check()。您可能希望在更大的代码中以某种方式自动执行此操作,但出于测试目的,它应该足够了。如果出现问题,您应该获得人性化的信息。就我而言,我得到了:

CUDA driver version is insufficient for CUDA runtime version

我需要更新它;)

答案 1 :(得分: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是可选的,在我的例子中,这个代码在没有它的情况下工作正常。