在 C++ 中使用不同的 IEEE 浮点舍入模式

2024-01-09

不幸的是我,我必须确保 GPU 和 CPU 上的浮点结果相同。好的,我知道 IEEE 很关心我,并提供了一个很好的标准来遵循,并提供了几个舍入选项;并且 CUDA 部分已整理(有不同舍入模式的内在函数),所以这只是动机。

但是在主机端 C++ 代码中 - 如何在特定舍入模式下执行浮点算术(我的意思是在特定语句中,而不是在整个翻译单元中)?是否有在底层使用汇编的包装函数?是否有一组具有不同舍入模式的浮点数代理类?

我也在问关于翻译单元级别的同样问题。在编译翻译单元时,如何使编译器(gcc/clang/MSVC)默认使用某种舍入模式?


按照 @AndreasPapadopoulos 的指导,看起来像有一个官方的方法 http://en.cppreference.com/w/cpp/numeric/fenv/feround更改舍入模式:

int fesetround(int round)
int fegetround()

但有几个注意事项:

  1. 这是 C++11,而不是 C++98(尽管在实践中您可能只使用系统的<fenv.h>这是C99。
  2. 它需要通过以下方式与编译器通信#pragma 's
  3. 这种切换可能会很慢。

我不确定这在实践中使用得有多广泛(以及是否有更常用的更好的抽象)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中使用不同的 IEEE 浮点舍入模式 的相关文章

随机推荐