要學習cuda的同學相信已經對其有一定的了解了,至少直到它是干什么的了。這篇文章主要是對cuda編程中的主要概念進行總結,有了一個大致的輪廓后就好入手了。
異構架構
異構架構即使用CPU和GPU共同進行計算。GPU不能作為一個獨立的運行平臺(程序無法單獨在GPU上運行),它只能作為CPU的一個附屬計算加速器。
上圖展示了異構架構中CPU和GPU的關系。CPU和GPU通過PCIe總線進行數據傳輸。在碰到計算密集型任務時,CPU將數據傳給GPU,GPU計算完成后再傳輸回CPU。
從上述架構途中也可看出,GPU上有更多的算術邏輯單元,計算能力更強。
主機(host)和設備(device)
由于CPU和GPU的這種從屬關系,CPU所在的位置被稱為主機端(host),GPU所在位置被稱為設備端(device)。在cuda編程中,主機端代碼和設備端代碼是有嚴格區分的。核函數的代碼只能在GPU上運行。
CUDA中的線程和一般的多線程有什么區別
CPU上的線程是重量級的,上下文切換緩慢且開銷較大, 且線程數量往往有限。CPU的線程相對于GPU的線程更適合處理控制密集型任務(多個if-else).
GPU上的線程是輕量級的。現代GPU上可以同時有成千上萬個線程并發。GPU的線程更適合控制簡單,但是計算密集的任務。
流式多處理器,線程束
GPU架構是圍繞流式多處理器(SM)展開的, GPU上有很多個SM,每個SM能夠支持數百個線程并發執行,因此在一個GPU上并發執行數千個線程是很容易的。下圖所示為一個SM的關鍵組件(了解即可):
每個SM上有多個線程,每32個線程被組織成一個線程束(thread wrap)。
線程網格,線程塊
線程束是物理上線程的劃分,但是在cuda編程中,邏輯上更多地是將線程分為不同的線程塊(thread block),不同的線程塊又分到不同的線程網格(thread grid)中。在編程中,每個在GPU上運行的核函數都要指定線程塊和線程網格的維度。線程塊和線程網格的維度都可以是一維二維或者三維。
- 區分線程塊和線程束
線程束表示的是線程資源。一個線程塊可能會占用多個線程束。假設在編程中指定一個線程塊中有80個線程,那么這個線程塊將占用3個線程束,多出來的線程束將不會活躍,如下圖所示:
多個線程塊在一起將會被組織成網格。
好了,上述就是幾個比較重要的概念,后面將直接通過代碼來學習cuda。