performance - vgetmantps 与 andpd 获取 float 尾数的说明

标签 performance x86 floating-point simd avx512

对于 skylakex(agnerfog 的指令表):

+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
|      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                  |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+

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

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

最佳答案

为了实现log(x),您想要尾数和指数为float,以及vgetmantps/vgetexpps 非常适合它。 Efficient implementation of log2(__m256d) in AVX2。这就是这些指令的用途,并且确实加速了 log(2) 的快速逼近。 (此外,它可以将有效数标准化为 -0.5 .. +0.5 而不是 1 .. 2.0 或其他整齐的范围,以创建多项式逼近 log(x+1) 或其他值的输入。请参阅 its docs .)

如果您只想将尾数作为整数,那么请务必将其他位与“AND”,然后您就可以在一条指令中完成。

(但请记住,对于 NaN,尾数是 NaN 有效负载,因此如果您需要对 NaN 执行不同的操作,则需要检查指数。)

How much is the latency for transferring the number from float to int and back to 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 ,如果任一输入来自 vmulps,则 xmm2 对于两个输入都有 2c 延迟。但是一些随机播放和其他指令在任一域中都可以工作。自从我尝试此操作以来已经有一段时间了,而且我没有没有检查我的笔记,所以这个例子可能不完全正确,但它是这样的。)

(英特尔的优化手册没有提到这种永久效果,它会持续到您用新值覆盖架构寄存器为止。因此,在使用整数指令的循环之前创建 FP 常量时要小心。)

关于performance - vgetmantps 与 andpd 获取 float 尾数的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261067/

相关文章:

java - double 或 float 数据类型在循环中不能正确相加?

java - 使用java进行大型SQL数据集查询

performance - 从 Visual Studio 测试日志的十六进制转储中获取值(value)

ubuntu - x86 NASM 程序集中的阶乘函数出错

c - 如何在 macOS 上使用 `nm` 在 C 程序中显示本地(非外部)符号?

c - GCC优化错失良机

C: printf 一个浮点值

performance - 我如何使用 jmeter 查找内存泄漏或任何 gc 问题?

javascript - ammo.js 在谷歌浏览器中的性能

python - 如何在 python 中计算具有 unicode 组件的字符串的数值?