繁体   English   中英

何时以及为什么要在 CUDA 中使用 atomicInc()?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM