2012-02-24 85 views
4

這個問題是關於其承諾顯著改善該類型的計算OpenCL中可用的瘋狂功能:乘法和加法功能

A * B + C

如果用作狂(A,B,C )並使用cl-mad-enable進行編譯。

我已經試過了一個計算形式a + b * c + d * e使用瘋狂的一個非常巨大的大小,並期待着顯着的改善。令人驚訝的是,它花了相同的時間。

如果有人有這方面的經驗,我將不勝感激。我有一個可以工作的jist,因爲大部分資源都對mad()充滿讚美。注意:我使用的數據類型都是雙精度,如果它很重要,我對mad的使用會導致一個非常大的精度損失。

+1

您的GPU實際上是否支持雙打?他們中的很多隻支持浮動。 – 2012-02-24 00:51:37

+0

不是默認情況下,但通過啓用cl_khr_fp64,我可以使用它們。你可能有一點,我會轉換爲浮動和檢查。由於代碼非常大,需要一些時間。一旦我有什麼,我會迴應評論。 – 2012-02-24 08:41:08

回答

2

(1)能夠處理雙打和能夠有效地處理雙精度有很大的區別。最新的GPU處理雙倍,但比單精度慢大約2X-4X。

但是,AFAIK所有處理double的GPU都有瘋狂的指令。 AMD對此進行了文檔記錄參見日期爲2008年的http://developer.amd.com/gpu_assets/r600isa.pdf,MULADD_64指令。我已經看過Nvidia的不太詳細的文檔,但是像http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/Floating_Point_on_NVIDIA_GPU_White_Paper.pdf這樣的文檔說Nvidia有FMA(Fused Multiply Add)。英特爾GPU的手冊www.x.org/docs/intel沒有提到雙精度(至少不是谷歌)。 (2)但是,使用madd()時可能看不出差別的主要原因是編譯器已經認識到可以使用madd。

在某些GPU上,您可以查看生成的代碼。例如。 AMD CodeAnalyst或ShaderAnalyzer,用於OpenGL代碼的http://developer.amd.com/tools/shader/Pages/default.aspx

我花了很多時間查看使用這些工具生成的代碼,並對它進行了優化。 TBD:在這裏展示一個例子。