在this OpenCL reference sheet(斷開的鏈接)的第3頁上,有兩個內置的具有相同參數的向量長度函數:length()
和half_length()
。OpenCL函數length()和fast_length()之間有什麼區別?
這些功能有什麼區別?我從名字中搜集一個比另一個'更快',但是在什麼情況下?對於這種速度的增加,這是否是sacrafice的準確度?如果沒有,爲什麼會有人使用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
有更好的準確性保證,但可能會更慢。更重要的一點:
sqrt
的half_sqrt
閔精度:8192ulp
所以half_sqrt
可以是約11位不太準確然後sqrt
(以及實際上它的精確度可能低13位,因爲沒有必要要求sqrt
更好)。由於float
的尾數爲23bit
(加上一個隱含位),half_sqrt
僅承諾10位精度(包括隱含1的11位)。然而,如果硬件具有這樣的功能,它可能會更快。在硬件中,sqrt
或rsqrt
指令僅提供少量的位(如10-14)並且在指令後面使用Newton-Raphson迭代獲得必要的精度並不罕見。在這種情況下使用half_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