对于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的延迟时间是多少?
答案 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)
或其他任何值的输入。){3} >
如果您只想将尾数设为整数,则确保与其他位进行“与”运算,即可完成一条指令。
(但是请记住,对于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常量。)