我如何获取计算机的 cpu 信息,即功能 units/latency 等

how do i get the cpu information for my computer i.e functional units/latency etc

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

我想知道 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

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

书中的延迟示例 table:

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

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

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

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


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

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

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


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

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

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

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

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

  • 整数 ALU(包括对 3 周期延迟操作的支持,如 imul 和 popcnt,不同于任何其他端口上的整数 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 单元来完成此操作。但是 addps 在 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 相互竞争执行端口/单元。不是 addpsfma...ps 是否实际上使用相同的晶体管。 (以及 https://agner.org/optimize/ 和供应商优化手册,以了解向这些执行单元提供管道工作的细节,并绕过它们之间的延迟。)

但是,了解 CPU 的工作原理当然很有趣。它偶尔与了解同一 CPU 系列的不同模型有何不同有关:

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

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

(许多 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 位 uops 在运行时,只有两个向量 ALU 端口处于活动状态。