关于-cl-fast-relaxed-math,我在解释OpenCL规范时遇到了一些问题。
该编译器标志的定义是:
设置优化选项-cl-finite-math-only和 -cl不安全的,数学的优化。这允许优化可能违反IEEE 754标准的浮点运算 以及本节中定义的OpenCL数字合规性要求 7.4用于单精度浮点,9.3.9用于双精度浮点,以及边缘情况行为 第7.5节。此选项会导致预处理器宏 FAST_RELAXED_MATH 将在OpenCL程序中定义。
在我的程序中,我基本上不关心IEEE的合规性。但是在Intel集成GPU中,此标志会导致所有三角函数使用其自己的本机实现。在half_sin的情况下(根据规范,精度为10位),这并不重要。在最坏的情况下,输出仍然可能有8位,因此比规范要求的精度低2位也不算太差。
然而,英特尔GPU实现(他们的CPU工作正常)也取代了对罪的调用。导致丢失高达11位的精度。超过一半的方式被扔掉(罪需要19位)。我个人并不认为这是一种预期的行为,当唯一的选择是要求严格的IEEE合规要求或放弃普通内置函数中的大部分可用精度时,它会使软件开发变得困难。
我知道严格来说他们遵守规范。编译器标志允许它们在定义内置函数的可用精度的部分中打破数字合规性要求。然而,即使是允许编译器忽略NaN的最温和的标志基本上也允许完全忽略所有内置函数的准确性。
与C世界最接近的模拟是GCC标志Ffast-math,它允许编译器执行相同的操作,但是在它们的情况下,正常的数学lib函数仍然可用,即使它们假设浮点数学是关联的等等。
我想知道一般如何处理这些精度要求。英特尔是否真的遵循规范的精神?有没有人知道如何让英特尔GPU优化内核的内容(例如假设浮点数学是关联的)而不会不合理地破坏内置函数的精度?
答案 0 :(得分:0)
您可以使用native_ *函数代替符合IEEE标准的函数,在这些函数中您愿意牺牲速度的准确性。当然,当你有选择地为它做工作时,不要使用-cl-fast-relaxed-math标志。