我有点想为 x86-64 实现一种 LL/SC 形式(最有可能是 Saphire/Emerald Rapids)。看来缓存拥有执行此操作所需的所有信息,但我需要知道缓存行何时无效/修改(我可以保证分配的对齐和大小)。
有什么办法可以监听QPI流量吗?我听说有,但你的性能受到了影响(糟糕)。我真的只是想告诉系统当这个地址范围被修改时告诉我,然后我可以中止存储。有点像不太精确的 CAS 版本,但操作数是任意大小的)。
用软件窥探?据我所知,除了
umonitor
/umwait
之外,睡眠直到值发生变化(或超时)。
即使有办法检查和分支该核心是否仍然拥有缓存行的独占所有权,检查然后存储也会有一个TOCTOU竞争窗口,其中来自另一个核心的无效可能会在检查和无条件存储之间到达.
TSX 事务内存,特别是 RTM(受限事务内存),是 LL/SC 的通用形式,如果另一个核心干扰,CPU 会中止事务。您使用
xbegin
指令启动事务,执行一些加载和存储,然后运行 xend
。因此,检查是在您向 CPU 提供所有加载/存储之后。整个事务要么提交,要么中止。
如果您的系统支持并启用它,它可以为您提供通用的 CAS,甚至是涉及多个缓存行的更大事务。
但由于硬件安全漏洞,并非所有地方都启用。
在禁用 TSX 的 CPU 上,RTM 事务 (xbegin
Intel TSX:xbegin 始终返回 0)。或者可能是非法指令(汇编器xbegin raise非法指令) 由于 Spectre 缓解,硬件锁消除是否会永远消失?