CLMUL是恒定时间吗?

ybe*_*man 2 x86 assembly micro-optimization galois-field

进位乘法指令是否在恒定时间内运行?换句话说,是独立于其参数执行所需的时间吗?

Pet*_*des 5

根据https://agner.org/optimize/,并且PCLMULQDQ在任何给定的CPU上都有固定的延迟.(http://www.uops.info/table.html没有列出延迟,但对大多数指令都有好处).

没有理由期望它依赖于数据 - 通常只有division/sqrt在现代高性能CPU中具有数据相关的性能.常规乘法不会:相反,它们只是使执行单元内部具有大量硬件并行性的一般情况下快速.

当uops具有固定的延迟时,无序指令调度会更容易,因此为它们构建完全流水线的执行单元也是如此.调度程序(保留站)可以避免在同一端口上同时完成2个操作并产生回写冲突.或者更糟糕的是,在同一个执行单元中并导致其中的停顿.这就是固定延迟非常常见的原因.

(pclmulqdq具有分支的微编码多uop 可能具有可变延迟,或者更可信的延迟,这取决于立即操作数:当立即数为非零时,可能是额外的混合uop或两个.因此单个uop参数的固定延迟不一定适用于微编码指令,但pclmuqdq仍然很简单,你不会期望它实际上在内部分支rep movsb必须.)


正如@fuz指出的那样,PCLMUL是为加密而制作的,因此数据相关的性能会使它容易受到时序攻击. 所以有一个非常强大的理由让PCLMUL保持恒定时间.(或者在最坏的情况下,依赖于立即数,但不依赖于寄存器/存储器源.例如,除了0可能需要额外的移位uop以使得源的高半部分被馈送到64x64 => 128无进位乘法单元之外.)


来自Agner Fog表的数字

从Broadwell开始,英特尔pclmuludq是1 uop.在Skylake上,它有7个周期延迟,每个时钟吞吐量1个.(因此,您需要在飞行中保留7个独立的PCLMUL操作,以使端口5上的执行单元饱和).Broadwell有5个周期延迟.使用内存源操作数,它是1个额外的uop.

在Haswell上,它是3 uops(2p0 p5),具有7个周期延迟,每2个时钟吞吐量一个.

在Sandybridge/IvyBridge上,它是18 uops,14c延迟,每8个时钟吞吐量一个.

在Westmere(第二代Nehalem),它是12c延迟,每8c吞吐量一个.(未知的uops数量,Agner Fog和uops.info都没有.但是我们可以安全地假设它是微胶片.)这是支持该指令的第一代 - 从Nehalem到Westmere的极少数差异之一.


在Ryzen上它是4 uops,4c延迟,每2时钟吞吐量一个. http://instlatx64.atw.hu/显示了4.5周期延迟.我不确定他们的测试和Agner之间有什么区别.

在Piledriver上它是5 uops,12c延迟,每7个时钟吞吐量一个.


在Jaguar上,它是1 uop,3c延迟,每1个时钟吞吐量一个!

在Silvermont,它是8 uops,10c延迟/吞吐量.Goldmont = 3 uops,6c lat/3c tput.


另请参阅哪些注意事项可用于预测现代超标量处理器上的操作延迟,以及如何手动计算它们?和Agner Fog的优化指南,了解延迟和吞吐量(以及前端瓶颈)对无序CPU的性能如何影响,具体取决于周围的代码.

  • 好的,我弄清楚了uop.info中缺少PCLMULQDQ的原因.我的基准脚本使用Linux下的cpuid命令来查找支持哪些指令,显然,cpuid将指令列为PCLMULDQ(即没有第一个"Q").我将在下次更新站点时将PCLMULQDQ的数据添加到uops.info. (2认同)