如何使用GPU進行加速運算
GPU自開放自編程後,其應用範圍就越來越廣,除了現在最受矚目的AI應用外,仍有許多領域會需要透過GPU縮短計算時間。不論是科學運算中,解決有限元素分析的求解問題,或是生物工程進行DNA比對,甚至設計師透過軟體將完成的CAD模型以光線追蹤技術進行加速渲染。由於這些應用使用到大量的數據進行運算,透過GPU硬體及相關以CUDA為基礎的演算法結合,皆可大幅縮短結果出爐的時間。GPU這麼神?這些軟體及演算法到底是如何透過GPU達到加速效能的?
使用CUDA技術進行加速運算領域
GPU運算流程
這些應用可以迅速完成運算,其實仰賴的不只是GPU,還有驅動其運算的CUDA。CUDA全名為(Compute Unified Device Architecture)統一計算架構自2007年推出1.0版本後,目前已來到10.2版。簡單來說,就是實現開發者和GPU溝通的一種橋梁,透過CUDA的技術讓熟悉各種程式語言的開發者,能夠透過程式撰寫將演算法透過GPU進行加速。利用GPU加速的基本原理其實很簡單。
主機上有負責存取資料的記憶體(RAM)及負責進行運算的CPU,而相對於GPU上也同樣有負責存取資料的記憶體和負責進行運算的GPU晶片(如下圖)。在程式中主要流程都會由CPU進行控制及分配資源,當某一段程式要透過GPU進行加速時,可透過CUDA語法先將資料從主機記憶體複製到GPU記憶體,接著第二步CPU會呼叫GPU開始進行計算,計算完成後CPU又指派GPU將存放在GPU記憶體中的計算結果回傳至主機記憶體,如此一來GPU加速的流程就完成了。
GPU運算流程
透過GPU運算為何可達到加速效果?
GPU和CPU本質上有很大的不同,CPU具有較大的快取(cache)和較快的計算核心,可以處理較複雜的運算。然而GPU不具備這樣的條件,快取較小且單核心計算速度也沒有CPU快,只是取而代之的GPU具有極大量的計算核心(通稱CUDA Core),故其優勢在於適合進行同時間的大量運算。一顆頂級的CPU核心數量可達56核心(Intel Xeon Platinum 9282),計算執行緒 (Threads) 達112,但低階的GPU(如Quadro P620)的核心數就有512 (GPU的核心數等於計算執行緒數量)。當然這不代表GPU比CPU厲害,而是表示兩者適合的計算類型不同。而GPU核心數量多的特點,也需要配合其平行化計算方式,才能將其優點發揮出來,所以由下圖可知,GPU在計算時所有核心可高度平行進行計算,而CPU則是以順序性(sequential)的方式進行計算。GPU是專為影像處理所需之計算密集、高度平行計算設計針對前述的應用,都具有計算資料量大且可高度平行化的特性,也就最適合使用GPU來計算。
CPU和GPU設計架構及計算特性
如何使用GPU進行加速運算
使用GPU進行加速運算方法主要有三大類
- 使用商業套裝軟體
- 使用開源或官方函式庫
- 自行編程CUDA
使用商業套裝軟體
第一項種類繁多,其中又以有限元素分析領域最多,此領域相關計算包含流體力學分析、熱傳導分析、電磁場分析或應力分析等等應用。由於範圍涵蓋IC設計、建築設計、甚至許多交通工具或化工廠也需透過這類軟體進行模擬分析,故開發這類軟體有很大的商業價值,想要進一步了解應用的朋友,可以參考GPU應用區塊的相關文章。
使用開源或官方函式庫
第二項則較具有客製化的彈性,由於必須自己編寫程式,而GPU計算的模組則呼叫他人以撰寫好的函式庫,或是呼叫NVIDIA官方提供的函式庫。NVIDIA官方常見的如矩陣計算函式庫cuBLAS、頻率分析函式庫cuFFT、深度學習函式庫cuDNN等等,但也可從如GitHub社群上搜尋。上述兩項也可參考NVIDIA官方收錄的「GPU-ACCELERATED APPLICATIONS」,內容已將各領域可使用GPU的軟體或套件收錄並提供簡介,讓開發者可容易找到合適的應用套件。
自行編程CUDA
第三項就必須透過程式語言進行CUDA撰寫,不過依照程式語言不同能夠操控的自由度也不相同,其中較底層的程式語言C/C++或Fortran屬於自由度最高的程式語言,可利用程式語言控制GPU計算,甚至可針對本機記憶體與GPU記憶體資料傳輸進行優化。其次則為Python,Python也是現今最主流進行人工智慧應用開發的程式語言。實現的方式包含PyCuda或是使用Numba函式庫,PyCuda的使用者還是需要在核心程式撰寫CUDA C,當然其效能幾乎也等同於撰寫CUDA C的效能,而Numba則是透過裝飾器(decorator)於函式宣告,並使用函式簽名(function signature)完成呼叫CUDA的設定。此外,Java、R、C#等也都可以支援CUDA,但都不如C/C++或Fortran直接。至於CUDA環境相關安裝,可參考「如何選擇GPU 驅動程式」。