如何确保nan在使用SSE intrinsic时传播

How to make sure NaNs propagate when using SSE intrinsics?

本文关键字:SSE intrinsic 传播 nan 何确保 确保      更新时间:2023-10-16

我最近读了一篇关于SSE算术运算中的NaN值的文章:

作用于两个非整数(NAN)参数的算术运算结果是未定义的。因此,使用NAN参数的浮点操作将不匹配相应汇编指令的预期行为。

来源:http://msdn.microsoft.com/en-us/library/x5c07e2a (v = vs.100) . aspx

这是否意味着,例如,添加两个__m128值可能会将NaN转换为实数?

如果计算依赖于NaN值,我也需要最终结果为NaN。有什么办法可以做到吗?

当我解释该文本时,它所说的是编译器提供了大致对应于SSE指令的各种内部函数。通常,您可以期望编译器将使用SSE指令来实现内部函数。然而,这并不严格。本质实际上在一些抽象的计算模型中指定操作;它们不直接指定SSE指令。在这个抽象模型中,操作两个NaN(奇怪的是,它似乎不允许一个NaN和一个数字)的结果是未定义的。因此,例如,您从添加两个NaN中得到的结果可能不是NaN。

特别地,抽象模型中的操作将服从于编译器优化,这些优化可能导致SSE指令以外的东西(编译时的计算,如果编译器可以推断出nan存在,则省略指令,因此它不需要实际执行加法,等等)。

看起来,如果你想保证SSE指令的语义,你可能不得不用汇编语言编写,而不是在微软的编译器中使用intrinsic。

我确实希望供应商不要再忽视浮点语义。如果没有明确规定的行为,就很难进行工程设计。