我已经阅读了This article和do-denormal-flags-like-denormals-are-zero-daz-affect-comparisons-for-equality,并且了解了FTZ和DAZ标志之间的用法和区别。
DAZ适用于输入,FTZ适用于FP操作的输出。
让我感到困惑的是,如果设置了FTZ],则异常值来自装配视图中。我认为它只能是常量值,既可以用作立即操作数,也可以来自 但是我在二进制文件中发现,这些位置没有异常值,但仍然遭受FP-ASSIST问题,导致性能不佳。.rodata
节(使用RIP相对寻址访问)。
如果同时设置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 ...
异常aka次标准是IEEE二进制格式的指数字段= 0的值。 https://en.wikipedia.org/wiki/Double-precision_floating-point_format
[当FP数学指令(非移动或纯按位布尔值)读取这样的数字作为输入操作数时,当将尾数与另一个操作数对齐时,以及应用该操作数的隐式高位时,它必须处理该特殊情况。指数暗含的尾数为0或非零。
这是一个示例,展示了如何通过乘法从两个正常操作数中获得一个子模型。数字roundsd
和roundsd
都是单精度浮点,并且都在正常范围内。如果将它们相乘,将得到x = 1.6089696e-19
,这是一个次要的数字。这是它们在内存中的布局方式:
y = 5.479484e-20