sqrtpd指令是否同时计算sqrt?

sth*_*55 0 parallel-processing sse simd cpu-architecture intrinsics

我正在学习 SIMD 内在函数和并行计算。我不确定Intel对x86指令的定义sqrtpd是否 表示将同时计算传递给它的两个数字的平方根:


对源操作数(第二个操作数)中的两个、四个或八个压缩双精度浮点值的平方根执行 SIMD 计算,并将压缩双精度浮点结果存储在目标操作数(第二个操作数)中第一个操作数)。


我知道它明确表示SIMD 计算,但这是否意味着对于此操作,将同时计算两个数字的根?

Pet*_*des 5

因为sqrtpd xmm,是的,现代 CPU 真正做到了并行,而不是一次通过一个更窄的执行单元运行它。较旧的(尤其是低功耗)CPU 确实可以做到这一点。对于 AVX vsqrtpd ymm,某些 CPU 确实分两半执行。

但是,如果您只是将性能数据与较窄的操作进行比较,请注意,某些 CPU(例如 Skylake)可以使用其宽 div/sqrt 单元的不同一半进行单独的操作sqrtpd/sd xmm,因此它们的吞吐量是 YMM 的两倍,即使它可以执行完整的vsqrtpd ymm操作平行线。

AVX-512 也是如此vsqrtpd zmm,甚至 Ice Lake 也将其分成两半,我们可以看到它是 3 uops(2 表示端口 0,英特尔放置 div/sqrt 单元,并且可以在其他端口上运行。)

3 uops 是 sqrt 指令比 Intel 上的执行单元更宽的关键标志,但是您可以查看 YMM 与 XMM 与标量 XMM 的吞吐量,以了解它如何能够在不同管道上提供更窄的操作独立的广泛执行单元。


唯一的区别是性能;目标 x/y/zmm 寄存器肯定具有每个输入元素的平方根。在https://uops.info/(当前较低,但通常非常好)和/或https://agner.org/optimize/上检查性能数字(和 uop 计数)。

允许但不保证 CPU 内部具有宽执行单元,与它们支持的最宽向量一样宽,从而真正在并行管道中计算所有结果。

全宽执行单元对于除法和平方根以外的指令很常见,尽管从 Bulldozer 到 Zen1 之前的 AMD 仅支持 128 位执行单元的 AVX/AVX2,因此vaddps ymm解码为 2 uop,分别执行每一半。英特尔 Alder Lake E 核心的工作原理相同。

一些古老的和/或低功耗的 CPU(如 Pentium-M 和 K8 以及 Bobcat)只有 64 位宽的执行单元,在两半中运行 SSE 指令(对于所有指令,不仅仅是像 div/ 这样的“硬”指令)开方)。

到目前为止,只有 Intel 在所有 CPU 上支持 AVX-512,并且(除 div/sqrt 之外)它们都具有全角执行单元。不幸的是,他们还没有想出一种方法来展示强大的新功能,例如在没有完整 AVX-512 的情况下,在 CPU 上对 128 和 256 位向量进行屏蔽和更好的洗牌。AVX-512 中有一些非常好的东西,完全独立于更广泛的向量。


SIMD div / sqrt 单位通常比其他单位更窄

除法和平方根本质上很慢,实际上不可能实现低延迟。管道化的成本也很高;当前的 CPU 无法在每个时钟周期启动新的操作。但最近的 CPU 一直在这样做,至少在部分操作中:我认为它们通常以几个牛顿-拉夫森细化步骤结束,并且该部分可以流水线化,因为它只涉及乘法/加法/FMA 类型的操作。

Intel 从 Sandybridge 开始就支持 AVX,但直到 Skylake 才将 FP div/sqrt 单元扩展到 256 位。

例如,Haswellvsqrtpd ymm以 3 个 uops 运行,2 个用于端口 0(div/sqrt 单位所在的位置),1 个用于任何端口,大概是为了重新组合结果。延迟时间大约延长了 2 倍,而吞吐量则减少了一半。(读取结果的微指令需要等待两半都准备好。)

vsqrtpd ymmAgner Fog 可能已经通过读取自己的结果来测试延迟;IDK 如果英特尔可以让一半操作在另一半准备好之前开始,或者合并 uop(或无论它是什么)最终会迫使它等待两半都准备好,然后再开始另一半的 div 或开方。除 div/sqrt 之外的指令具有全角执行单元,并且始终需要等待两半。

我还在浮点除法与浮点乘法表中收集了各种 CPU 上 YMM 和 XMM 的 divps / pd / sd / ss 吞吐量和延迟


归档时间:

查看次数:

388 次

最近记录:

3 年,4 月 前