假设内核线程正在尝试更新共享内存上的4个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我可以导致该操作失败并被撤消吗?具体来说,这可以自动执行吗?
<script src="/js/app.js"> </script>
答案 0 :(得分:4)
在a
,b
,c
和d
是任意的(即不一定是相邻的)的一般情况下,这不能自动执行/或x
,y
,z
,w
均为32位或更大。
我在“原子上”是指an atomic RMW operation that the hardware provides。
此类操作最多只能使用64位,因此无法进行4个32位或更大的操作。此外,所有数据都必须是连续的且“自然”对齐的,因此不能在单个原子周期中访问独立的位置。
在4个数量为16位或8位数量且相邻且对齐的特殊情况下,可以使用custom atomic。
您可以使用critical sections来实现这些目标,可能需要付出可观的性能成本,代码复杂性和易碎性。
另一种选择是重铸算法以使用某种形式的parallel reduction。由于您似乎正在线程块级别进行操作,因此这可能是最好的方法。