【问题标题】:Cuda AtomicAdd not incrementCuda AtomicAdd 不增加
【发布时间】:2013-05-30 13:46:25
【问题描述】:

我想我被困在一个如此愚蠢的问题上。这是一个测试内核,只是为了查看 atomicAdd 工作:

__global__
void pixelcount_kernel(unsigned int * d_count,
                      const size_t numElems)
{ 
int myId = threadIdx.x + blockDim.x * blockIdx.x;
//avoid out of boundary access
if(myId > (numElems-1))
{return;
}

unsigned int inc=1;
atomicAdd(d_count, inc);
//debug code
printf("d_count: %d \n", *d_count);   
}

这是内存分配、初始化和内核调用:

unsigned int* d_count;
checkCudaErrors(cudaMalloc(&d_count, sizeof(unsigned int)));
checkCudaErrors(cudaMemset(d_count, 0, sizeof(unsigned int)));
pixelcount_kernel<<<gridSize, blockSize>>>( d_count, 10);

在输出中我没有看到从 0 到 numElems 的任何增量(在此调用中为 10),但是:

d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10 
d_count: 10

怎么了? 谢谢 朱塞佩

【问题讨论】:

    标签: cuda parallel-processing


    【解决方案1】:

    这个输出没有错。内核启动的不同线程并行执行,因此在第一个线程到达 printf() 时所有线程都增加了d_count 是完全合法的。

    实际上,如果您运行的代码块大小至少为 10,那么所有 10 个线程都是同一个 warp 的一部分,并且肯定会同时执行相同的指令。

    如果您想看到d_count 递增(例如,如果您想为每个参与线程分配一个唯一的 id),请改用以下代码:

    unsigned int my_d_count = atomicAdd(d_count, inc);
    printf("d_count before atomic increment: %d \n", my_d_count); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2022-12-11
      • 2023-03-08
      • 2013-06-22
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多