【问题标题】:What is the difference between the OpenCL functions length() and fast_length()?OpenCL 函数 length() 和 fast_length() 有什么区别?
【发布时间】:2012-04-26 15:35:25
【问题描述】:

this OpenCL reference sheet(断开的链接)的第三页上,有两个具有相同参数的内置向量长度函数:length()half_length()

这些功能之间有什么区别?我从名字中得知,一个比另一个“更快”,但在什么情况下?它是否会为了提高速度而牺牲准确性?如果不是,为什么要使用length() 而不是fast_length()

【问题讨论】:

  • 通常快速_方法是用速度换取准确性的惯例。
  • 改用 OpenCL 参考。您会毫不费力地发现 fast_length 使用 half_sqrt,它不能保证超过 10 位的准确度。

标签: performance opencl gpgpu


【解决方案1】:

根据 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 的准确度可能比sqrt 低11 位(实际上它可以低13 位,因为没有要求sqrt 不会比严格必要的更好)。因为float 的尾数为23bit(加上一个隐式位)half_sqrt 只承诺大约10 位的精度(11 位包括隐式1)。但是,如果硬件具有这样的功能,它可能会更快。在硬件中,sqrtrsqrt 指令仅提供少量位(如 10-14)并在指令后使用 Newton-Raphson 迭代以获得必要的精度并不罕见。在这种情况下使用half_sqrt 显然更快。

【讨论】:

  • 感谢您,特别是对准确性和来源差异的解释,这些细节允许在它们之间做出明智的选择。
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2021-04-13
  • 2019-01-25
相关资源
最近更新 更多