cuda - 线程是否可以自动更新共享内存的 4 个不同位置?
问题描述
假设内核的一个线程试图更新共享内存上的 4 个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我能否导致该操作失败并被撤消?具体来说,这可以原子地执行吗?
mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;
解决方案
不,除了特殊情况。
这不能原子地执行,在一般情况下a
,b
, c
, 和d
是任意的(即不一定相邻),和/或x
, y
, z
,w
每个都是 32 位或更大。
我使用“原子地”来指代硬件提供的原子 RMW 操作。
此类操作最多限制为 64 位,因此 4 个 32 位或更大的数量无法工作。此外,所有数据必须是连续的并且“自然”对齐,因此不能在单个原子周期中访问独立的位置。
在 4 个数量为 16 位或 8 位数量且相邻且对齐的特殊情况下,您可以使用自定义 atomic。
要考虑的替代方案:
您可以使用临界区来实现这样的事情,可能会付出相当大的性能成本、代码复杂性和脆弱性。
另一种选择是重铸您的算法以使用某种形式的并行归约。由于您似乎在线程块级别进行操作,因此这可能是最好的方法。
推荐阅读
- javascript - 在键迭代中通过其父对象访问时,Javascript 对象为空
- amazon-web-services - 我们可以在 AWS cloudformation 模板中参数化逻辑 ID
- r - 在 Rshiny 传单上创建多边形
- mysql - MySQL:在另一个内部选择中访问内部选择表别名
- akka - 如何为 dockerized Akka 应用程序配置 Kamon?
- javascript - 将字母比较函数转换为日期比较函数
- google-cloud-platform - 更改 VM 后 GCP 无法通过 SSH 连接到 DataLab
- reactjs - React 响应式模态 - animationDuration
- python - Python:如何在 while 循环中跟踪两个或多个相等的变量
- sql - 2 个选择语句,1 个变量