|
如何通過GPU達到加速效能?
GPU和CPU本質上有很大的不同,CPU具有較大的緩存(cache)和較快的計算核心,可以處理較復雜的運算。然而GPU不具備這樣的條件,緩存較小且單核心計算速度也沒有CPU快,只是取而代之的GPU具有大量的計算核心(通稱CUDA Core),故其優勢在于適合進行同時間的大量運算。一顆頂級的CPU核心數量可達64核心(AMD EPYC 7H12),計算線程(Threads)達128,但低階的GPU(如Quadro P600)的核心數就有384(GPU的核心數等于計算線程數量)。 當然這不代表GPU比CPU厲害,而是表示兩者適合的計算類型不同。而GPU核心數量多的特點,也需要配合其平行化計算方式,才能將其優點發揮出來,所以由下圖可知,GPU在計算時所有核心可高度平行進行計算,而CPU則是以順序性(sequential)的方式進行計算。GPU是專為圖像處理所需的計算密集、高度并行計算設計的。上述應用,都具有計算數據量大且可高度平行化的特性,也就最適合使用GPU來計算。
如何使用GPU進行加速運算? 使用GPU進行加速運算方法主要有三大類:
一、使用商業軟件包。第一項種類繁多,其中又以有限元素分析領域最多,此領域相關計算包含流體力學分析、熱傳導分析、電磁場分析或應力分析等等應用。由于范圍涵蓋IC設計、建筑設計、甚至許多交通工具或化工廠也需通過這類軟件進行仿真分析,故開發這類軟件有很大的商業價值。 二、使用開源或官方函數庫。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直接。 |


