了解FMA表现

时间:2019-03-03 16:26:00

标签: c++ x86 fma

我想了解如何计算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条指令。

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

2 个答案:

答案 0 :(得分:5)

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

  • 由于前端瓶颈(DSB路径或MITE路径),前端在每个单个周期中提供的FMA联动数少于2。
  • FMA之间或与其他指令(可能是循环机制的一部分)之间存在数据依赖性。可以这样表示:每个RS周期中,准备就绪的FMA少于2个。延迟在存在依赖项时起作用。
  • 某些FMA正在使用内存操作数,如果在需要时在L1D高速缓存中找不到它们,则每个周期无法维持2个FMA的吞吐量。
  • 在实验过程中,核心频率小于3GHz。此因素仅影响每秒的吞吐量,而不影响每个周期。
  • 其他原因取决于循环的工作原理和测量吞吐量的方式。

答案 1 :(得分:2)

  

Latency = 4并且吞吐量(CPI)= 0.5,因此该指令的整体性能为4 * 0.5 =每条指令2个时钟。

仅计算出单位即可得出cycles²/instr,这很奇怪,我对此没有任何解释。

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

有一个相关的计算确实涉及等待时间和(相互)吞吐量,即等待时间和吞吐量的乘积:4 * 2 = 8(以“指令数”为单位)。这可以与网络理论中的带宽延迟乘积相比较,可以同时“运行”(启动但未完成)多少个独立的操作实例。该数字可用于某些代码设计决策,因为它是代码需要向CPU公开以充分利用计算资源的指令级并行度的下限。