Ale*_*iev 7 c++ memory-model language-lawyer intel-tsx
我认为 C++ 还没有涵盖任何类型的事务内存,但 TSX 仍然可以以某种方式将“好像规则”用于由 C++ 内存模型管理的东西。
那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?
说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“正常”的含义。
使用 HLE 可能可以将其视为“前一个操作发生在后续操作之前。好像该部分仍然由被省略的锁保护”。
RTM 是什么?由于甚至没有省略锁,只有(可能是非原子的)内存操作,可能是加载、存储、两者或无操作。什么与什么同步?在什么之前会发生什么?
显然,在进入规格或询问之前,我应该彻底阅读“概述”页面:
即使省略处理器没有对锁执行外部写操作,硬件也能确保锁上操作的程序顺序。如果省略处理器本身读取关键部分中锁的值,则看起来好像处理器已获取锁(读取将返回非省略值)。此行为使得 HLE 执行在功能上等同于不带 HLE 前缀的执行。
RTM 内存排序
成功的 RTM 提交会导致 RTM 区域中的所有内存操作看起来都是原子执行的。成功提交的 RTM 区域由 XBEGIN 后跟 XEND 组成,即使 RTM 区域中没有内存操作,也具有与 LOCK 前缀指令相同的排序语义。XBEGIN 指令没有防护语义。但是,如果 RTM 执行中止,则 RTM 区域内的所有内存更新都将被丢弃,并且永远不会对任何其他逻辑处理器可见。
完成答案:
LOCK带前缀的指令映射到 C++ std::memory_order::seq_cst。这涵盖了所有成功的 RTM 事务(就像单LOCK前缀指令)。它还涵盖了大多数 HLE 案例。具体来说:
LOCK执行带前缀的指令就像执行它们一样,这seq_cst也意味着XACQUIRE XCHG/也一样XRELEASE XCHG,就好像它被执行一样,这seq_cst也意味着XRELEASE MOV [mem], op就像MOV [mem], op,所以它只是release(在 C++ 内存模型的通常实现下,顺序一致存储具有内存栅栏,而不是加载)(文档链接适用于英特尔编译器。但是,它们记录了硬件行为,因此这些信息应该适用于其他编译器。编译器可能引入的唯一变量是编译时重新排序。但是,我希望如果编译器实现内在的,它也会实现正确的重新排序禁止,如果仍然不确定,请设置编译器障碍。并且直接汇编应该相应地标记汇编代码)