2013-06-04 42 views
0

我被困在這樣一個愚蠢的問題,我想。這是一個測試內核正好看到atomicAdd工作:Cuda 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 

怎麼了? 謝謝 朱塞佩

回答

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);