[英]When and why would you use atomicInc() in CUDA?
我一直在阅读 CUDA 中的原子操作,而atomicInc()
的更新模式似乎相当随意。
来自CUDA 编程指南:
unsigned int atomicInc(unsigned int* address, unsigned int val);
读取位于全局或共享内存中地址的 32 位字 old,计算 ((old >= val) ? 0 : (old+1)),并将结果存储回同一地址的内存中。 这三个操作在一个原子事务中执行。 该函数返回旧的。
这是一个增量和“环绕”操作。 atomicInc(&x, val)
与x = (x+1) % (val+1)
非常相似。
这对什么样的应用程序有用? 这是 CUDA 编程中常见的代码模式吗? 如果是这样,是否有专门的硬件来执行这个操作,这使得atomicInc()
比使用atomicCAS()
的等效操作更好?
这对什么样的应用程序有用?
正如评论中所指出的,一种可能的应用是异步访问环形缓冲区。 atomicInc
具有翻转特性意味着当消费者想要访问超出环形缓冲区“结束”的元素时,索引(由atomicInc
返回)将翻转到开头,即 0。虽然它不是环形缓冲区-缓冲区示例, 此处介绍了使用原子进行缓冲区访问的想法。 atomicInc
的环形缓冲区可能是对它的一个微不足道的扩展。 我不会提供有关环形缓冲区的教程。 例如,您可能会通过两个都使用atomicInc()
的不同例程分别维护一个输入和一个输出索引。
如果是这样,是否有专门的硬件来执行这个操作,这使得 atomicInc()
根据我的经验,它远没有atomicAdd
的使用那么普遍。
如果是这样,是否有专门的硬件来执行这个操作,这使得 atomicInc() 比使用 atomicCAS() 的等效操作更好?
是的,有专门的 (SASS) 指令和硬件。 尽管几乎任何原子操作都可以使用atomicCAS
“模拟”,但算术(在这种情况下,加 1 和翻转检查)不能直接由atomicCAS
操作本身执行。 因此,要使用atomicCAS
作为替代,有必要使用规范的测试循环方法。 通常,与使用不需要循环即可正确实现的专用指令相比,这效率较低且性能较差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.