這是 CUDA 總複習系列的第二篇文章,目的是為初階或中階開發人員複習 CUDA、工具和最佳化的主要概念。
科學和商業的進步使對運算資源和工作負載加速的需求變得永無止境。平行程式設計是一種深奧的方式,讓開發人員能加快應用程式。然而,它有一些常見的挑戰。
第一個挑戰是簡化平行程式設計,使平行程式設計變得簡單。簡易的程式設計可吸引更多開發人員,讓他們有動力在平行處理器上移植更多應用程式。第二個挑戰是開發可簡易擴充的平行性的應用軟體,以利用越來越多的 GPU 處理器核心。
這篇文章探討 CUDA 如何應對這些挑戰。其中也會說明如何開始安裝 CUDA。
介紹 CUDA
NVIDIA 發明了 CUDA 程式設計模型並解決這些挑戰。CUDA 是用於圖形處理單元(graphical processing units,GPU)的平行運算平台和程式設計模型。透過 CUDA,您可以利用 GPU 的運算能力加速應用程式。
NVIDIA 於 2006 年 11 月推出 CUDA 的第一版,其軟體環境讓使用者使用 C 做為高階程式設計語言。透過 CUDA 加快數以千計的應用程式,其中包括推動機器學習和深度學習的函式庫和框架。
易於設計
為了方便採用,CUDA 提供了基於 C/C++ 的介面。CUDA 程式設計模型的一大好處是可讓您編寫純量程式。CUDA 編譯器使用程式設計中的語意抽象化,以此來利用 CUDA 程式設計的平行性。這可減輕程式設計的負擔。以下是關於 CUDA 程式設計模型的一些基礎知識。
CUDA 程式設計模型為程式設計師提供了三個主要程式語言延伸:
- CUDA 區塊(block) – 執行緒的集合或群組。
- 共用記憶體 – 所有執行緒(thread)在區塊中共用的記憶體。
- 同步屏障 – 讓多個執行緒能等到所有執行緒都到達特定執行點後再繼續。
以下程式碼範例所示為利用 CUDA 核心將 A、B 兩個向量相加。並且輸出到另一個向量 C。核心程式碼在 GPU 上執行且屬於純量性質,因為它將兩個向量相加的方式如同將兩個純量數相加。
此程式碼在 GPU 上執行時,會以平行方式執行。這是因為向量的每個元素都是由 CUDA 區塊中的執行緒執行,而所有執行緒皆平行且獨立運作。這可減輕平行程式設計的負擔。
* 計算 A 和 B 的向量相加,輸出 C。三個向量的元素數量與 numElements 相同。
*/
__global__ void vectorAdd( float *A, float *B, float *C, int numElements) {
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements) {
C[i] = A[i] + B[i];
}}
易於擴充
CUDA 程式設計模型可利用越來越多的 GPU 處理器核心擴充。可以使用 CUDA 語意抽象化來設計應用程式。任何問題或應用程式都可分成獨立的小問題,並在 CUDA 區塊之間單獨解決。每個 CUDA 區塊都可將子問題分解成更細的部分,且平行執行執行緒並互相合作。CUDA 執行階段決定以任何順序在 GPU 中的多重處理器上調度這些 CUDA 區塊。這讓 CUDA 程式得以擴充並在任何數量的多重處理器上執行。
圖 1 說明此概念。編譯後的 CUDA 程式有八個 CUDA 區塊。CUDA 執行階段可選擇如何將這些區塊分配給多重處理器,如串流多重處理器(streaming multiprocessors,SM)所示。
較小的 GPU 有四個 SM,每個 SM 獲得兩個 CUDA 區塊。較大的 GPU 有八個 SM,每個 SM 獲得一個 CUDA 區塊。這讓應用程式能利用更強大的 GPU 來擴充效能,不需要任何程式碼變更。
安裝 CUDA
以下說明如何讓系統準備好進行 CUDA 安裝。安裝 CUDA 後即可開始編寫平行應用程式,並利用 GPU 的大規模平行性。
在系統上執行 CUDA 的需求如下:
-
您需要與 CUDA 相容的 GPU 才能執行 CUDA 程式。與 CUDA 相容的 GPU 用於各種可能需要運算能力之處:筆記型電腦、工作站、資料中心或雲端。大多數筆記型電腦都可選配 NVIDIA GPU。廣泛用於資料中心和工作站的 NVIDIA 企業級 GPU Tesla 和 Quadro 也與 CUDA 相容。每個主要雲端供應商都有以 GPU 為基礎的執行個體,您可以在其中執行 CUDA 程式。
-
具有 GCC 編譯器和工具鏈的作業系統支援的版本如需作業系統、GCC 編譯器和工具的支援清單,請參閱 CUDA installation Guides。
-
NVIDIA CUDA ToolkitNVIDIA 免費提供 CUDA Toolkit。此工具套件包含 GPU 加速函式庫、編譯器、開發工具及 CUDA 執行階段。
如需更多資訊,請參閱 CUDA Programming Guide。