x86内存排序:使用早期存储和内部处理器转发重新排序的负载

 莎ss侄莎 发布于 2023-02-06 18:11

我试图理解英特尔系统编程指南的 8.2节(PDF格式的第3卷).

特别是,我看到两种不同的重新排序方案:

8.2.3.4载荷可以与较早的商店重新排序到不同的地点

8.2.3.5允许处理器内转发

但是,我不明白这些场景与可观察效果POW之间的区别.这些部分提供的示例似乎可以互换.8.2.3.4例子可以通过8.2.3.5规则以及它自己的规则来解释.反之亦然,对我来说也是如此,尽管在那种情况下我并不确定.

所以这是我的问题:有没有更好的例子或解释8.2.3.4的可观察效果与8.2.3.5的可观察效果有何不同?

1 个回答
  • 8.2.3.5如果您希望内存排序严格干净,即使您承认8.2.3.4允许加载与不同地址的存储重新排序,那么示例应该是"令人惊讶的" .

       Processor 0      |      Processor 1
      --------------------------------------
       mov [x],1        |      mov [y],1
       mov R1, [x]      |      mov R3,[y]
       mov R2, [y]      |      mov R4,[x]
    

    请注意,关键部分是中间新添加的负载都返回1(存储到负载转发使得在uarch中可以实现这一点而不会停止).因此从理论上讲,您可以预期这两个存储都会在这些负载完成时被全局"观察"(这可能是顺序一致性的情况,其中存储和所有核心之间存在唯一的排序).

    然而,稍后R2 = R4 = 0作为有效结果证明事实并非如此 - 实际上商店首先在本地观察.换句话说,允许这种结果意味着处理器0将存储视为time(x) < time(y),而处理器1则看到相反的情况.

    这是关于该存储器模型的一致性的非常重要的观察,前面的例子没有证明.这种细微差别是顺序一致性和总存储排序之间的最大区别- 第二个例子打破了SC,第一个没有.

    2023-02-06 18:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有