gpu編程入門
1. 計算機體系結構:GPU架構入門
在計算機體系結構中,GPU架構作為SIMD(單指令多數據)的集大成者,以其充分利用數據並行性,在大規模數據處理上展現出與CPU無可比擬的優勢,成為AI時代的重要力量。GPU本質上是一台執行指令的機器,其流水線管道採用了SIMD機制,但與SIMD的編程方案有所不同。SIMD編程相對友好且容易理解,通過封裝好的庫函數實現多個操作數的並行操作。與此不同,GPU採用基於線程編程的概念,對於程序員而言可能不那麼友好。
理解這一差異的關鍵在於區分編程模型與執行模型的概念。編程模型指的是程序員如何表達代碼,如順序執行、Dataflow、多線程或SIMD方式。執行模型則是硬體如何執行這些代碼,涉及亂序執行、向量處理器或脈動陣列執行等。編程模型與執行模型之間存在差異,理解它們之間的區別與聯系對於更好地理解程序與硬體至關重要。
以for循環為例,使用三種編程模型(SISD、SIMD、Multithreading)來挖掘指令並行性。SISD編程中,迭代順序直觀,對程序員友好。SIMD編程則通過同一個指令操作多組數據,對程序員而言非常直觀。SPMD(單指令多線程)編程模型是GPU的核心,它認為N次迭代對應不同線程的執行,每個線程完成一次迭代,所有線程執行同一指令,但針對不同數據。硬體實現上,SIMT(單指令多線程)執行模型被用於運行SPMD編程模型,通過動態調度形成Warp,每個Warp包含一組線程,執行相同指令,實現SIMD操作。
SIMT執行模型中,每個線程有其獨立上下文,Warp由動態調度形成,本質是SIMD操作的集合。FGMT(Warp-Level FGMT)架構允許每個周期發射不同Warp,提高靈活性,避免硬體資源浪費。Warp執行通過多個Lane(空間並行度)實現縱向並行,結合時間上的並行,形成Warp。每個周期可並行執行多個線程,分時執行不同線程,實現時間和空間雙重並行。
在GPU中,Lane對應Vector Processor的PE組合,多個Lane組合形成Array Processor。通過軟體(編譯器)將代碼並行化,實現Kernel或核函數在GPU上的執行。Warp的組織和映射到硬體Warp由GPU硬體和驅動程序自動處理。傳統SIMD與基於Warp的SIMD的主要區別在於Warp內部線程路徑的多樣性,可能導致SIMD利用率降低。通過動態合並Warp,將路徑相同的線程合並,提高SIMD利用率。
以英偉達GeForce GTX285為例,其具有30個Core,每個Core包含8-way SIMD功能單元,理論上可同時執行30720個線程。通過FGMT方式交織運行32個Warp,每個Warp包含32個線程,支持1024個線程的並行執行。GPU通過實現高並行度,達到顯著的計算性能,成為現代計算領域的重要工具。