【问题标题】:Out of Order retirement of Store instruction存储指令的乱序退出
【发布时间】:2016-03-04 01:36:06
【问题描述】:

假设我们有两条指令 A店 B店 并且这两个映射到Cache中的两个不同的缓存行。 无论如何考虑缓存中的回写写分配策略,存储的无序退出(存储 B 超过 A)是否会有所帮助? 假设没有异常/中断,没有结构、控制、数据依赖或内存依赖,两条指令之间没有缓存冲突。

【问题讨论】:

  • 为了遵守顺序一致性模型,存储和加载需要退出的原因,这意味着,对于程序员在任何给定的时间点,内存应该看起来就像之前的指令当前的指令已经结束,年轻的还没有被执行。也就是说,宽松的一致性模型并不少见。此外,您为什么要重新安排退休?您之所以要退休,是为了确保在精确中断命中时您可以返回。
  • 提供精确异常的架构不能retire乱序的任何指令,只能执行。 (This paper about kilo-instruction processors talks about the issue, and alternatives to the traditional ROB with in-order retirement。例如,仅在某些指令下检查点架构状态。)。 @Rgarg:我认为你搞混了:在像 ARM 这样宽松的内存顺序架构上,单个线程仍然可以看到它的 自己的 内存操作按程序顺序发生。所以它不必围着自己的商店!
  • 您可能希望乱序执行,当 B 的地址计算可以在 A 的地址计算之前发生时,这是有道理的。
  • @PeterCordes,那么,您的意思是说,即使在宽松的内存顺序架构中,加载和存储也是按顺序出现在内存中的?那么有什么区别呢?谢谢。
  • @Rgarg:一个线程总是“看到”它自己的指令按程序顺序发生,但这并不意味着指令应该按顺序执行。乱序管道必须保证指令“似乎”按顺序发生。

标签: caching cpu-architecture


【解决方案1】:

假设您使用的是宽松的一致性模型并且两个商店之间没有围栏,那么非常简短的答案是商店可以“执行”无序,这可能有助于提高性能。存储通常在写入缓存之前写入写入队列(或存储队列)。写队列在物理上可以实现为队列、CAM、banked queue等。假设写队列中A应该写入的bank已满,那么处理器可能能够在之前将B写入另一个bank写 A。另一个例子是 B 的地址在 A 的地址之前计算得很好。请注意,如果需要(例如,当精确的异常发生时,处理器应该始终能够反转此操作(即,写入写入队列和缓存)) )。但我想这很难逆转,所以我认为这在实践中从未发生过。

话虽如此,请注意,每条指令(加载、存储、ALU 操作等)都是按顺序提交(退出)的,但这并不意味着指令应该按顺序执行。

【讨论】:

  • 问题是“退休”。您可能想补充一点,有趣的问题是商店是否可以执行乱序,这就是您要回答的问题。在真实硬件上,商店在现实生活中确实会乱序执行。或者至少变得无序在全球范围内可见,这不一定是同一件事。在 x86 上,您可以see them appear out of order with loads。可能对弱排序的 NT 商店进行类似的实验可以证明商店重新排序。
  • 编辑澄清事情。请给我指出一篇论文或技术说明,说实际上存储在真实硬件中“相对于存储”(我不是指负载)是无序执行的。我不是说它不存在,我不知道。
  • 对不起,我没有任何参考资料可以指向您。我做出如此强烈声明的理由是软件中的内存排序错误是真实存在的。如果商店在不能保证这一点的弱有序架构的实际实现中按顺序在全球范围内可见,我认为在正确设置围栏方面不会有这么大惊小怪的。我不认为只是 StoreLoad 重新排序应该归咎于 Linus Torvalds 所说的人们在尝试发明自己的锁定机制时总是引入的错误。
  • @Leeor - 我的观点是您在 TSO 上获得的“商店缓冲效应”需要StoreLoad 屏障并不是唯一的:即使商店“按顺序”从从 CPU 的角度来看,读取线程上的 负载不会重新排序(即,在读取端放置您想要的任何强屏障),您仍然可以看到来自 CPU A 的存储在某些架构上与 CPU B 顺序一致。例如,T1 进行两次存储 [x] = 1; [y] = 1T2 进行两次读取 y' = [y]; barrier; x' = [x] 您可以在 T2 上看到 x' ==0 and y' == 1。请注意,存储缓冲 ...
  • ... 或存储转发在这里并没有直接发挥作用,因为没有线程正在读取自己的存储,实际上没有线程同时进行存储和加载。我想我的观点是,商店是否按顺序在本地 executeretire 并不能告诉您太多关于如何使商店在外部可见,而商店缓冲不是与顺序一致性的唯一偏差:缓存行也可能是乱序获取的。至少在 PPC 上lwsync 不是无操作的,所以基本上我同意@PeterCordes 的观点,在某些硬件上可能需要StoreStore
【解决方案2】:

商店的无序退役有助于放松一致性模型。考虑两个线程并行执行的情况,如果您在 Store B 之前退出 Store A(乱序)并且线程 2 正在等待 A,它可以继续执行,而无需等待 B 在 A 之前写入。

也就是说,很难逆转,以防Store to B导致异常,因此我认为它在一般系统中没有多大用处。

【讨论】:

    【解决方案3】:

    我的观点是在回写和写分配策略的情况下,当存储指令未命中时,字节或字的新值必须等到从较低级别的内存层次结构中获取数据块。因此,由于缓存未命中,内存访问会使缓存停止。当完全没有例外时,存储的无序退出有助于实现内存级别的并行性。 (如果 B 商店按顺序退役而 A 商店未命中,则 B 商店必须等待)。 如果我们引入未命中状态处理寄存器 (MSHR) 作为高速缓存架构的一部分以释放高速缓存以进行新访问,那么即使在按顺序退出存储的情况下也可以实现这一点。这样的高速缓存将是非阻塞高速缓存。为高速缓存未命中分配 MSHR 以跟踪未命中的状态。这是软件预取和宽松一致性模型所必需的,以获得所需的性能优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多