vgetmantps vs andpd指令获取浮点数的尾数

时间:2018-09-10 15:27:09

标签: performance x86 floating-point simd

对于skylakex(agner fog的说明表):

+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
|      Instruction      |  Operands   | µops fused domain | µops unfused domain | µops each port | Latency | Reciprocal throughput |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
| VGETMANTPS/PD         | v,v,v       |                 1 |                   1 | p01/05         |       4 | 0.5-1                 |
| AND/ANDN/OR/ XORPS/PD | x,x / y,y,y |                 1 |                   1 | p015           |       1 | 0.33                  |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+

这是否意味着使用位掩码和逻辑并获取浮点数的尾数比使用vgetmantps指令要快?

将数字从float转换为int然后再转换回float的延迟时间是多少?

1 个答案:

答案 0 :(得分:4)

对于实现log(x),您想 将尾数和指数设为float,而vgetmantps / vgetexpps是完美的选择。 Efficient implementation of log2(__m256d) in AVX2。这就是这些指令的目的,并且可以加快对log(2)的快速逼近。 (此外,它可以将有效位规范化为-0.5 .. +0.5而不是0..1或其他整洁的范围,以创建多项式逼近log(x+1)或其他任何值的输入。)

如果您只想将尾数设为整数,则确保与其他位进行“与”运算,即可完成一条指令。

(但是请记住,对于NaN,尾数是NaN有效载荷,因此,如果您需要对NaN进行其他操作,则需要检查指数。)

  

将数字从float转换为int然后再转换回float的延迟时间是多少?

您已经具有Agner Fog的说明表(its docs)。在Skylake(SKL和SKX)上,VCVT(T) PS2DQ的FMA端口的延迟为4c,另一个方向也是如此。

还是您在询问将andps之类的FP指令的输出用作整数指令的输入的旁路等待时间?

Agner Fog的microarch PDF包含一些有关在vec-int和fp域之间发送数据的绕过延迟的信息,但没有很多细节。

Skylake的旁路延迟很奇怪:与以前的uarch不同,它取决于指令实际选择的端口。 andps如果在端口5上运行,则FP指令之间没有旁路延迟,但是,如果在p0或p1上运行,则有额外的1c延迟。

有关按域+执行端口划分的跨域延迟表,请参阅英特尔优化手册。

(而且,更奇怪的是,这种旁路延迟延迟会永久影响该寄存器,即使它确实已写回到物理寄存器且没有通过旁路网络转发。vpaddd xmm0, xmm1, xmm2的值为2c如果两个输入中的任何一个来自vmulps,则这两个输入都有延迟。但是,一些混排和其他指令都在两个域中都起作用。自从我尝试了一段时间以来,我没有检查笔记,所以这个示例可能不会完全正确,但这是这样的。)

(Intel的优化手册中没有提到这种永久性影响,直到您用新值覆盖架构寄存器之前,这种影响才会持续。因此请注意在使用整数指令循环之前创建FP常量。)