OpenCL函数length()和fast_length()之间有什么区别?
在this OpenCL reference sheet(断开的链接)的第3页上,有两个内置的具有相同参数的向量长度函数:length()
和half_length()
。OpenCL函数length()和fast_length()之间有什么区别?
这些功能有什么区别?我从名字中搜集一个比另一个'更快',但是在什么情况下?对于这种速度的增加,这是否是sacrafice的准确度?如果没有,为什么会有人使用length()
而不是fast_length()
?
根据OpenCL的规格(1.1版,215页):
float length(floatn p)
:返回向量p
的长度,即sqrt(p.x²+p.y²+...)
float fast_length(floatn p)
:返回计算为矢量p
的长度half_sqrt(p.x²+p.y²+...)
所以fast_length
使用half_sqrt
,而length
使用sqrt
。正如你可以猜到sqrt
有更好的准确性保证,但可能会更慢。更重要的一点:
-
的
- 闵精度:3ulp(的至少精度单元)
-
的
half_sqrt
闵精度:8192ulp所以
half_sqrt
可以是约11位不太准确然后sqrt
(以及实际上它的精确度可能低13位,因为没有必要要求sqrt
更好)。由于float
的尾数为23bit
(加上一个隐含位),half_sqrt
仅承诺10位精度(包括隐含1的11位)。然而,如果硬件具有这样的功能,它可能会更快。在硬件中,sqrt
或rsqrt
指令仅提供少量的位(如10-14)并且在指令后面使用Newton-Raphson迭代获得必要的精度并不罕见。在这种情况下使用half_sqrt
显然更快。
sqrt
谢谢,特别是对于准确性和来源差异的解释,它的那些细节允许在它们之间做出明智的选择。 – sebf 2012-04-17 21:36:21
通常fast_方法是交易速度为准确性的例程。 – 2012-04-14 15:53:50
改为使用OpenCL参考。发现fast_length使用的half_sqrt不会保证超过10位的准确性,您将会遇到一些麻烦。 – 2012-04-14 16:05:03