【发布时间】:2016-08-30 16:12:34
【问题描述】:
英特尔 Nehalem 架构可实现的每周期最大指令数是否有估计值?此外,影响每个周期最大指令的瓶颈是什么?
【问题讨论】:
标签: x86 intel cpu-architecture nehalem
英特尔 Nehalem 架构可实现的每周期最大指令数是否有估计值?此外,影响每个周期最大指令的瓶颈是什么?
【问题讨论】:
标签: x86 intel cpu-architecture nehalem
TL:DR:
Intel Core、Nehalem 和 Sandybridge / IvyBridge:最多 5 个 IPC, 包括 1 个宏融合 cmp+branch 将 5 个指令放入 4 个融合域微指令,其余的是单微指令。 (其中最多 2 个可以是 micro-fused store 或 load+ALU。)
Haswell 高达第 9 代:使用两对 macro-fusable ALU+branch 指令和两条解码成两个潜在微融合微指令的指令可以实现每个周期最多 6 条指令。根据my testing on Skylake.,最大 unfused-domain uop 吞吐量为每时钟 7 uop。
早期的 P6 系列:Pentium Pro/PII/PIII 和 Pentium M。还有 Pentium 4:使用 3 条指令解码为 3 条微指令,每个周期最多可以实现 3 条指令。 (无宏融合,3-wide decode and issue)。
Sunny Cove 上的最大 IPC 可能为 7,这要归功于每时钟 5 uop 的前端带宽增加。
来源:Agner Fog's microarch pdf and instruction tables。另请参阅x86 标签 wiki。
Intel Core2 及更高版本中的乱序流水线可以在每个时钟发出/重命名 4 个融合域微指令。这就是瓶颈。 宏融合会将cmp / jcc 组合成一个微指令,但每个解码块只能发生一次。 (直到 Haswell)。
另外,解码(最多 4 条指令以 4-1-1-1 模式最多 7 条指令)是 SnB 系列中的 uop-cache 之前的另一个重要瓶颈。多指令必须在第一个“槽”中解码。有关 Nehalem 潜在瓶颈的更多信息,请参阅 Agner Fog 的微架构指南。
Nehalem InstLatx64 表明 nop 令人惊讶地只有 0.33c 吞吐量,而不是 0.25,但根据 https://www.uops.info/table.html 的结果,这是因为 nop 在 Sandybridge 之前的 CPU 中需要一个 ALU 执行单元。 Agner Fog 说他没有发现 Nehalem 的退休瓶颈。
即使您可以安排每 4 个微指令中不止一个宏融合对在一个循环中,Nehalem 的吞吐量也仅为每个时钟(端口 5)一个融合的测试和分支微指令。因此,即使其中一些没有被采用,它也不能在每个时钟维持一个以上的宏融合比较和分支。 (Haswell 可以在端口 0 或端口 6 上运行未采用的分支)。
;; Should run at one iteration per clock
.l:
mov edx, [rsi] ; doesn't need an ALU uop. A store would work here, too, but a NOP need an ALU port on Nehalem.
add eax, edx
inc rsi
cmp rsi, rdi ; macro-fuses
jb .l ; with this, into 1 cmp+branch uop
为了便于测试并消除缓存/内存瓶颈,您可以将其更改为每次都从同一位置加载,而不是在寻址模式下使用循环计数器。 (只要您避免因过多冷寄存器而导致寄存器读取停顿。)
请注意,Haswell 之前的 uarches 只有三个 ALU 端口。但是mov 加载或存储占用了管道带宽,因此拥有 4 宽的问题/重命名是有好处的。前端能够比乱序内核执行得更快也很有用,因此在调度程序中总是有一个工作缓冲区排队等待,因此它可以找到指令级并行性并尽早开始未来的负载,诸如此类。
我认为除了加载/存储(包括push/pop,感谢堆栈引擎)之外,fxchg 可能是 Nehalem 中唯一不需要 ALU 端口的融合域微指令。或者它实际上确实如此,比如nop。在 SnB 系列 uarches 上,xor same,same is handled in the rename/issue stage,有时还有 reg-reg movs(IvB 和更高版本)。 nop 也永远不会执行,这与 Nehalem 不同,因此 SnB/IvB 对 nop 的吞吐量为 0.25c,即使它们只有 3 个 ALU 端口。
【讨论】:
add 指令序列和两个宏可熔cmp/jcc 指令序列的循环进行了快速测试(始终不采用一个,始终采用一个用于循环控制)。 UOPS_ISSUED_ANY 显示每次迭代有 4 个微指令(确认宏融合有效),但吞吐量为每次迭代 1.7 个周期。我认为这表明 Haswell 每个周期只能进行一次宏融合,除非我遗漏了什么。