• 沒有找到結果。

第二章、 CUDA 基礎架構

2.3 CUDA 程式

2.3.2 記憶體配置

在軟體內可分為 thread、block 與 grid,而每個部分所使用的記憶體又有所區 分,因此可以將 GPU 的記憶體分成:

1. 全域記憶體(global memory)

2. 常數記憶體(constant memory)

3. 共享記憶體(shared memory)

4. 暫存器(register)

5. 材質記憶體(texture memory,目前沒使用到)

以上記憶體分佈如圖 2.3.2.1 表示 CUDA 內分別對應到的記憶體。

圖 2.3.2.1 CUDA 內對應到的記憶體。

global memory 是用來存取由 Host 端傳進來的所有資訊,當存取完 Host 端 的資訊時,之後會分配到各個記憶體內,生命期為一個 grid 內所有 thread 都計 算完的時間,global memory 記憶體寬頻是最慢的;constant memory 主要是存取 由 Host 端傳遞到 Device 端的固定資訊,容量大約 64k,生命期與 global memory 一樣,記憶體寬頻比 shared memory 快;shared memory 用來存取共享資料,讓

15

GPU 在計算時可互相傳遞資訊,每個 block 都擁有 shared memory,容量大約 16k,

使 block 內的 thread 互相溝通,而生命期為一個 block 內所有 thread 計算完的時 間,記憶體寬頻比 global memory 快;register 專門存取正在做計算的暫存資料,

每個 thread 擁有數個 register,不同型號 GPU 擁有數量都不一樣,當 thread 計算 完後,儲存的資訊會自動被刪除,因此生命期只有在 thread 內計算完的時間,對 於傳送速率而言,花費時間幾乎零秒就傳完了,而 thread 內的 register 記憶體空 間不足以存取所有資訊時,thread 會將剩餘的資訊存在 global memory 內,因此 計算速度會變慢,相當於我們使用 CPU 計算程式,當電腦記憶體不足以存取所

16

圖 2.4.1 CUDA 傳送 block 到 GPU 內的 SM 示意圖。

由上述得知 CUDA 將 block 傳送至 SM,當 block 數量大於 SM 時,GPU 會 先執行與 SM 個數相符的 block 數量,其餘的 block 會閒置,等到這些 block 執 行完成後或等待時[例如存取 global memory 需要花費許多時間],才會將閒置的 block 傳送至 SM 做計算,至於先前等待中的 block 會變成閒置狀態繼續等下一 輪執行;block 可分成很多個 warp,SM 會先執行一個 warp,其餘的 warp 閒置,

等這一個 warp 執行完後才會執行下一個 warp,圖 2.4.2 表示觀察 1 個 SM 執行 block 與 warp 的順序;warp 有 32 個 thread,是利用 SM 內的 SP 運行程式,SM 通常有 8 個 SP,因此他會同時計算 warp 內 8 個 thread,計算完成後才會繼續計 算其它 thread。

圖 2.4.2 warp 在 1 個 SM 運作情形:假設每個 warp 需要運作的時間都是 2 個週期。

當 1 個 warp 沒有滿 32 個 thread 時,SM 還是一次只會執行 1 個 warp,這會 使某幾個 SP 閒置著,造成資源上的浪費。如圖 2.4.3 範例,Block 內有 99 個 thread,

17

此時 Thread 可分為 4 個 warp,分別是 32、32、32、3 個 thread,發現 warp4 只 有 3 個 Thread,而利用 SM 執行這個 warp 時,會造成 5 個 SP 閒置,使程式無 法最佳化,因此在定義 block 內 thread 個數時,最好設定能被 32 整除的數目。

圖 2.4.3 warp 傳送至 SM 計算範例,當 warp4 不足 32 個 Thread 會造成資源浪費。

18

相關文件