R z*_* zu 2 floating-point performance x86 simd
对于 skylakex(agner 雾的说明表):
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
| 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 |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
Run Code Online (Sandbox Code Playgroud)
这是否意味着使用位掩码和逻辑并获取浮点数的尾数比使用 vgetmantps 指令更快?
将数字从 float 传输到 int 再返回到 float 的延迟是多少?
为了实现log(x),您希望尾数和指数为float,并且vgetmantps/vgetexpps非常适合它。 AVX2 中 log2(__m256d) 的有效实现。这就是这些指令的用途,并且确实加快了对log(2). (此外,它可以将显着性归一化为 -0.5 .. +0.5 而不是 0..1 或其他整洁的范围,以创建多项式近似值或其他内容的输入log(x+1)。请参阅其文档。)
如果您只想将尾数作为整数,那么请确保将其他位与其他位分开,然后在一条指令中完成。
(但请记住,对于 NaN,尾数是 NaN 有效载荷,因此如果您需要对 NaN 执行不同的操作,则需要检查指数。)
将数字从 float 传输到 int 再返回到 float 的延迟是多少?
您已经拥有 Agner Fog 的指令表 ( https://agner.org/optimize/ )。在 Skylake(SKL 和 SKX)VCVT(T) PS2DQ上,FMA 端口的延迟为 4c,另一个方向也是如此。
或者您是否在询问将 FP 指令的输出andps用作整数指令的输入时的旁路延迟?
Agner Fog 的 microarch PDF 有一些关于在 vec-int 和 fp 域之间发送数据的绕过延迟的信息,但没有太多细节。
Skylake 的旁路延迟很奇怪:与之前的 uarches 不同,这取决于指令实际选择的端口。 andps如果它在端口 5 上运行,则在 FP 指令之间没有旁路延迟,但如果它在 p0 或 p1 上运行,则它有额外的 1c 延迟。
有关按域+执行端口细分的域交叉延迟表,请参阅英特尔的优化手册。
(而且更奇怪的是,这种旁路延迟延迟会永远影响该寄存器,即使它确实已经写回物理寄存器并且没有通过旁路网络转发。 vpaddd xmm0, xmm1, xmm2如果任一输入出现,两个输入都有 2c 延迟from vmulps。但是一些洗牌和其他指令在这两个域中都有效。我已经有一段时间没有尝试过这个了,我没有检查我的笔记,所以这个例子可能不完全正确,但它是这样的。)
(英特尔的优化手册没有提到这种永久效果,这种效果会持续到您用新值覆盖架构寄存器为止。因此,在使用整数指令的循环之前创建 FP 常量时要小心。)