当我们考虑将DAZ标志用于SSE浮点时,“反常输入”在装配中到底意味着什么

问题描述 投票:2回答:1

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

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

让我感到困惑的是,如果设置了FTZ],则异常值来自装配视图中。我认为它只能是常量值,既可以用作立即操作数,也可以来自.rodata节(使用RIP相对寻址访问)。

但是我在二进制文件中发现,这些位置没有异常值,但仍然遭受FP-ASSIST问题,导致性能不佳。

如果同时设置DAZ和FTZ,问题将消失并且性能会变得更好。实际上,我什至在源代码中都找不到任何异常输入。我真的很困惑,异常值从哪里来?


顺便问另一个问题,对于指令vmovsd 0x9498(%rip),%xmm0,假设0x9498(%rip)是非正规值,如果分别设置FTZ或DAZ,则在执行该指令后xmm0会发生什么?

根据我的理解,DAZ将0x9498(%rip)设为零,并将0移至xmm0; FTZ会将0x9498(%rip)移到xmm0,发现它是不正常的,因此将xmm0刷新为零。我不确定,对吗?

我已经阅读了这篇文章,并且做非正规标记(如非正规标记)是对零达兹影响的比较,我了解FTZ和DAZ标记之间的用法和区别。 DAZ适用于输入,FTZ ...

floating-point sse instructions fast-math denormal-numbers
1个回答
2
投票

异常aka次标准是IEEE二进制格式的指数字段= 0的值。 https://en.wikipedia.org/wiki/Double-precision_floating-point_format

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


0
投票

这是一个示例,展示了如何通过乘法从两个正常操作数中获得一个子模型。数字roundsdroundsd都是单精度浮点,并且都在正常范围内。如果将它们相乘,将得到x = 1.6089696e-19,这是一个次要的数字。这是它们在内存中的布局方式:

y = 5.479484e-20
© www.soinside.com 2019 - 2024. All rights reserved.