CUDA編程模型簡介

CUDA編程模型

本篇博客主要對CUDA的編程模型、內存層次結構、線程管理進行簡單的介紹。

1、編程結構

CUDA是一種通用的並行計算平臺和編程模型,是在C語言基礎上擴展。
一些術語區分:

設備 GPU及其內存(設備內存)
主機 CPU及其內存(主機內存 )

CUDA編程模型主要是異步的,因此在GPU上進行的運算可以與主機-設備通信重疊。一個典型的CUDA程序包括由並行代碼互補的串行代碼。如圖所示,串行代碼(及任務並行代碼)在主機CPU上執行,而並行代碼在GPU上執行。主機代碼按照ANSI C標準進行編寫,而設備代碼使用CUDA 進行編寫。你可以將所有的代碼統一放在一個源文件中,也可以使用多個源文件來構建應用程序和庫。
一個典型的CUDA程序實現流程遵循以下模式。

  1. 把數據從CPU內存拷貝到GPU內存。
  2. 調用核函數對存儲在GPU內存中的數據進行操作。
  3. 將數據從GPU內存傳送到CPU內存。

    圖表 1 一個典型的CUDA程序

2 內存層次結構成

CUDA編程模型從GPU架構中抽象出一個內存層次結構。如下圖所示的是一個簡化的GPU內存結構,它主要包含兩部分:全局內存和共享內存。CUDA編程模型最顯著的一個特點就是揭示了內存層次結構。每一個GPU設備都有用於不同用途的存儲類型。
在GPU內存層次結構中,最主要的兩種內存是全局內存和共享內存。全局類似於CPU的系統內存,而共享內存類似於CPU的緩存。然而GPU的共享內存可以由CUDA C的內核直接控制。

圖表2 簡化的GPU內存結構

3 線程管理

核函數在主機端啓動時,它的執行會移動到設備上,此時設備中會產生大量的線程並且每個線程都執行由核函數指定的語句。CUDA明確了線程層次抽象的概念以便於組織線程,這是一個兩層的線程層次結構,由線程塊和線程塊網格構成,如下圖所示。

圖表 3 線程層次結構示例
由一個內核啓動所產生的所有線程統稱爲一個網格。同一網格中的所有線程共享相同的全局內存空間。一個網格由多個線程塊構成,一個線程塊包含一組線程,同一線程塊內的線程協作可以通過以下方式來實現。不同塊內的線程不能協作。
 同步
 共享內存
線程依靠以下兩個座標變量來區分彼此。
 blockIdx(線程塊在線程格內的索引)
 threadIdx(塊內的線程索引)
這些變量是核函數中需要預初始化的內置變量。當執行一個核函數時,CUDA運行時爲每個線程分配座標變量blockIdx和threadIdx。基於這些座標,你可以將部分數據分配給不同的線程。
該座標變量是基於uint3定義的CUDA內置的向量類型,是一個包含3個無符號整數的結構,可以通過x、y、z三個字段來指定。

blockIdx.x
blockIdx.y
blockIdx.z
threadIdx.x
threadIdx.y
threadIdx.z

CUDA可以組織三維的網格和塊。線程層次結構(見圖線程層次結構示例)是一個包含二維塊的二維網格。網格和塊的維度由下列兩個內置變量指定。
.blockDim(線程塊的維度,用每個線程塊中的線程數來表示)
.gridDim (線程格的維度,用每個線程格中的線程數來表示)
它們是dim3類型的變量,是基於uint3定義的整數型向量,用來表示維度。當定義一個dim3類型的變量時,所有未指定的元素都被初始化爲1。dim3類型變量中的每個組件可以通過它的x、y、z字段獲得。如下所示。

blockDim.x
blockDim.y
blockDim.z
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章