【问题标题】:How does restricted transactional memory / HTM works in detail?受限事务内存/HTM 是如何详细工作的?
【发布时间】:2021-07-21 08:43:35
【问题描述】:

我正在学习硬件事务内存(HTM),但它的详细实现是有限的。 我知道 HTM 中的事务缓冲其在 L1cache 中的读/写集,并通过缓存一致性协议检测冲突。下面是我学到的使用HTM的程序案例。

while (1) { // keep trying
    int status = _xbegin(); // set status = -1 and start transaction
    if (status == _XBEGIN_STARTED) { // status == XBEGIN_STARTED == -1
        (*a) ++; // non atomic increment of shared global variable
        (*b) ++;
        _xend(); // end transaction
        break; // break on success
    } else { //
        x_abort(0xff);
    } //
}

所以,我对“(*a)++”和“(*b)++”之间发生冲突时会发生什么感到困惑。说,T0增加a,而T1读a。缓存协议将检测到冲突并中止 T0。但是T0会发生什么?它会继续运行其余代码,即 (*b)++ 和 _xend() 吗?我认为它不会继续运行,而是会重试。但是它怎么知道循环的起点在哪里呢?这个具体是怎么实现的?

【问题讨论】:

    标签: c memory architecture cpu-cache transactional-memory


    【解决方案1】:

    _xbegin() 具有非常特殊的语义。如果成功使线程进入事务状态,则返回_XBEGIN_STARTED。进入事务状态有两件重要的事情:

    1. 在处理器上执行体系结构检查点。这实际上记录了架构寄存器和程序计数器的值。
    2. 内存操作变成推测性的。在事务完成之前看不到商店。这可以通过不同的方式实现,例如在本地缓存中缓冲存储或将值写入主内存,同时保留撤消日志。

    如果在某个时候该事务中止(在您的示例中,T0 由于与 T1 的读/写冲突而中止),首先丢弃所有推测性内存操作,然后恢复体系结构检查点。后者确保 PC 在 int status = _xbegin(); 之后立即开始,但这次返回值 _XABORT_CONFLICT

    您可以在博客文章Arm’s Transactional Memory Extension support in gem5 中找到有关硬件事务内存实现的一些信息。如果您对细节感兴趣,值得花一些时间阅读 gem5/Ruby 源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2016-09-08
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多