如何使用带有 C++ 内存模型的 Intel TSX?

2024-01-30

我认为 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(使用前将#替换为@)

如何使用带有 C++ 内存模型的 Intel TSX? 的相关文章

随机推荐