CUDA原子操作

  1. atomicAdd(dst, src):*dst += src

  2. atomicSub(dst, src):*dst -= src

  3. atomicOr(dst, src):*dst |= src

  1. atomicAnd(dst, src):*dst &= src

  2. atomicXor(dst, src):*dst ^= src

  3. atomicMax(dst, src):dst = std::max(dst, src)

  4. atomicMin(dst, src):dst = std::min(dst, src)

以上原子操作均会返回旧值。

  1. old = atomicExch(dst, src) :old = dst; dst = src; 不返回旧值,对标std::atomic的exchange函数

  2. atomicCAS:判断是否相等,相等则写入,并读取旧值

    1
    2
    3
    4
    5
    6
    7
    old = atomicCAS(dst, cmp, src)

    Like below:

    old = *dst;
    if (old == cmp)
    *dst = src;

    通过atomicCAS可以实现一些CUDA并未原生提供的原子操作,例如:读-修改-写回,乘

    1
    2
    3
    old = atomicCAS(dst, expect, expect + src);

    old = atomicCAS(dst, expect, expect * src);