我认为 C++ 尚未涵盖任何类型的事务内存,但 TSX 仍然可以以某种方式适合使用“as if规则”转变为由 C++ 内存模型控制的东西。
那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?
说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“好”的含义。
对于 HLE,它可能可以被视为“前一个操作发生在后续操作之前。就好像该部分仍然受到被删除的锁的保护”。
RTM 是什么?因为甚至没有省略锁,只有(可能是非原子的)内存操作,可以是加载、存储、两者或无操作。什么与什么同步?在什么之前会发生什么?
显然,在进入规格或询问之前,我应该彻底阅读“概述”页面:
硬件锁消除概述 https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-hardware-lock-elision-overview
硬件确保锁上的程序操作顺序,甚至
尽管省略处理器没有执行外部写操作
到锁。如果消除处理器本身读取的值
锁定关键部分,看起来好像处理器已经
获取锁(读取将返回非省略值)。这
行为使得 HLE 执行在功能上等同于
不带 HLE 前缀的执行。
受限事务内存概述 https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-restricted-transactional-memory-overview
RTM 内存排序
成功的 RTM 提交会导致 RTM 区域中的所有内存操作
看起来是原子执行的。成功提交的 RTM 区域
由 XBEGIN 后跟 XEND 组成,即使没有内存
RTM 区域中的操作具有与
LOCK 前缀指令。 XBEGIN 指令没有
击剑语义。但是,如果 RTM 执行中止,所有内存
来自 RTM 区域内的更新将被丢弃并且永远不会进行
对任何其他逻辑处理器可见。
完成答案:
LOCK
带前缀的指令映射到 C++std::memory_order::seq_cst
。这涵盖了所有成功的 RTM 交易(就好像单个交易一样)LOCK
-前缀指令)。它还涵盖了大多数 HLE 案例。具体来说:
-
LOCK
执行带前缀的指令就像执行它们一样,这意味着seq_cst
too
- 同样对于
XACQUIRE XCHG
/ XRELEASE XCHG
,就像执行一样,这意味着seq_cst
too
- 最后,
XRELEASE MOV [mem], op
就好像MOV [mem], op
,所以这只是release
(在 C++ 内存模型的通常实现下,顺序一致存储具有内存栅栏,而不是加载)
(文档链接适用于英特尔编译器。但是它们记录了硬件行为,因此这些信息应该适用于其他编译器。编译器可能引入的唯一变量是编译时重新排序。但是,我希望如果编译器实现内在的,它也会实现正确的重新排序禁止,如果仍然不确定,请设置编译器障碍。并且直接汇编应该相应地标记汇编代码)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)