【问题标题】:How to use Intel TSX with C++ memory model?如何将 Intel TSX 与 C++ 内存模型一起使用?
【发布时间】:2020-08-03 18:12:45
【问题描述】:

我认为 C++ 还没有涵盖任何类型的事务内存,但 TSX 仍然可以使用“as if 规则”以某种方式适应由 C++ 内存模型管理的东西。

那么,成功的 HLE 操作或成功的 RTM 事务会发生什么?

说“存在数据竞争,但没关系”并没有多大帮助,因为它没有阐明“ok”的含义。

使用 HLE 可能可以将其视为“先前的操作发生在后续操作之前。就好像该部分仍然被被省略的锁所保护”。

RTM 是什么?因为甚至没有省略的锁,只有(可能是非原子的)内存操作,可以是加载、存储、两者,或无操作。什么与什么同步?在什么之前会发生什么?

【问题讨论】:

  • 事务性内存 TS 暂时被搁置,因为它仍然“太小众”。就标准 C++ 而言,英特尔 TSX 只是未定义行为。具体实现可能有实现指定的行为;我会先检查 icc。
  • 由于编译器为 TSX(HLE 和 RTM)提供了内在函数,我希望他们有一些理智的东西。所以我认为这个“理智的东西”可以映射到内存模型中。
  • 我还认为,即使在正式标准功能之前,事务内存作为可选实现细节也有一些有用的案例。例如,参见std::call_once 的实现,它大部分时间都是从单个线程调用的,因此很可能受益于 HLE 省略的锁(当然,状态之间的转换是在潜在的省略锁下,而不是用户回调) .或者甚至可能是 shared_ptr 复制计数器,它们主要在单个线程中复制。

标签: c++ language-lawyer memory-model intel-tsx


【解决方案1】:

显然,在进入规范或询问之前,我应该仔细阅读“概述”页面:

Hardware Lock Elision Overview

硬件保证程序对锁的操作顺序,即使 虽然省略处理器没有执行外部写操作 到锁。如果省略处理器本身读取 锁定在临界区,它看起来好像处理器有 获得锁(读取将返回非省略值)。这 行为使 HLE 执行在功能上等同于 不带 HLE 前缀的执行。

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
  • XACQUIRE XCHG/XRELEASE XCHG也一样,好像被执行了,这也暗示seq_cst
  • 最后,XRELEASE MOV [mem], op 就像MOV [mem], op,所以它只是release(在 C++ 内存模型的通常实现下,顺序一致的存储有内存栅栏,而不是加载)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 2020-03-30
    • 2012-12-12
    • 1970-01-01
    • 2021-06-26
    • 2015-04-19
    • 2011-01-04
    • 2023-03-17
    相关资源
    最近更新 更多