如何使用英特尔TSX与C++内存模型



我认为C++还没有涵盖任何类型的事务内存,但TSX仍然可以以某种方式将使用">就好像规则"融入到由C++内存模型控制的东西中。

那么,成功的HLE操作或成功的RTM交易会发生什么呢?

说"有数据竞赛,但还好"并没有多大帮助,因为它并没有澄清"还好"的含义。

对于HLE,它可能可以被视为"前一次操作发生在后一次操作之前。就好像该部分仍然由被取消的锁保护"。

RTM是什么?由于甚至没有消隐锁,所以只有(可能是非原子的(内存操作,这些操作可以是加载、存储,也可以是两者都有,或者没有。什么与什么同步?之前会发生什么?

显然,在进入规范或询问SO之前,我应该彻底阅读"概述"页面:

硬件锁Elision概述

硬件确保锁上操作的程序顺序,甚至尽管删除处理器没有执行外部写入操作锁。如果删除处理器本身读取锁定在关键部分,它将显示为处理器获取了锁(读取将返回未消隐的值(。这行为使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++内存模型的通常实现下,顺序一致的存储具有内存围栏,而不是加载(

(文档链接是针对英特尔编译器的。但是,它们记录硬件行为,因此信息应该适用于其他编译器。编译器可能引入的唯一变量是编译时重新排序。但是,我希望如果编译器实现了内部,它也实现了适当的重新排序禁止,如果仍然不确定,则设置编译器障碍只需相应地标记装配代码(

最新更新