【问题标题】:Increment and access global counter CUDA增量和访问全局计数器 CUDA
【发布时间】:2018-10-23 06:50:32
【问题描述】:

我需要让我的内核与主机通信。我尝试使用全局计数器(更好的方法被广泛接受),但下面的代码总是打印 0。我做错了什么? (我尝试了评论和未评论的方式)。

#include <stdio.h>
#include <cuda_runtime.h>

//__device__ int count[1] = {0};
__device__ int count = 0;

__global__ void inc() {
    //count[0]++;
    atomicAdd(&count, 1);
}

int main(void) {
    inc<<<1,10>>>();
    cudaDeviceSynchronize();
    //int *c;
    int c;
    cudaMemcpyFromSymbol(&c, count, sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d\n", c);
    return 0;
}

【问题讨论】:

    标签: cuda


    【解决方案1】:

    每当您在使用 CUDA 代码时遇到问题时,我强烈建议您使用 proper CUDA error checking 并使用 cuda-memcheck 运行您的代码,向其他人寻求帮助之前。即使您不理解错误输出,在您的问题中提供它也会对那些试图帮助您的人有用。

    如果你这样做了,你会收到cudaMemcpyFromSymbol 抛出无效参数错误的报告。

    如果你研究the documentation那个函数调用,你会发现第4个参数不是方向参数,而是偏移参数。因此,提供cudaMemcpyDeviceToHost 对于偏移参数是不正确的。由于cudaMemcpyFromSymbol 始终是设备-> 主机传输,因此提供方向参数是多余的,并且由于提供了默认值,因此是不必要的。您的代码只需消除它即可为我正常工作:

    $ cat t1414.cu
    #include <stdio.h>
    #include <cuda_runtime.h>
    
    //__device__ int count[1] = {0};
    __device__ int count = 0;
    
    __global__ void inc() {
        //count[0]++;
        atomicAdd(&count, 1);
    }
    
    int main(void) {
        inc<<<1,10>>>();
        cudaDeviceSynchronize();
        //int *c;
        int c;
        cudaMemcpyFromSymbol(&c, count, sizeof(int));
        printf("%d\n", c);
        return 0;
    }
    $ nvcc -o t1414 t1414.cu
    $ cuda-memcheck ./t1414
    ========= CUDA-MEMCHECK
    10
    ========= ERROR SUMMARY: 0 errors
    $
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多