carry-less multiplication instruction是否恒定运行?换句话说,执行所需的时间与参数无关吗?
答案 0 :(得分:5)
根据https://agner.org/optimize/和PCLMULQDQ
在任何给定的CPU上都有固定的延迟。 (http://www.uops.info/table.html并未为此列出延迟,但是对于大多数指令来说,它都有不错的东西。)
没有理由期望它与数据相关-通常,在现代高性能CPU中,只有division / sqrt具有与数据相关的性能。常规乘法没有实现:相反,它们只是在执行单元内部具有大量硬件并行性的情况下,才使它变得快速。
当uops具有固定的延迟时,乱序指令调度要容易得多,因此为它们构建全流水线执行单元也很容易。调度程序(保留站)可以避免在同一端口上同时完成2个操作,并产生回写冲突。或更糟糕的是,在同一执行单元中,并导致其中的停顿。这就是为什么固定延迟很常见的原因。
(带有分支的微码多uup pclmulqdq
可能具有可变的延迟,或更合理的延迟取决于立即数操作数:当立即数为非零时,可能会额外增加一两个shoop uop。单个uop参数的固定等待时间不一定适用于微编码指令,但是pclmuqdq
仍然很简单,以至于您不会期望它实际上以rep movsb
的方式内部分支)
正如@fuz所指出的那样,PCLMUL是用于加密的,因此依赖于数据的性能会使它容易受到定时攻击。因此,有很充分的理由使PCLMUL保持恒定的时间。 (或者最坏的情况,取决于立即数,而不取决于寄存器/内存源。例如,0
以外的立即数可能会花费额外的移位量,以将高半数的信号源馈送到64x64 => 128的无位进位-乘以单位。)
自Broadwell以来,在英特尔公司,pclmuludq
为1 uop。在Skylake上,它有7个周期的延迟,每时钟吞吐量1个。 (因此,您需要保持运行7个独立的PCLMUL操作,以使端口5上的执行单元饱和)。 Broadwell具有5个周期延迟。使用内存源操作数,它是1个额外的uop。
在Haswell上,这是3微秒(2p0 p5),具有7个周期的延迟和每2个时钟吞吐量之一。
在Sandybridge / IvyBridge上,这是18微秒,14c延迟,每8个时钟吞吐量之一。
在韦斯特米尔(第二代Nehalem)上,它的延迟为12c,每8c吞吐率为1。 (未知数量的uops,Agner Fog和uops.info都没有。但是我们可以放心地假设它是微编码的。)这是第一代支持该指令的产品,这是从Nehalem到Westmere的极少数差异之一。
在Ryzen上为4微秒,4c延迟,每2个时钟吞吐量之一。 http://instlatx64.atw.hu/显示为4.5个周期的延迟。我不确定他们的测试和Agner的测试之间有什么区别。
在打桩机上,这是5微秒,12c延迟,每7个时钟吞吐量之一。
在Jaguar上是1 uop,3c延迟,每1个时钟吞吐量一个!
在Silvermont上,这是8微妙,时延/吞吐量为10c。 Goldmont = 3 oups,6c lat / 3c tput。
另请参阅What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand?和Agner Fog的优化指南,以了解延迟和吞吐量(以及前端瓶颈)对无序CPU的性能有何影响,具体取决于周围的代码。