gpt4 book ai didi

assembly - CLMUL 是常数时间吗?

转载 作者:行者123 更新时间:2023-12-02 09:10:06 25 4
gpt4 key购买 nike

carry-less multiplication instruction在恒定时间内运行?换句话说,执行所需的时间是否独立于其参数?

最佳答案

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

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

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

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


正如@fuz 指出的那样,PCLMUL 是为加密而设计的,因此依赖于数据的性能会使它容易受到时序攻击。因此有一个非常充分的理由让 PCLMUL 成为恒定时间。 (或者在最坏的情况下,取决于立即数,而不是寄存器/内存源。例如 0 以外的立即数可能需要额外的移位微指令才能将源的高半部分馈送到 64x64 => 128无携带乘法单元。)


Agner Fog 表格中的数字

自 Broadwell 以来,在 Intel 上,pclmuludq 是 1 uop。在 Skylake 上,它有 7 个周期的延迟,每个时钟吞吐量 1 个。 (因此您需要保持 7 个独立的 PCLMUL 操作在运行中,以使端口 5 上的执行单元饱和)。 Broadwell 有 5 个周期的延迟。对于内存源操作数,它是 1 个额外的 uop。

在 Haswell 上,它是 3 微指令 (2p0 p5),具有 7 个周期延迟和每 2 个时钟吞吐量一个。

在 Sandybridge/IvyBridge 上它是 18 微指令,14c 延迟,每 8 个时钟吞吐量一个。

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


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

在 Piledriver 上它是 5 微指令,12c 延迟,每 7 个时钟吞吐量一个。


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

在 Silvermont 上它是 8 微指令,10c 延迟/吞吐量。 Goldmont = 3 微指令,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 的性能有何影响,具体取决于周围的代码。

关于assembly - CLMUL 是常数时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com