像Denormals-Are-Zero(DAZ)这样的异常标志是否会影响相等性的比较?

时间:2019-01-04 23:13:57

标签: x86 floating-point sse x87 fast-math

如果我有2个具有不同位模式的非正规浮点数并比较它们是否相等,则结果是否会受到Denormals-Are-Zero标志,Flush-to-Zero标志或常用处理器上的其他标志的影响?

还是这些标志仅影响计算而不影响相等性检查?

1 个答案:

答案 0 :(得分:4)

DAZ(零位 Are 零)会影响读取输入,因此 DAZ会影响比较。根据它们的符号,所有异常值实际上都被视为-0.0+0.0

FTZ(刷新为零)仅影响写入输出,因此 FTZ不影响比较。比较不会产生FP输出,因此无需刷新。


(DAZ和FTZ是SSE MXCSR控制/状态寄存器中的标志。x87没有等效项。)


为什么两个标志分别存在,而不是一个标志同时控制两个事物?我不知道,但是您肯定需要两种效果。

您可能正在从文件或从网络读取FP数据,因此您可以直接获得非正规输入,而不是计算结果。因此,您需要DAZ。

产生正确的异常输出(例如,减去附近的正常数或将两个小的正常数相乘)可能会很慢,因此您需要使用FTZ来允许CPU仅向+-0.0下溢,而不是使用微码辅助以获得正确的价值。


或者您可能使一个线程运行快速数学(FTZ + DAZ),而另一个线程运行精确数学以进行某些需要它的计算。如果快速数学线程读取精确线程产生的数据,则这些数字可能是反常数。

我不确定设置DAZ而不是FTZ的用例,反之亦然。当然,这将涉及读取您自己未生成的数据,或者为您自己之外的读者编写数据,否则,FTZ足以避免任何速度下降。

(仅DAZ是不够的:即使下一个操作将其视为0,也无法从正常输入产生异常输出,这仍然很慢。)