2012-04-14 72 views
1

this OpenCL reference sheet(断开的链接)的第3页上,有两个内置的具有相同参数的向量长度函数:length()half_length()OpenCL函数length()和fast_length()之间有什么区别?

这些功能有什么区别?我从名字中搜集一个比另一个'更快',但是在什么情况下?对于这种速度的增加,这是否是sacrafice的准确度?如果没有,为什么会有人使用length()而不是fast_length()

+1

通常fast_方法是交易速度为准确性的例程。 – 2012-04-14 15:53:50

+4

改为使用OpenCL参考。发现fast_length使用的half_sqrt不会保证超过10位的准确性,您将会遇到一些麻烦。 – 2012-04-14 16:05:03

回答

7

根据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有更好的准确性保证,但可能会更慢。更重要的一点:

    sqrt
  • 闵精度:3ulp(的至少精度单元)
  • half_sqrt闵精度:8192ulp

    所以half_sqrt可以是约11位不太准确然后sqrt(以及实际上它的精确度可能低13位,因为没有必要要求sqrt更好)。由于float的尾数为23bit(加上一个隐含位),half_sqrt仅承诺10位精度(包括隐含1的11位)。然而,如果硬件具有这样的功能,它可能会更快。在硬件中,sqrtrsqrt指令仅提供少量的位(如10-14)并且在指令后面使用Newton-Raphson迭代获得必要的精度并不罕见。在这种情况下使用half_sqrt显然更快。

+1

谢谢,特别是对于准确性和来源差异的解释,它的那些细节允许在它们之间做出明智的选择。 – sebf 2012-04-17 21:36:21

相关问题