【问题标题】:Understanding FMA performance了解 FMA 性能
【发布时间】:2019-07-25 01:01:48
【问题描述】:

我想了解如何计算 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 个时钟。

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

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

【问题讨论】:

    标签: c++ x86 fma


    【解决方案1】:

    Latency=4 和 Throughput(CPI)=0.5,因此指令的整体性能是 4*0.5 = 每条指令 2 个时钟。

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

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

    有一个相关的计算确实涉及延迟和(倒数)吞吐量,即延迟和吞吐量的乘积:4 * 2 = 8(以“指令数”为单位)。这是操作的多少个独立实例可以同时“进行中”(开始但未完成),与网络理论中的带宽延迟产品相当。这个数字为一些代码设计决策提供了依据,因为它是代码需要向 CPU 公开的指令级并行量的下限,以便它充分利用计算资源。

    【讨论】:

    • “飞行中”是“活跃”的常用术语。
    【解决方案2】:

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

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

    【讨论】:

    • 您提到“当存在依赖关系时,延迟会发挥作用”。因此,如果没有依赖关系,那么性能仅取决于整个过程?
    • @noonespecial 延迟很重要的情况之一是存在数据依赖关系时。当有两个 FMA 依赖链时,您的计算 4*0.5 = 2 有效。
    • @noonespecial:related:Why does mulss take only 3 cycles on Haswell, different from Agner's instruction tables? 了解更多关于延迟与吞吐量和多个依赖链的信息。
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多