CPU如何重新排序指令

8

我最近了解了关于CPU指令重排序的有效性。但我无法理解CPU如何重新排序其指令。我的意思是编译时重新排序是可以想象的,因为编译器可以预见即将到来的代码。但对于一个按顺序读取指令的CPU,它如何看到即将到来的指令以便进行重新排序呢?


2
当你阅读一句话时,你会通过稍微往前看来预测接下来的单词,编程也是同样的道理。 - hobbs
1
它的读取速度比执行速度快,因此它可以看到即将到来的指令窗口。有关详细信息,请参阅x86 tag wiki中的一些链接,例如Agner Fog的微体系结构pdf,还有David Kanter对Intel Haswell设计的介绍。当然,如果您只是在谷歌上搜索“乱序执行”,您会发现维基百科文章,您应该阅读它。 - Peter Cordes
我的意思是,我不太了解汇编代码,但从我记得的来看,每个指令基本上都在内存中,因此,如果像上面所说,CPU可以比执行更快地读取,它只需遵循指令的内存位置并向前查找。这不是事实,只是我假设的一件事,我之前也没有想过。 - Giora Guttsait
我在另一个问题的答案中写了有关现代x86 CPU核心(如Haswell)如何通过乱序执行找到和利用指令级并行性的详细信息。 - Peter Cordes
2个回答

9

指令按程序顺序获取到指令队列中;从队列中解码并移动到保留站。这些保留站有效地进行重新排序:随着它们的参数可用,指令被分派到执行单元以进行执行,而所有参数可用的时间通常不对应于指令队列/内存中的顺序。

例如,使用Tomasulo算法,请参阅以下两个视频:

发射(和寄存器重命名): https://youtu.be/I2qMY0XvYHA?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs

Dispatch/reordering: https://youtu.be/bEB7sZTP8zc?list=PLAwxTw4SYaPkNw98-MFodLzKgi6bYGjZs


6
指令按顺序解码,但它们随后进入“正在进行中”的指令集合中。如果满足它们的依赖关系,指令可以向前推进。
例如,假设指令如下:
1. 从内存加载寄存器A。 2. 从内存加载寄存器B。 3. 对寄存器A进行递增。 4. 对寄存器B进行递增。
可能最后两个指令同时进行,如果寄存器B的内存读取先完成(也许已经在L1缓存中),那么寄存器B的递增将在寄存器A的递增之前发生。(当然,在该指令解码之后。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接