Cuda AtomicAdd不增加

时间:2013-06-04 08:34:11

标签: cuda parallel-processing

我猜想我会遇到这样一个愚蠢的问题。这是一个测试内核,只是为了看到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

怎么了? 谢谢 朱塞佩

1 个答案:

答案 0 :(得分:3)

此输出没有任何问题。内核启动的不同线程并行执行,因此在第一个线程到达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);