如何确保nan在使用SSE intrinsic时传播
How to make sure NaNs propagate when using SSE intrinsics?
我最近读了一篇关于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。
我确实希望供应商不要再忽视浮点语义。如果没有明确规定的行为,就很难进行工程设计。
相关文章:
- C++ SSE 内部函数:将结果存储在变量中
- Constexpr and SSE intrinsics
- 如何使用SSE将__m128i注册乘以浮点因子?
- 使用SSE内部函数复制少量数据时出现问题
- 可以在 macOS 上启用的最低支持的 SSE 标志是什么?
- SSE 标志应该如何与现代 CMake 一起添加?
- 快速 SSE 射线 - 4 三角形交叉点
- 使用 SSE 以最快的速度缩小 8 位灰度图像
- 如何用SSE优化矩阵3乘3乘法与点?
- 使用双精度运算的快速 SSE 低精度指数
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 单精度矩阵运算的特征性能 AVX 与 SSE 没有区别?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- SSE 内联汇编和可能的 g++ 优化错误
- 比较SSE intrinsic中的符号位
- 最快50%缩放(A)RGB32图像使用sse intrinsic
- 我做错了什么将我的MMX intrinsic转换为x64 (SSE)
- SSE intrinsic:如何将值存储到寄存器中
- 如何确保nan在使用SSE intrinsic时传播
- 快速点积使用SSE/AVX intrinsic