`atomic

您所在的位置:网站首页 函数的组合 `atomic

`atomic

2023-04-07 06:07| 来源: 网络整理| 查看: 265

在一些ISAs上实现asm中获取负载的一种方法是,在PowerPC或ARM等ISAs上,在ARMv8引入ldar / ldaxr之前,先加载一个普通负载,然后再加上一个栅栏。如果故障排序不包括.,则可以跳过后一栏。

如果没有真正的ISA,则LL/SC CAS_weak在伪asm中可能是这样的:

ll r0, mem cmp r0, r1 jne .fail # early-out compare fail sc r2, mem # let's pretend this sets CF condition code on SC failure jc .fail # jump if SC failed lwsync # LoadLoad, StoreStore, and LoadStore but not StoreLoad ... CAS success path .fail: # we jump here without having executed any barriers ... CAS failure path

这(我认为)可能是mem.compare_exchange_weak(r1, r2, mo_acquire, mo_relaxed);在某些机器上的有效实现。

这只是一个获取操作,所以整个RMW可以与早期的操作重新排序( LL/SC的性质使它们保持在全球顺序中)。在行动之前没有障碍,只有在那之后。

lwsync是一个PowerPC屏障指令,它阻止除StoreLoad之外的所有重新排序(即不刷新存储缓冲区)。https://preshing.com/20120913/acquire-and-release-semantics/和https://preshing.com/20120930/weak-vs-strong-memory-models/

为了在大多数ISAs上实现CAS(..., acq_rel, relaxed),我们还在LL/SC之前运行了一个屏障(将它与以前的操作分开,创建发布部分)。即使在失败路径上也会执行,但不会创建获取语义。它不会将负载与以后的操作分开。

如果比较失败,AFAIK您不想把LL和SC之间的栅栏设为跳过。这将延长事务的长度,并使其有更多机会从其他线程的活动中失败。

与以往一样,在实际的C++基础上实现内存模型时,考虑到底层ISA提供的原语的限制,您所做的事情是必要的,但不是更强的。大多数ISAs不会使CAS(acq_rel,松弛的)故障路径实际上像普通的轻松负载那样便宜,要么是因为它不可能,要么是因为它会损害正常情况下的性能。但在某些情况下,它仍然可以比失败一方需要获得语义的代价更低。

有些ISAs (如ARM)显然只有完全的屏障(dsb ish),因此即使是acq_rel也会耗尽存储缓冲区。(因此,ARMv8引入了获取加载和顺序发布存储非常好,因为它完全符合C++ seq-cst的语义,并且可能比障碍便宜得多。)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3