如何通过此原子操作来避免出现竞争状况?

时间:2019-06-14 04:04:45

标签: c cuda race-condition

以下面的代码片段为例:

    __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的时间之间出现竞争状态。

0 个答案:

没有答案
相关问题