英特尔内在函数中的延迟与吞吐量

Jim*_*mbo 3 performance x86 sse intrinsics micro-optimization

我认为我对延迟和吞吐量之间的差异有一个很好的理解.但是,对于Intel Intrinsics来说,延迟对指令吞吐量的影响并不清楚,特别是在顺序(或几乎顺序)使用多个内部调用时.

例如,让我们考虑一下:

_mm_cmpestrc
Run Code Online (Sandbox Code Playgroud)

它的延迟为11,Haswell处理器的吞吐量为7.如果我在一个循环中运行这个指令,那么在11个循环后我会得到一个连续的每循环输出吗?由于这需要一次运行11条指令,并且因为我的吞吐量为7,所以我是否会用完"执行单元"?

我不确定如何使用延迟和吞吐量,除了得到一条指令相对于不同版本的代码需要多长时间的印象.

Pet*_*des 9

有关CPU性能的更完整图片,请参阅Agner Fog的微体系结构指南和说明表.(他的优化C++和优化装配指南也非常出色).另请参阅标记wiki 中的其他链接,尤其是英特尔的优化手册.

有关分析短代码序列的示例,请参阅


单个指令的延迟和吞吐量实际上不足以为使用混合向量指令的循环获得有用的图像.这些数字并不能告诉您哪些内在函数(asm指令)相互竞争吞吐量资源(即它们是否需要相同的执行端口).它们仅适用于超级简单的循环,例如加载/执行一件事/存储,或者例如将数组与_mm_add_ps或相加_mm_add_epi32.

您可以使用多个累加器来获得更多的指令级并行性,但是您仍然只使用一个内部函数,因此您确实有足够的信息可以看到例如Skylake之前的CPU只能维持_mm_add_ps每个时钟一个的吞吐量,而SKL可以启动两个每个时钟周期(每0.5c一个的倒数吞吐量).它可以在其完全流水线化的FMA执行单元上运行ADDPS,而不是只有一个专用的FP-add单元,因此吞吐量更好但延迟时间比Haswell(3c lat,每1c输出一个)更差.

由于_mm_add_psSkylake的延迟时间为4个周期,这意味着8个矢量FP添加操作可以同时进行.因此,您需要8个独立的向量累加器(最后将它们相互添加)以暴露出那么多的并行性.(例如,使用8个单独的__m256 sum0, sum1, ... 变量手动展开循环.编译器驱动的展开(编译-funroll-loops -ffast-math)通常使用相同的寄存器,但循环开销不是问题).


这些数字也忽略了英特尔CPU性能的第三个主要方面:融合域uop吞吐量. 大多数指令解码为单个uop,但有些指令解码为多个uop.(特别是_mm_cmpestrc你提到的SSE4.2字符串指令:PCMPESTRI在Skylake上是8 uops).即使任何特定的执行端口没有瓶颈,你仍然可以阻止前端保持无序核心工作的能力.英特尔Sandybridge系列CPU每个时钟最多可以发出4个融合域uop,实际上通常可以在没有发生其他瓶颈时接近.(请参阅在执行uop计数不是处理器宽度倍数的循环时性能是否降低?对于不同循环大小的一些有趣的最佳情况前端吞吐量测试.)由于加载/存储指令使用与ALU指令不同的执行端口,因此可以L1缓存中数据热时的瓶颈.

除非你看看编译器生成的asm,否则你不会知道编译器必须使用多少额外的MOVDQA指令来在寄存器之间复制数据,以解决这样一个事实,即如果没有AVX,大多数指令都会替换它们的第一个源寄存器.结果.(即破坏性的目的地).您也不会知道循环中任何标量操作的循环开销.


我想我对延迟和吞吐量之间的区别有一个很好的理解

你的猜测似乎没有意义,所以你肯定错过了一些东西.

CPU是流水线的,其中的执行单元也是如此."完全流水线"执行单元可以在每个周期开始新操作(吞吐量=每个时钟一个)

  • (倒数)吞吐量是当没有数据依赖性迫使它等待时操作可以开始的频率,例如,该指令每7个周期一个.

  • 延迟是一个操作的结果准备好所需的时间,并且通常只有当它是循环携带的依赖链的一部分时才有意义.

    如果循环的下一次迭代独立于前一次运行,则无序执行可以"远远地"看到前两次迭代之间找到指令级并行性并保持自身忙碌,仅限于吞吐量.


(没有完全编辑,稍后会整理一下.)

  • 我不能强调足够的阅读彼得链接关闭顶部的引导,尤其是[汇编优化(http://www.agner.org/optimize/optimizing_assembly.pdf)指南 - 它会在几个工作的例子,显示*确切*这是如何工作的 - 并回答你甚至还不知道的问题.不要被愚弄 - 你可能会"写在C/C++",但使用内联函数时,它比C更接近组件(和你应该知道组装反正检查编译器还没有做任何可怕的 - 它常常). (3认同)

归档时间:

查看次数:

1419 次

最近记录:

7 年,6 月 前