Gau*_*shi 0 x86 pipeline intel cpu-architecture microbenchmark
我想研究最新的处理器与标准 RISC V 实现(RISC V 具有 5 级管道 - 提取、解码、内存、ALU、回写)有何不同,但无法找到我应该如何开始解决问题以找到当前处理器流水线的实现
我尝试参考 i7-4510U 文档的英特尔文档,但没有太大帮助
据报道,Haswell 的管道长度为 14 级(在 uop 缓存命中时),从 L1i 获取用于传统解码时为 19 级。找到它的唯一可行方法是从有关该微体系结构的文章中查找它。你不能准确地测量它。
我们对 Intel 和 AMD CPU 内部结构的了解很多都是基于供应商在芯片会议上的演讲、他们的优化手册和他们的专利。 你不能真正用基准来衡量它,但它与分支错误预测惩罚有关。请注意,流水线执行单元每个都有自己的流水线,内存流水线也有点独立。
您的 CPU 内核是 Intel 的 Haswell 微架构。请参阅 David Kanter 对其内部结构的深入探讨:https : //www.realworldtech.com/haswell-cpu/。
这是一个超标量乱序 exec 设计,而不是像您正在考虑的经典 RISC那样简单的有序。 必需的背景阅读:现代微处理器 90 分钟指南!涵盖了 cpu 架构从简单的非流水线到流水线、超标量和乱序执行的演变。
它在一些流水线级之间有相当大的缓冲区,而不仅仅是一个简单的锁存器;它的分支预测效果很好,以至于通过缓冲多个字节的机器代码来隐藏提取气泡通常更有用。任何地方都没有停顿,问题/重命名阶段是管道中最窄的点,因此阶段之间的前端缓冲区将趋于填满。(在 Haswell 中,据报道,uop-cache fetch 每个时钟也只有 4 uop。Skylake 将其扩大到 6,最多可以将整个 uop 缓存线读入 IDQ。)
https://en.wikichip.org/wiki/intel/microarchitectures/haswell_(client) 将管道长度报告为“14-19”阶段,从 uop-cache fetch 或 L1i cache fetch 开始计数。(Uop 缓存命中缩短了管道的有效长度,减少了解码。) https://www.anandtech.com/show/6355/intels-haswell-architecture/6说同样的话。
另外https://www.7-cpu.com/cpu/Haswell.html测量了 15.0 个周期的 uop 缓存命中和 18-20 个周期的 uop 缓存未命中(L1i 缓存命中)的误预测惩罚。这与部分管道的长度相关。
请注意,后端中的实际执行单元每个都有自己的管道,例如端口 0 和 1 上的 AVX FMA 单元各有 5 个阶段长。(vmulps
/ vfma...ps
。延迟上的Haswell 5个循环的)我不知道14是否-整个管道的19周期长度被计数作为执行1个周期,因为典型的整数ALU指令喜欢add
只具有1个周期的延迟。(和第4 /时钟的吞吐量。)较慢的整数ALU指令喜欢imul
,popcnt
和bsf
只能在端口1,在那里它们有3个周期的等待时间执行。
存储缓冲区还将存储提交到 L1d 缓存与存储指令的执行完全分离。如果存储缓冲区充满了一堆已停用的缓存未命中存储,则这可能会对中断延迟产生影响。从 ROB 退休,他们不能被丢弃,而且必须发生。所以他们会阻止中断处理程序完成的任何存储提交,直到它们耗尽。或者阻止任何序列化指令(包括iret
)退出;x86“序列化”指令被定义为清空整个管道。
Haswell 的存储缓冲区有 42 个条目,并且假设没有缓存未命中,可以以 1/clock 的速度提交到 L1d 缓存。或更多缓存未命中。当然,存储缓冲区不是“管道”,物理上它可能是一个循环缓冲区,它被一些试图将头部提交到 L1d 缓存的逻辑读取。该逻辑与存储执行单元(将地址和数据写入存储缓冲区)完全分离。因此,存储缓冲区的大小会影响一般意义上排空“管道”所需的时间,但就从获取到退出的连接阶段的管道而言,情况并非如此。
即使是乱序执行后端也可能有一个非常长的依赖链,需要很长时间才能等待。例如,sqrtsd
指令链可能是您排队的最慢的事情。(每微操作最大延迟)。例如,在这个Meltdown 漏洞利用示例中,需要为故障后的推测执行创建一个长阴影。**所以后端排空的时间可能比“管道长度”要长得多。 (但与存储缓冲区不同,这些 uops 可以在中断时简单地丢弃,回滚到一致的退休状态。)
(也与长 dep 链相关:加载和存储是唯一被重新排序的指令吗?和了解 lfence 对具有两个长依赖链的循环的影响,以增加长度)
管道长度并没有真正的直接意义。与流水线长度相关的性能相关特征是分支错误预测惩罚。请参阅当 Skylake CPU 错误预测分支时究竟会发生什么?. (我猜也是 I-cache 未命中惩罚的一部分;数据从核外到达多长时间后,后端可以开始执行任何操作。)由于乱序执行和快速恢复,分支错误预测惩罚有时可能是部分与后端缓慢的“实际工作”重叠。 通过提前计算条件来避免停顿管道
人们通常试图实际衡量的是分支错误预测惩罚。如果您好奇,https://www.7-cpu.com/是开源的。你可以看看他们的测试代码。
lfence
排空乱序后端会产生未知数量的开销,而不仅仅是管道的长度,因此您不能只使用它。你可以制作一个大块的背靠背lfence
来测量围栏吞吐量,但是围栏之间没有任何东西,我们每 4.0 个周期大约会得到 1 个;我猜是因为它不必序列化已经有序的前端。 https://www.uops.info/table.html。
而且rdtsc
它本身很慢,这使得编写微基准成为一个额外的挑战。通常,您必须将内容放入循环或展开的块中并多次运行,以便时间开销可以忽略不计。
标准 RISC-V 实现包括一个非流水线内核、2、3 和 5 级流水线内核,以及一个乱序实现。(https://riscv.org//wp-content/uploads/2017/05/riscv-spec-v2.2.pdf)。
它不具有被实现为经典的5级RISC,虽然这将使它非常像经典的MIPS和将正常教学CPU架构和流水线。
请注意,经典 RISC 流水线(具有 1 个内存阶段,地址计算在 EX 中完成)需要 1 个周期的 L1d 访问延迟,因此这不太适合具有高时钟和大缓存的现代高性能设计。例如,Haswell 的 L1d 加载延迟为 4 或 5 个周期。(有关4 周期特殊情况快捷方式的更多信息,请参阅当基址 + 偏移量位于与基址不同的页面时是否有惩罚?在该快捷方式中,它猜测最终地址以与地址生成并行开始 TLB 查找。)
归档时间: |
|
查看次数: |
729 次 |
最近记录: |