2012-07-23 109 views
0

这是我的第一个(剽窃)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); 
    } 

这里是输出:

埃林@ ubuntu的:〜$ NVCC -lcudart vecadd.cu

埃林@ 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]

+0

你的问题到底是什么? (提示“帮助我的程序无法正常工作”对于堆栈溢出并不是真正有效的问题)。 CUDA API具有非常全面的错误检查功能,您可以从检查所有API调用的返回值开始,查看是否有任何错误,然后将它们添加到您的问题中。您可以提供有关您的问题的更多信息,这里的某个人可能会帮助您。 – talonmies 2012-07-23 05:52:59

+0

我正在看它,我没有看到问题,但是当我试图编译它时,我得到了同样的错误输出。 – CygnusX1 2012-07-23 08:51:23

回答

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 

我将需要更新它;)

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调用,类型转换为浮动是可选的,在我的情况下,这段代码工作正常,没有它。