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

我如何获取计算机的 CPU 信息,即功能单元/延迟等 你的书说 Haswell 有 8 个“功能单元”

如何解决我如何获取计算机的 CPU 信息,即功能单元/延迟等 你的书说 Haswell 有 8 个“功能单元”

我正在尝试学习汇编,在我正在阅读的书中,我遇到了教科书表格中显示功能单元及其延迟。

我想知道我的 cpu功能单元是什么,延迟是多少? 整数加法、整数乘法、单精度加法、单精度乘法和双精度乘法。

My cpu is AMD Ryzen 5 3600

我已经查看了这些链接https://www.amd.com/en/technologies/zen-core-3 https://en.wikichip.org/wiki/amd/microarchitectures/zen_3

但在我的处理器中找不到有关功能单元或其延迟的任何信息。

书中的延迟表示例:

example of the latency table from the book

intel core i7 Haswell 的功能单元信息示例:

example of functional units in intel core i7 Haswell

感谢任何帮助,谢谢!! :)

解决方法

Zen 3 只是 Zen 2 的增量变化,因此 Wikichip 没有重复架构细节部分。见https://en.wikichip.org/wiki/amd/microarchitectures/zen_2#Block_Diagram

对于延迟,在 https://uops.info/ 上,您可以看到哪些 ALU 指令是单微操作的,以及测量的延迟是什么。除非将固有的旁路延迟作为使用指令的唯一方式的一部分(例如可能在 pmovmskb 中),否则这些延迟与底层功能单元相同。


对于早期的微架构,包括 Intel 从 Core 2 到 Haswell 和 AMD K8/K10/Bulldozer,David Kanter 写了一些非常好的微架构深入研究。

阅读这些,尤其是 Sandy-bridge 和 Haswell,将有助于理解禅(因为有相似之处)。但请注意,Zen 甚至可以将内存目标 add [rdi],eax 解码为单个前端 uop,这与 Intel 不同,后者所需的加载和存储操作是单独的 uop,必须进行微融合才能挤过前端无需额外带宽。

但是 Bulldozer 就像 Zen 一样,为整数和 FP 执行单元拥有单独的调度程序队列。与 Intel 不同的是,它们在整数和 FP 之间不共享“端口”,因此这些操作不会在后端相互竞争。


你的书说 Haswell 有 8 个“功能单元”

这并不完全正确。英特尔 CPU 将执行单元分组到不同的端口上,但这并不意味着连接到/通过一个端口的所有执行单元都是一个大“功能单元”或执行单元的物理部分。

例如,Andy Glew(英特尔 P6 微架构的架构师之一)对 What is the "EU" in x86 architecture? (calculates effective address?) 发表评论说,“我没有深入了解共享起始端口和完成端口的专业 EU 组的复杂性,更不用说 RF 读写端口、灵活的延迟等了。当我在 1994 年左右为 P6 编写第一个版本时,在英特尔编译器编写者指南中解释这些问题已经足够困难了。"

Kanter 在 https://www.realworldtech.com/haswell-cpu/4/ 上的 SnB 和 HSW 图表显示了这一点

enter image description here

例如:端口 1 有三个独立的(组)执行单元通过它连接:

  • 整数 ALU(包括对 imul 和 popcnt 等 3 周期延迟操作的支持,与任何其他端口上的整数 ALU 不同)
  • SIMD FP ALU,具有 FMA/MULPS/PD(完全流水线化的 5 周期延迟)和单独的 ADDPS(3 周期延迟)。它们也会竞争写回/完成端口,因此计划将尽量避免在 MULPS 后两个周期在端口 1 上启动 ADDPS。
  • SIMD 整数 ALU,包括 blend、VPADDB 等

这三个执行单元(或执行单元组?)是单独转发域的一部分(因此,如果您对 SIMD-FP mulps 的输出进行 SIMD 整数移位,例如为了提取指数字段)。很可能 FP ALU 在物理上靠近 FP 寄存器文件,与整数单元分开。拥有单独的“域”还可以处理可能需要转发到什么的组合爆炸,以及信号的扇出。 (如果有很多东西需要读取同一条总线,则需要更强的信号才能将所有电容负载的电压驱动到逻辑 1 或逻辑 0。)

Skylake 放弃了单独的 SIMD-FP-add ALU,只在 FMA 硬件上运行它,延迟与 fma/mul 相同。 SIMD-FP add 很可能在 Haswell 中确实是一个单独的执行单元,而不仅仅是 FMA 单元的不同配置,否则您会期望他们会在端口 0 和 1 上使用 FMA 单元来实现这一点。但是 { {1}} 在 Haswell 上只有 1/clock 的吞吐量。 (相关:Why does Intel's Haswell chip allow floating point multiplication to be twice as fast as addition?

我不知道端口 1 上的整数 ALU 是否与 SIMD 的东西竞争写回。可能不是,因为整数和 FP 有不同的寄存器文件。不过,他们确实需要将 uop 标记为在 ROB(重新排序缓冲区)中执行完毕,并且 ROB 是统一的。 (不过,uop 可以 leave the RS (scheduler) soon after dispatch to an execution port;这不需要等待完成,只知道它的数据确实按预期准备好了,因此不需要重播。如果它正在读取,可能会发生这种情况加载的结果,结果显示加载未命中缓存,因此未准备好应对预期的延迟。)


幸运的是,港口与欧盟的区别大多只是“有趣的事实”

为了性能,您真的只需要知道来自 https://uops.info/ 的数字,以及哪些 uops 相互竞争执行端口/单元。与 addpsaddps 是否实际使用相同的晶体管无关。 (以及 https://agner.org/optimize/ 和供应商优化手册,以了解向这些执行单元提供工作的管道的详细信息,并绕过它们之间的延迟。)

然而,了解 CPU 的工作原理当然很有趣。它有时与了解同一 CPU 系列的不同型号有何不同有关:

Skylake-X(支持 AVX-512)有一个有趣的效果:当 512 位 uops 正在运行时,它会关闭端口 1 上的 SIMD ALU,将它们连接到一个 512 位 FMA 单元来处理来自端口的 uops 0.

但它并没有关闭整数 ALU:这是 popcnt / imul / lzcnt / slow-LEA 唯一可以执行的地方,它仍然可以运行 1 周期简单整数的东西。这是一个非常明确的例子,执行单元与端口分离,仅通过它们到达。

(许多 Skylake-AVX512 CPU 有第二个 512 位 FMA 单元连接到端口 5,它们可以为 512 位 uops 供电。一些 Xeon Bronze / Silver 没有。Ice Lake 笔记本电脑和 Rocket Lake 芯片没有; 512 位 FP add/mul/FMA 具有 1/clock 吞吐量,而不是每 0.5 个时钟 1。https://www.extremetech.com/computing/263963-intel-reverses-declares-skylake-x-cpus-two-avx-512-units 有一篇关于 Skylake-X 高端桌面芯片的简短文章,描述了机制。)

Agner Fog 还介绍了端口 1 的内容,以及在 his microarchitecture guide 中,当任何 512 位微指令运行时只有两个矢量 ALU 端口处于活动状态这一事实。

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