當前位置: 華文問答 > 數位

CUDA 的包比自己寫的 Kernel 快 10~20 倍,有什麽內在機制呢?

2020-01-11數位

內在機制是CUDA編程真的很難…難到你必須精通GPU硬體架構才能寫出合格的GPGPU程式。

首先從題主的描述"這玩意一共不到20行的演算法"來看很可能演算法級別就沒有為GPU最佳化。FFT的GPU最佳化研究沒有其他演算法那麽多,但隨便Google一下還是有很多論文可以參考的。FFT的最佳化我沒怎麽研究過,再加上一些最佳化方法是針對特定workload的,這個層面就不多說了。

其次,拋開具體演算法,所有的效能最佳化都要基於效能分析(profiling)。先跑一下nvprof或者Nsight Compute,看看效能瓶頸在哪。對於沒有最佳化過的GPGPU程式,大機率在於memory bound。一般策略是看看有沒有局部可以重用的數據,開一片shared memory然後做loop tiling來避免多余的global memory 讀寫從而提高局部性。然後再跑profiling看看效能有沒有達到理論峰值,如果沒有就看看新的瓶頸在哪。有可能是訪存模式導致shared memory bank conflict,也有可能是shared memory用太多導致occupancy 下降而沒有足夠的執行緒來隱藏指令延遲。然後進一步針對最佳化訪存模式或者考慮用warp intrinsic在寄存器中交換執行緒間數據等等。然後再跑profiling,周而復始,最終達到一個滿意的結果。當然GPGPU的最佳化方法還很多,這裏只是舉一個簡單的例子來說明基於profiling最佳化的流程。

最後我想多說一點,坊(zhi)間(hu)流傳NVIDIA在官方柯瑞用了很多「黑魔法」(比如內部版本的編譯器)導致外部使用者怎麽最佳化CUDA程式碼也不能達到官方庫的效能。其實這點大家完全不必擔心,即使是最黑魔法的cuBlas庫(用手工SASS組譯最佳化)純CUDA重寫的CUTLASS也能把效能差距追平甚至超越。NVIDIA工程師比普通使用者多的只是經驗和手裏的顯卡。再者,NVIDIA的官方庫必須照顧所有使用場景,而使用者完全有可能針對自己的場景做特定最佳化來超越官方庫效能。

最最後,不要用PTX「組譯最佳化」,沒用。