不幸的是我,我必须确保在 GPU 和 CPU 上获得相同的浮点结果。好的,我知道 IEEE 已经照顾我并提供了一个很好的标准来遵守几个舍入选项;并且 CUDA 部分被整理出来(有不同舍入模式的内在函数),所以这只是动机。
但是在主机端 C++ 代码中——我如何在特定的舍入模式下执行浮点运算(我的意思是在特定的语句中,而不是在我的翻译单元中)?是否有在引擎盖下使用程序集的包装函数?是否有一组具有不同舍入模式的 float 代理类?
我也在问关于翻译单元级别的相同问题。编译翻译单元时,如何使编译器(gcc/clang/MSVC)默认为某种舍入模式?
最佳答案
在@AndreasPapadopoulos 的引导下,它看起来像 there is an official way更改舍入模式:
int fesetround(int round)
int fegetround()
但有几个注意事项:
- 这是 C++11,而不是 C++98(尽管实际上您可能只使用系统的
<fenv.h>
,即 C99。 - 它需要通过
#pragma
与编译器通信的 - 这种切换可能会很慢。
我不确定它在实践中的使用有多广泛(以及是否有更常用的围绕它的更好的抽象)。
关于c++ - 在 C++ 中使用不同的 IEEE 浮点舍入模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202713/