1
6
TL:DR:避免非正规数字,你就没事了 。如果不需要逐渐下溢,请在x86 MXCSR中设置“Denormals Are Zero”和“Flush To Zero”位,或其他架构的等效值。在大多数CPU中,生成非正规结果陷阱到微码,因此需要数百个周期而不是5个周期。 看见 Agner Fog's insn tables 有关x86 CPU的详细信息,以及 x86 标记wiki。
非正规操作数除外, add/sub/mul操作的延迟/吞吐量不依赖于典型的现代FPU (包括x86、ARM和其他)。它们通常是完全流水线的,但具有多周期延迟(即,如果输入准备就绪,新的MUL可以在每个周期开始执行),这使得可变延迟不便于无序调度。 可变延迟意味着两个输出将在同一个周期内准备就绪,从而破坏了完全流水线化的目的,并且使调度程序无法像处理已知但混合的延迟指令/uop时那样可靠地避免冲突。( These lecture notes about in-order pipelines show how that's a structural hazard for write-back (WB) 但同样的想法也适用于ALU本身,它需要一个额外的缓冲区,直到它能够交付所有已准备好的结果。) 作为高性能端的一个例子: 处理器 :
div/sqrt是例外:它们的吞吐量和延迟依赖于数据 . div或sqrt没有快速并行算法, even in hardware 。需要某种迭代计算,因此完全流水线化需要为每个流水线阶段复制大量非常相似的硬件。不过,现代Intel x86 CPU具有部分流水线div和sqrt,互反吞吐量小于延迟。
SSE/AVX不将sin/cos/exp/log作为单个指令实现;数学库应该自己编写代码。
许多好的数学库没有使用
x87
如果有专门的
英特尔无法提高x87的射程缩小精度
IDK关于x87 exp或日志指令,如
有关快速倒数和快速倒数sqrt的更多信息,请参见 Why is SSE scalar sqrt(x) slower than rsqrt(x) * x? rsqrtps 使用Newton-Raphson迭代的精度略低于普通的sqrtps。在Intel Haswell/Skylake上,延迟IIRC大致相同,但吞吐量可能更好。如果没有NR迭代,对于大多数用途来说,它都太不准确了。
无论如何,这已经变得非常特定于x86。mul与sqrt的相对性能在很大程度上取决于CPU微体系结构,但即使是在x86、ARM和大多数其他具有硬件FPU的现代CPU之间,您也应该发现
|