以下面的代码片段为例:
__global__ void my_kernel(float *d_min, uint32_t *d_argmin, float *d_input, uint32_t N)
{
uint32_t ii = blockDim.x * blockIdx.x + threadIdx.x;
if (ii>=N)
return;
float cost_ii = someCostFunction( d_input[ii] );
float old_val = atomicMin( d_min, cost_ii );
if (old_val != cost_ii)
{
*d_argmin = ii;
}
}
让我们假设d_min
被调用方初始化为9999.9
。线程0计算出的成本100.0
较小,并安全地自动调整了最小值。同时,在另一个线程块中,另一个cost_ii
被计算为cost_ii = 10.0
。它会阻塞atomicMin
指令,然后进行设置。
因此d_min
的分配顺序如下:
d_min = 9999.9 // from external initialization
d_min = 100.0 // from thread 0 in block 0
d_min = 10.0 // from thread 0 in block 1
但是随后的if
语句以不同的顺序执行:
d_argmin = 1024 // from thread 0 in block 1
d_argmin = 0 // from thread 0 in block 0
如何避免在执行atomicMin()
到设置d_argmin
的时间之间出现竞争状态。