代码之家  ›  专栏  ›  技术社区  ›  R zu

vgetmantps vs and pd获取float尾数的指令

  •  1
  • R zu  · 技术社区  · 6 年前

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

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

    1 回复  |  直到 6 年前
        1
  •  5
  •   Peter Cordes    6 年前

    用于实施 log(x) ,你 希望 尾数和指数 float vgetmantps / vgetexpps 非常适合。 Efficient implementation of log2(__m256d) in AVX2 log(2) . (另外,它可以将有效值标准化为-0.5。。+0.5而不是0..1或其他整洁的范围来创建多项式近似的输入 log(x+1) its docs .)

    如果你只希望尾数是一个整数,那么确定并去掉其他位,你就在一条指令中完成了。

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

    https://agner.org/optimize/ ). 在天湖(SKL和SKX) VCVT(T) PS2DQ FMA端口的延迟是4c,另一个方向也是4c。

    或者您是在询问使用FP指令的输出(如 andps 作为整数指令的输入?

    Agner Fog的microach PDF提供了一些关于绕过vec int和fp域之间发送数据的延迟的信息,但没有太多细节。

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

    (更奇怪的是,这种旁路延迟会永远影响该寄存器,即使它肯定已写回物理寄存器并且没有通过旁路网络转发。 vpaddd xmm0, xmm1, xmm2 如果任何一个输入来自 vmulps . 但有些洗牌和其他指令在这两个领域都有效。我已经有一段时间没有做这个实验了,而且我没有检查笔记,所以这个例子可能不完全正确,但它是这样的。)

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