2013-12-12 57 views
3

我不明白OpenCL native_前綴函數的原因。文檔說:OpenCL native_函數做什麼?

與native_前綴

函數可以映射到一個或多個本機設備 指令和更好的性能相比 相應的功能(不native__前綴)將典型地具有。這些函數的準確性(以及在某些情況下的輸入範圍)是實現定義的 。

好吧,所以我得到native_功能可能會稍微快一點,準確性稍差。有沒有其他的優點和缺點?在什麼使用情況下,我想使用log()還是native_log()

道歉,如果這是一個愚蠢的問題。我想確保我明白native_函數存在的根本原因。

+1

這基本上是一個速度/準確性的折衷。 native_函數可能會更快,但非'native_'函數可以保證準確性,這取決於你在做什麼。我認爲沒有任何其他的權衡。 – Thomas

回答

4

如果你想發佈在所有可能的設備上使用的軟件,你應該使用正常的功能,因爲你永遠不知道從native_函數會得到什麼。或者你可以做一個簡單的測試,檢查你是否想使用native_或者不是,例如計算感興趣範圍內的一堆值,看看它們是否足夠接近。

native_函數最重要的部分是它們的精度完全是實現定義的。這很重要,因爲OpenCL數值精度規範的某些部分實際上很愚蠢。作爲一個例子,規範要求sin具有相對4的ULP精度,這對於振盪函數來說非常有趣,並且在輸入ULP值變高時使得實現非常困難。

在實踐中,native_實現通常非常符合您對設備的期望。在GPU上,native_函數通常是DirectX規範中定義的。有些甚至有更好的實現。作爲AMD HW的一個例子,native_sin函數與正常的sin相比是非常快的,從我的經驗來看,它具有1 ULP輸入值的絕對誤差。在Intel集成GPU上,native_sin相當不精確,但仍在DirectX規範中。

native_函數在spec中的原因是允許不關心OpenCL規範所要求的極端精度的用戶使用性能更好的東西。

tl; dr:如果您可以使用native_函數,那麼可以這樣做,因爲它們通常比正常函數快得多。