【问题标题】:CUDA program returning incorrect results [duplicate]CUDA程序返回不正确的结果[重复]
【发布时间】:2019-07-01 02:49:05
【问题描述】:

我从“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 != %d\n",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


    【解决方案1】:

    如果我改变我的配置,我碰巧能够重复你的错误。您的配置也可能有问题。当我使用合适的 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 %s\n",                   \
                                    cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__); \
                    exit(1);                                                              \
            } }
    //for example
         CUDA_CHECK_RETURN(cudaMemcpy(c,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost));
    

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

    【讨论】:

    • “我碰巧能重复你的错误”——所以如果你能重复这个问题,为什么不告诉我们它是什么以及如何解决它,而不是发布一个无用的答案建议检查错误
    • 我有cuda7.5和cuda8.0,nivida驱动352.68,明显驱动版本不支持cuda8.0,如果用cuda8.0,cuda*功能失效,内核永远不会被执行。每个人得到不同的配置,检查返回值并在这里发布就知道了。你试过在评论之前运行它吗?
    • 你还没有回答我的问题——你写的可以重现问题。你为什么不告诉我们问题是什么以及如何解决它?
    • 我想我并没有说得很清楚,我第一次用 cuda7.5 尝试你的代码,一切都按预期工作,除了我指出的错字。然后我尝试cuda 8.0,其中一个cudaMemcpy()函数返回错误码,错误字符串说我的GPU驱动和cuda 8.0不兼容,结果是垃圾,因为没有一个cuda*函数运行正常,内核没有在 GPU 上正确执行,您需要检查返回值以了解您的返回值是否完全相同。
    • 好的,我的意思是程序大部分都很好。您的 cuda 环境可能有问题。如果您检查返回值,它应该会提供线索可能是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2012-04-11
    • 2016-02-06
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多