Tuesday, September 14, 2010

Some OpenCL test. pt1

有很長一段時間沒有在網路上寫任何東西了,主要原因是因為覺得自己寫的東西都非常不成熟,總是夾帶太多個人的不成熟看法,通常過了兩三個月看自己的文章都覺得很羞愧,也不像某些前輩高人的blog有一些真的技術內容可以學習,so,不想浪費時間的人可以直接跳去看我的blog list,那些連結裡面可以學習到真正的智慧。

如果要浪費時間...之前我是有寫了一些OpenCL的code啦...


一些連結:
它的spec寫的真的還不錯,看一看就會寫了
http://www.khronos.org/registry/cl/

AMD的OpenCL convolution tutorial,我測試用的kernel是抄他的code,他測試平台是在CPU上跑的,global work size非常大,8192還多少的,在我的nVidia 8600M上完全是沒辦法跑的,要降到512*512才可以http://developer.amd.com/gpu/ATIStreamSDK/ImageConvolutionOpenCL/Pages/ImageConvolutionUsingOpenCL.aspx


一些簡單的心得
1. stream programming model,寫kernel很簡單,看起來跟c語言幾乎是一樣的,但是目前仍然有些限制,例如pointer dereference不能使用->而一定要用array的形式,然後不能用recursion,這些限制在Cuda是不存在的,但是實用上要寫高效能的kernel可能也不會需要用到這些。

2.使用OpenCL已經可以做出許多超出傳統shader的運算,如scatter operation,atomic/synchronization primitive

3. OpenCL適用於異質多核心,只要硬體廠商有提供OpenCL的driver,同樣的code可以編譯成CPU,GPU,SPU,xxPU的版本,AMD的fusion大業似乎是想要建立在OpenCL上。

4.硬體架構對kernel的效能影響應該非常大,AMD的convolution kernel最佳化在GPU上完全沒有作用,想要寫高效能的kernel,底層的硬體是無法被抽象化的。

4. rant......要在nvidia上的卡運行OpenCL要先去下載Cuda Toolkit,我個人是覺得nVidia想要降低OpenCL的使用率吧,所以把OpenCL也包在Cuda裡面,聽說他們的OpenCL也是架構在Cuda上,所以OpenCL的效能要比直接用Cuda要慢20~30%。他們的OpenCL driver也不是太穩定。我的想法是我們應該不要使用只支援nVidia GPU的Cuda,OpenCL才是正確的道路。

5.測試AMD的convolution kernel,8600M GT大約比single thread Core 2 Duo 2.2 G快3倍左右,不過兩個平台都沒有做任何有意義的最佳化就是了。

6.如果是box filter(也就是average),OpenCL可以做到一些shader做不到的最佳化,之後有時間再寫吧,詳情可以看這個連結http://pixelstoomany.wordpress.com/2007/09/13/why-gpus-are-not-so-good-at-post-processing-images/。其實我原本以為它可以適用於一般的convolution的,不過有個聰明的傢伙一下子就看穿了是不行的,有沒有天分從這裡就看得出來了....

1 comment:

Silent Wolf 18 said...

不會拉,你一直都是帶著新技術到團隊的人,文章的價值有時也不是在討論多艱深的東西,簡單又重要或許更有價值。凡事都有開始,加油~~