了解 FMA 性能

Understanding FMA performance

我想了解如何计算 FMA 性能。如果我们查看此处的描述:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_fmadd_ps&expand=2520,2520&techs=FMA

对于 Skylake 架构,指令有 Latency=4Throughput(CPI)=0.5,因此指令的整体性能是每条指令 4*0.5 = 2 个时钟。

据我了解,如果最大(turbo)时钟频率为 3GHz,那么对于单个内核,我可以在一秒钟内执行 1 500 000 000 条指令。

对吗?如果是这样,我观察到性能略高的原因可能是什么?

0.5 的吞吐量意味着处理器每个周期可以执行两个独立的 FMA。因此在 3GHz 时,最大 FMA 吞吐量为每秒 60 亿次。你说你只能达到略大于 1.5B 的吞吐量。这可能是由于以下一种或多种原因造成的:

  • 由于前端瓶颈(DSB 路径或 MITE 路径),前端每个周期交付的 FMA 微指令少于 2 个。
  • FMA 之间或与其他指令之间存在数据依赖性(这可能是循环机制的一部分)。这可以换句话说如下:每个单个周期在 RS 中准备好的 FMA 少于 2 个。当存在依赖关系时,延迟就会发挥作用。
  • 一些 FMA 正在使用内存操作数,如果在需要时在 L1D 缓存中找不到它们,则无法维持每个周期 2 个 FMA 的吞吐量。
  • 核心频率在实验过程中变得小于3GHz。此因素仅影响每秒的吞吐量,而不影响每个周期。
  • 其他原因取决于您的循环的工作方式和您测量吞吐量的方式。

Latency=4 and Throughput(CPI)=0.5, so the overall performance of the instruction is 4*0.5 = 2 clocks per instruction.

仅计算单位就得到 cycles²/instr,这很奇怪,我无法解释它。

此处列出的吞吐量实际上是倒数吞吐量,以 CPI 表示,即每条指令 0.5 个周期或每个周期 2 个指令。这些数字是相互关联的,延迟与它无关。

有一个相关的计算涉及延迟和(倒数)吞吐量,即延迟和吞吐量的乘积:4 * 2 = 8(以"number of instructions"为单位)。这是多少个独立的操作实例可以同时"in flight"(开始但未完成),与网络理论中的带宽延迟乘积相当。这个数字通知了一些代码设计决策,因为它是代码需要暴露给 CPU 以使其充分利用计算资源的指令级并行量的下限。