CUDA 程序返回不正确的结果



我从"CUDA By Example"一书中复制了一个向量加法示例,但得到了意想不到的错误结果。 这是我的代码

#define N (33*1024)
__global__
void add(int *a, int *b,int *c){
    int tid = threadIdx.x+blockIdx.x*blockDim.x;
    while (tid < N){
        c[tid] = a[tid]+b[tid];
        tid+=blockDim.x*gridDim.x;
    }
}

int main()
{
    int a[N], b[N], c[N];
    int *dev_a, *dev_b, *dev_c;
    cudaMalloc((void**)&dev_a,N*sizeof(int));
    cudaMalloc((void**)&dev_b,N*sizeof(int));
    cudaMalloc((void**)&dev_c,N*sizeof(int));
    for(int i = 0 ; i<N;i++){
        a[i]= -i;
        b[i]= i*i;
    }
    cudaMemcpy(dev_a,a,N*sizeof(int),cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b,b,N*sizeof(int),cudaMemcpyHostToDevice);
    cudaMemcpy(dev_c,c,N*sizeof(int),cudaMemcpyHostToDevice);
    add<<<128,128>>>(dev_a,dev_b,dev_c);
    cudaMemcpy(c,dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);
    bool success=true;
    //print results
    for(int i=0; i<N;i++){
        if((a[i]+b[i])!=c[i]){
            printf("Error: %d + %d != %dn",a[i],b[i],c[i]);
            success=false;
        }
    }
    if(success) printf("we did it!n");
    cudaFree(dev_a);
    cudaFree(dev_a);
    cudaFree(dev_a);
    printf("done");
    return EXIT_SUCCESS;
}

我得到了一堆不正确的加法结果,这里只是几个

Error: -33784 + 1141358656 != 255
Error: -33785 + 1141426225 != 0
Error: -33786 + 1141493796 != 0
Error: -33787 + 1141561369 != 0
Error: -33788 + 1141628944 != 4609792
Error: -33789 + 1141696521 != 0
Error: -33790 + 1141764100 != 4207408

还有很多很多。 我是一个完整的 CUDA 初学者,但我的猜测是我要么

A( 错误地从书中复制了代码或

B( 不正确的结果来自我正在使用 CUDA 10 的事实,该 CUDA 10 是在本书编写很久之后才问世

编辑:我重新启动了计算机,它可以工作

如果我更改配置,我碰巧能够重复您的错误。您的配置也可能有问题。当我使用合适的 CUDA 和驱动程序版本时,它在修复一个小错别字后工作:

cudaFree(dev_a); //this line is copied three times in your code

请使用如下所示的内容包装您的 cuda 调用以检查返回值。必须是 cuda 函数失败的其中一个。

#define CUDA_CHECK_RETURN(value) {                                                    
        cudaError_t _m_cudaStat = value;                                              
        if (_m_cudaStat != cudaSuccess) {                                             
                fprintf(stderr, "Error %s at line %d in file %sn",                   
                                cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__); 
                exit(1);                                                              
        } }
//for example
     CUDA_CHECK_RETURN(cudaMemcpy(c,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost));

它应该告诉你可能出现什么问题。

最新更新