CUDA原子操作
atomicAdd(dst, src):*dst += src
atomicSub(dst, src):*dst -= src
atomicOr(dst, src):*dst |= src
atomicAnd(dst, src):*dst &= src
atomicXor(dst, src):*dst ^= src
atomicMax(dst, src):dst = std::max(dst, src)
atomicMin(dst, src):dst = std::min(dst, src)
以上原子操作均会返回旧值。
old = atomicExch(dst, src) :old = dst; dst = src; 不返回旧值,对标std::atomic的exchange函数
atomicCAS:判断是否相等,相等则写入,并读取旧值
1
2
3
4
5
6
7old = atomicCAS(dst, cmp, src)
Like below:
old = *dst;
if (old == cmp)
*dst = src;通过atomicCAS可以实现一些CUDA并未原生提供的原子操作,例如:读-修改-写回,乘
1
2
3old = atomicCAS(dst, expect, expect + src);
old = atomicCAS(dst, expect, expect * src);