如何实现像a> b?c:d这样的原子条件运算符?

时间:2019-05-07 02:04:49

标签: c++ cuda

我是CUDA程序的新手,我需要实现一个原子函数,例如atomicMyFunc(int *address, int compare, int val1, int val2),“ old”是位于地址处的值。

我已经尝试了好几天,但是失败了。 应该是这样的:

__device__ int atomicMyFunc(int * address, int compare, int val1, int val2)
{
    if(old>compare?val1:val2) // compare and then store val1 or val2 in the address
    {
        // do something
    }
    return old;
}

1 个答案:

答案 0 :(得分:1)

您需要使用CUDA中可用的原子函数来构建原子函数。我建议检查CUDA programming guide中有关如何构建原子函数的示例。以此处提供的示例为起点,我认为以下函数可以实现您想要的

__device__ int atomicMyFunc(int* address, int compare, int val1, int val2) {
    int old = *address;
    int assumed;

    do {
        assumed = old;
        old = atomicCAS(address, assumed, assumed > compare ? val1: val2);
    }
    while (assumed != old);

    return old;
}

它基本上在循环中使用atomicCAS()以便仅在使用与当前存储在提供的地址上相同的值计算出运算结果时存储运算结果。