微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该如何在笔记本电脑的CPU中查找流水线级数

如何解决我应该如何在笔记本电脑的CPU中查找流水线级数

我想研究最新的处理器与标准RISC V实现(RISC V具有5级流水线-获取,解码,内存,ALU和回写)有何不同,但无法找到如何开始解决该问题的方法,例如在处理器上找到流水线的当前实现方式

我尝试将Intel文档用于i7-4510U文档,但这并没有太大帮助

解决方法

据报道,Haswell的流水线长度为14个阶段(在一次uop-cache命中时),从L1i获取以进行传统解码时为19个阶段。找到它的唯一可行方法是从有关该微体系结构的文章中查找它。您无法精确测量它。


我们对英特尔和AMD CPU内部的很多了解都是基于供应商在芯片会议上的介绍,他们的优化手册和他们的专利。基准,但这与分支预测错误的惩罚有关。请注意,流水线执行单元每个都有自己的流水线,而内存流水线也有点独立。

您的CPU核心是Intel的Haswell微体系结构。参见David Kanter深入探讨其内部:https://www.realworldtech.com/haswell-cpu/

这是一个超标量的无序exec设计,而不是您正在考虑的像classic RISC这样的简单有序设计。 必读的背景知识:Modern Microprocessors A 90-Minute Guide!涵盖了cpu架构从简单的非流水线型到流水线型,超标量和无序执行的演变。

它在某些流水线阶段之间具有相当大的缓冲区,而不仅仅是一个简单的锁存器。它的分支预测效果很好,因此通常通过缓冲多个字节的机器代码来隐藏获取气泡更为有用。在任何地方都没有停顿的情况下,问题/重命名阶段是管道中最窄的点,因此阶段之间的前端缓冲区将趋于充满。 (据报道,在哈斯韦尔,每个时钟的uop缓存提取也只有4uops。Skylake将其扩展到6,最多可将整个uop缓存行读入IDQ。)


https://en.wikichip.org/wiki/intel/microarchitectures/haswell_(client) 将流水线长度报告为“ 14-19”个阶段,该长度从uop缓存提取或L1i缓存提取算起。 (Uop缓存命中会缩短管道的有效长度,从而减少解码。)https://www.anandtech.com/show/6355/intels-haswell-architecture/6说了同样的话。

https://www.7-cpu.com/cpu/Haswell.html还测量了uop缓存命中在15.0周期时的错误预测损失,uop缓存未命中(L1i缓存命中)在18-20周期时的误判损失。这与管道的 part 的长度有关。

请注意,后端中的实际执行单元都有各自的管道,例如端口0和1上的AVX FMA单元长5级。 (vmulps / vfma...ps在Haswell上有5个周期的延迟。)我不知道整个管道的14-19个周期长度是否将执行计为1个周期,因为典型的整数ALU指令如{ {1}}只有1个周期的延迟。 (和4 /时钟吞吐量。)诸如addimulpopcnt之类的较慢的整数ALU指令只能在端口1上执行,它们具有3个周期的延迟。

The store buffer还将存储对L1d缓存的提交与存储指令的执行完全脱钩。如果存储缓冲区中充满了一堆退休的高速缓存未命中的存储区,则这可能会对中断延迟产生影响。从ROB退休后,就不能将其丢弃,而必须肯定地发生。因此,它们将阻止由中断处理程序完成的任何存储提交,直到耗尽为止。或阻止任何序列化指令(包括bsf)退出; x86“序列化”指令定义为清空整个管道。

Haswell的存储缓冲区的大小为42个条目,并且假设没有高速缓存未命中,可以以1 /时钟提交到L1d高速缓存。或更多的缓存未命中。当然,存储缓冲区不是“管道” ,物理上它很可能是循环缓冲区,某些逻辑试图将头提交给L1d高速缓存读取。此逻辑与存储执行单元(将地址和数据写入存储缓冲区)完全分开。因此,从一般意义上讲,存储缓冲区的大小会影响耗尽“管道”所需的时间,但是就从获取到报废的连接阶段的管道而言,并不是真的。

即使是乱序的执行后端也可能有很长的依赖链在运行中,这将需要很长时间等待。例如一连串iret指令可能是您排队最慢的事情。 (每单位最大延迟)。例如就像在此Meltdown exploit example中一样,需要为故障后的投机执行创建长长的阴影。 **因此,耗尽后端的时间可能比“流水线长度” 长得多。。(但是与存储缓冲区不同,这些uops可以简单地在中断,恢复到一致的退出状态。)

(还与较长的dep链有关:Are loads and stores the only instructions that gets reordered?Understanding the impact of lfence on a loop with two long dependency chains,for increasing lengths


没有一种简单的方法可以从微基准测试中分辨出来。

管道长度并不是真正有意义的。与流水线长度相关的与性能相关的特征是分支预测错误。参见What exactly happens when a skylake CPU mispredicts a branch?。 (而且我想这也是I缓存未命中代价的一部分;数据从核外到达后多长时间可以使后端开始执行任何操作。)由于乱序执行和快速恢复,分支错误预测有时会成为代价在后端部分与缓慢的“实际工作”重叠。 Avoid stalling pipeline by calculating conditional early

人们通常试图实际衡量的是分支错误预测惩罚。如果您感到好奇,https://www.7-cpu.com/是开源的。您可以看看他们的测试代码。

sqrtsd耗尽无序的后端,除了管道的长度之外,还有未知数量的开销,因此您不能仅仅使用它。您可以制作一大块仅靠背lfence来测量围栏吞吐量,但是在围栏之间什么也没有,我们每4.0个周期只能得到大约1个;我猜是因为不必序列化已经按顺序排列的前端。 https://www.uops.info/table.html

lfence本身的运行速度很慢,这使得编写微基准测试成为一个额外的挑战。通常,您必须将内容放入循环或展开的块中并运行多次,以使计时开销可以忽略不计。


RISC-V不必是5级

标准RISC-V实现包括未流水线内核,2级,3级和5级流水线内核以及乱序实现。 (https://riscv.org//wp-content/uploads/2017/05/riscv-spec-v2.2.pdf)。

它没有必须实现为classic 5-stage RISC,尽管这将使其非常类似于经典的MIPS,并且在教授CPU体系结构和流水线方面是正常的。

请注意,经典RISC管道(具有1个内存阶段,并且地址计算在EX中完成)需要1个周期的L1d访问延迟,因此,它不太适合具有高时钟和大缓存的现代高性能设计。例如Haswell的L1d加载延迟为4或5个周期。 (有关四周期特例快捷方式的更多信息,请参见Is there a penalty when base+offset is in a different page than the base?,该快捷方式会猜测最终地址以与地址生成并行地启动TLB查找。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。