gpt4 book ai didi

floating-point - 当我们考虑对 SSE 浮点使用 DAZ 标志时, "denormal input"在汇编中究竟意味着什么

转载 作者:行者123 更新时间:2023-12-04 10:08:24 26 4
gpt4 key购买 nike

我已阅读 This articledo-denormal-flags-like-denormals-are-zero-daz-affect-comparisons-for-equality我了解 FTZ 和 DAZ 标志之间的用法和区别。

DAZ 适用于输入,FTZ 适用于 FP 操作的输出。

让我感到困惑的是,如果 ,那么在汇编 View 中非正规值来自哪里自贸区成立 .我认为它只能是作为立即数或来自 .rodata 部分的常量值。 (使用 RIP 相对寻址访问)。

但是我发现在我的二进制文件中,这些地方没有非正规值,但它仍然存在 FP-ASSIST 问题,导致性能不佳。

如果我同时设置 DAZ 和 FTZ,问题就会消失并且性能会变得更好。实际上,我什至没有在我的源代码中找到任何非规范输入。我真的很困惑,非正规值从何而来?

顺便说一句,另一个问题,用于说明 vmovsd 0x9498(%rip),%xmm0 , 假设 0x9498(%rip)是非正规值,xmm0 会发生什么?这条指令执行后,如果我们分别设置FTZ或DAZ?

在我的理解中,DAZ 会让它花费 0x9498(%rip)作为零和移动 0到 xmm0;自贸区搬迁0x9498(%rip)到 xmm0 发现它是异常的,所以刷新 xmm0到零。我不确定,是否正确?

最佳答案

非正规又名次正规是 IEEE 二进制格式中指数字段 = 0 的值。 https://en.wikipedia.org/wiki/Double-precision_floating-point_format

当 FP 数学指令(不是移动或纯按位 bool 值)读取这样一个数字作为输入操作数时,它必须在将尾数与另一个操作数对齐时处理这种特殊情况,以及在应用尾数的隐式最高位时指数为 0 或非零暗示。

是的,大部分时间输出上的 FTZ 就足够了,因为大多数浮点值是其他 FP 计算的结果。是的,FTZ 是必要的,因为 mul/div/add/sub 在正常数字 can create a subnormal result 上。 (添加输入需要相反的符号)。另一个 IEEE“基本”精确舍入操作 sqrt 无法创建次正规数,因为它使数字更接近 1.0。

显而易见的事情是使用 perf record 找出您在哪里获得 FP 辅助,并在那里添加一些额外的检查以进行打印,或者当您在那里发现异常时进行其他检查。 (然后在该分支中设置一个断点,以便您可以检查情况。)

设置了 FTZ 的非规范化(非详尽)的可能来源,即除 FP 数学运算之外:

  • String-to-float 构建具有扩展精度整数的 FP 位模式,like Glibc's strtod
  • 如果您正在读取二进制数据,则输入文件/网络。
  • 其他线程或通过来自其他没有 FTZ 运行的进程的共享内存。 (MXCSR中的FTZ/DAZ和舍入模式是per-thread架构状态。话说回来,如果只在主线程启动另一个线程后设置FTZ,对已经启动的线程是无效的。)
  • 可能是 nextafter 等 FP 位模式的整数操作。也可能作为 exp 实现的内部结构的一部分,该实现​​将整数填充到 double 的指数字段中。
  • 编译时常量值。但是,它们不必作为文字值出现在源代码中。例如static double foo = DBL_MIN / 4.0; 将是一个编译时异常。但是您会在 .rodata.data 中找到它们。非常量非零静态/全局变量进入 .data

  • 显然,任何使用整数内容的 FP 位模式手动操作也可以做到。如果我没有花费额外的指令来避免它, How to use bits in a byte to set dwords in ymm register without AVX2? (Inverse of vmovmskps) 可能会为比较产生非规范输入,但这是编译器不会为您做的不寻常的手动矢量化技巧。

    immediate operands



    x86 没有 FP 立即数;你必须 mov rax, imm64/ movq xmm0, rax 或类似的。但是编译器不会这样做,因为从 .rodata 加载通常更有效。

    for instruction vmovsd 0x9498(%rip),%xmm0


    vmovsd 只是一个负载,并且总是精确地复制 64 位;在架构上相当于 vmovq SIMD 整数负载。

    它不会通过 ALU 运行该值,因此没有 MXCSR 位对 vmovsd 、FP shuffles 等产生任何影响。只有执行实际 FP 数学并可以引发 FP 异常的指令才会受到影响。您可以通过查看 asm 手册条目的异常部分来判断。例如 roundsd 确实遵循 DAZ 可能在根据指定的模式舍入之前将输入舍入为零。

    关于floating-point - 当我们考虑对 SSE 浮点使用 DAZ 标志时, "denormal input"在汇编中究竟意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61457985/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com