CUDA優化

yyfn風辰發表於2010-05-28
三、        CUDA程式的優化
        對於一個問題來說,往往有很多辦法可以解決它。選擇那個方法,這是一個問題,而且是一個與政策、技術,甚至陰謀相關的問題,具體怎麼做,往往考量很多。或者說條件不一樣,評判的標準不一樣,選擇的方法也就不一樣。程式設計也類似,一般來說,不是為了特地使用GPU,就沒有必要沒有原因就將原來的CPU程式碼修改為GPU。
說這段話,是因為發現有很多人在不適合GPU的情況下,卻使用它,結果當然很壞具了。
使用CUDA可分兩種情況,一種是從頭到尾從新設計;一種是已經有了序列的版本,但不能滿足速度要求,想通過使用CUDA來加快速度,此時可以考慮將程式碼中最耗時的部分使用CUDA重寫。

3.1  選擇合適的工具
        由於歷史的原因,我們目前所使用的序列程式設計模式是完全一致的,說白了就是以控制為中心,雖然物件導向說是以資料為中心,但是我認為其本質上還是以控制為中心,大家想想看你寫物件導向的程式碼時,其整個中心是不是處理邏輯?是不是系統要做什麼?而目前的並行程式設計模式卻分為資料並行和任務並行,或者分散式儲存並行和共享儲存並行,CUDA是基於資料並行和共享儲存器的並行,如果你有OpenMP或者MPI的程式設計經驗,相信你也許也會有這種看法。
        所以如果你要解決的問題並不是資料並行的或者共享儲存器的,使用CUDA就絕不是一個好的選擇。


3.2  優化最應該優化的地方-優化準則
        相信很多人都知道80%-20%定律,也就是說程式的80%時間花在執行20%的程式碼上,如果我們將那20%的程式碼加速了10倍,最終也才加速一點點,如果我們將那80%加速了一倍,最終的結果將加速近一倍。
        根據公式s = 1/(f + (1-f)/p),其中f是程式中序列程式碼的比重,p是處理器數目。可知f越大,s就越小。這也許解釋了nv的說法(儘量讓更多的程式碼在GPU上執行,就算沒有加速比)。也就是儘量提高並行程式碼的比重。這潛在的能夠提升程式的並行效率,fermi的某些功能顯然是向前邁進了一些,但是nv是不是真的能夠達到他們的設想,那就是另一回事了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23057064/viewspace-663911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章