c-由于快速放松的数学运算,可接受的精度降低



关于-cl快速放松数学,我在解释OpenCL规范时遇到了一个小问题。

编译器标志的定义是:

设置优化选项-cl finite math only和-cl不安全的数学优化。这允许对可能违反IEEE 754标准的浮点运算进行优化以及第节中定义的OpenCL数值符合性要求7.4针对单精度浮点,第9.3.9节针对双精度浮点,以及第7.5节。此选项会导致预处理器宏
FAST_RELAXED_MATH将在OpenCL程序中定义。

在我的项目中,我基本上不关心IEEE的确切合规性。然而,在英特尔集成GPU中,此标志会导致所有三角函数使用自己的本机实现。在half-sin(根据规范,精度为10位)的情况下,这并不重要。在最坏的情况下,输出可能仍有8位,因此精度低于规范要求的2位也不算太差。

然而,Intel GPU实现(它们的CPU工作良好)也取代了对sin的调用。导致高达11位的精度损失。超过一半会被丢弃(罪恶需要19位)。我个人不再认为这是一种预期行为,当唯一的选择是要求严格遵守IEEE或放弃正常内置功能中的大部分可用精度时,这会使软件开发变得有点困难。

我知道,严格来说,他们遵循规范。编译器标志允许他们打破定义内置函数可用精度的部分中的数字符合性要求。然而,即使是允许编译器忽略NaN的最温和的标志,基本上也允许完全忽略所有内置函数的准确性。

最接近C世界的模拟是GCC标志Ffast math,它允许编译器也这样做,但在他们的情况下,即使假设浮点数学是关联的,正常的math lib函数仍然可用。

我想知道这些精度要求通常是如何处理的。英特尔真的遵循规范的精神吗?有人知道如何让英特尔GPU在不无理破坏内置函数精度的情况下,随心所欲地优化内核吗(比如假设浮点数学是关联的)?

您可以使用native_*函数来代替IEEE兼容的函数,在这些函数中,您愿意牺牲准确性来换取速度。当然,不要使用-cl快速放松数学标志,因为你有选择地为它做工作。

相关内容

最新更新