【发布时间】:2015-03-26 06:42:40
【问题描述】:
众所周知,英特尔 x86_64 处理器不仅是流水线架构,而且还是超标量。
这意味着 CPU 可以:
-
管道 - 在一个时钟,执行一个操作的某些阶段。例如,两个 ADD 与阶段移位并行:
- 添加(stage1) -> 添加(stage2) -> 没有
- 什么都没有 -> ADD(stage1) -> ADD(stage2)
-
超标量 - 在一个时钟执行一些不同的操作。例如,ADD 和 MUL 在同一阶段并行:
- 添加(stage1) -> 添加(stage2)
- MUL(stage1) -> MUL(stage2)
这是可能的,因为处理器有多个指令调度程序(英特尔酷睿有 4 个简单解码器)。
但是只有调度器的副本(4个简单解码器),还是算术单元的副本?
即例如,我们可以在同一个 CPU-Core 上的独立运算单元(例如,端口 0 上的 ALU 和端口 1 上的 ALU)上执行两个 ADD 吗? p>
- ADD1(stage1) -> ADD1(stage2)
- ADD2(stage1) -> ADD2(stage2)
是否存在能够在同一时钟执行两条相同指令的任何执行单元的副本?
【问题讨论】:
-
前提是两个操作是数据无关的,没有限制。这里有一些有趣的细节(幻灯片 9):cis.upenn.edu/~milom/cis371-Spring09/lectures/…
-
optimized本质上是通过使用超标量来优化的,因为有 4 个独立计算流。流水线可以通过将指令分解为基本操作来优化一个指令流。请记住,执行指令可以(大致)分解为:获取、解码、加载数据、计算、存储结果。因此,您可以在解码指令 i+1 的同时执行指令 i 的算术运算,同时获取指令 i+2,例如...吞吐量,而不是单独的指令。 -
解码器不是调度器。他们只是解码数据并将其发送到乱序机器(从 RAT/ROB 开始)。调度是保留站 (RS) 为选择准备好的操作并将它们发送到执行而执行的操作。这与解码完全解耦(即 - 它不会在固定数量的周期后完成) - 它不是一条长管道。
-
不,这取决于操作的类型,以及确切的处理器微架构。 SandyBridge 与 Haswell 不同,依此类推。您显示的图表(看起来像 Merom?)显示端口 0、1 和 5 支持 ALU 操作,因此每个周期可以执行 3 个。也许有一些聪明的你也可以使用内存地址端口进行简单的算术运算,
LEA,这增加了一些额外的带宽。 -
内存端口是为特定操作保留的——你有一个用于加载,一个用于存储(因为存储需要每个存储的地址和数据端口)。另请注意,解码器宽度会将您的可持续带宽限制为它可以发出的每个周期 4 条指令(在最好的情况下,没有人保证所有 4 条指令都可以在每个周期中工作),因此使您的 ALU 端口潜力饱和并不容易。不过,现代 CPU 不必依赖解码器(Sandy Bridge 添加了解码的 uop 缓存)
标签: x86 cpu x86-64 intel cpu-architecture