2012-04-14 76 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

相關問題