有关此类管道详细信息,请参阅Agner Fog's microarch guide。 https://www.realworldtech.com/haswell-cpu/ 以及带有框图的 Haswell 的 uarch 深入研究。 (以及 David Kanter 关于其他 uarches 的一些文章的链接,例如 SnB 和 Core2,以及 AMD Bulldozer 和 K8。)还有https://stackoverflow.com/tags/x86/info中的其他链接
是的,现代 x86 内核是超标量乱序执行。自 PPro 以来,基本原理没有改变:将 x86 机器代码解码为可由 ROB + RS 调度的微操作 (uop)。
(术语:Intel 使用“issue”表示“复制到乱序后端”,“dispatch”表示“从调度程序发送到执行单元”,分配资源并更新 RAT . 在计算机架构领域的其他许多领域,人们使用相反的术语。)
Intel 因为 Core 2 在问题/重命名/分配阶段是 4 微秒宽的超标量,是最窄的瓶颈。(在此之前,PPro 到 Pentium-M,它是 3 宽。)核心2 在实践中很少能维持这一点,因为有太多其他瓶颈。 Skylake 通常可以在高吞吐量代码中非常接近。
为了在每个融合域 uop 中进行更多工作,需要将 ALU uop 与其内存源负载进行微融合。和例如的宏观融合cmp/test + jcc 所以比较和分支指令一起解码为一个微指令。 (请参阅 Agner Fog 的微架构指南)。这包括您的 Kaby 或 Coffee Lake CPU。最大未融合域持续吞吐量为每时钟 7 微秒,achievable in practice on Skylake。在突发中,调度程序可以向每个端口发送微指令。
Ice Lake(Sunny Cove uarch)将发行阶段扩大到 5。
AMD Zen 的宽度是 6 uop,但只有 5 个 指令 宽度,所以它在运行至少一些 2-uop 指令时只能达到 6 uops/clock。例如256 位 AVX SIMD 指令,将其解码为 2 个 128 位的一半(或更差的车道交叉洗牌)。
Skylake 将传统解码器扩展至 5 uop/时钟,uop 缓存获取扩展至 6 uop/时钟,高于 Broadwell 的 SnB 中的 4/时钟。这在更多时间隐藏了前端气泡,并在高吞吐量代码中使问题/重命名阶段在更多时间以每时钟 4 uop 的速度提供。 (阶段之间有缓冲区/队列,例如提供问题/重命名阶段的 64 uop IDQ。)
这包括您的 Kaby 或 Coffee Lake CPU:微架构上,KBL 中的 IA 内核与 SKL 相同,Coffee Lake 是一个非常小的调整(修复了 SKL 在微码更新中必须禁用的循环缓冲区,因为部分-注册合并 uop 错误,又名 CPU 错误)。 KBL 和 CFL 的 GPU 比 SKL 好,但 x86 内核基本相同。
是的,对于大多数代码来说,超过 3 或 4 宽的回报会递减,但 SMT 让宽核心可以同时在两个(或 4 或 8 个)执行线程中找到 ILP。这使得更宽的内核不会被浪费,但内核的成本比宽度线性扩展更多,因此只有在有时单个线程可以使用大部分宽度时才这样做。否则,您只会构建更多更小的内核。 (至少如果您有更多内核的可扩展互连......)我在电子产品上的Why not make one big CPU core? 上的回答有更多关于权衡和实际工作负载中可用的有限 ILP 的详细信息。