一、概述
物理概念:SP、Warp和SM的關係
一個SM由多個Warp組成,一個Warp由多個SP組成。
- Streaming Processor(SP): 最基本的處理單元。一個SP對應一個thread。
- Warp:最基本的執行單元。Warp是SM調度和執行的基礎概念,一個SM中的SP(Thread)會分成幾個warp。
- Streaming Multiprocessor(SM):多個sp加上其他的一些資源組成一個SM。其他資源也就是存儲資源,共享內存,寄儲器等。可見,一個SM中的所有SP是先分成warp的,是共享同一個memory和instruction unit。
邏輯概念:Thread、Block和Grid的關係
一個Grid由多個Block組成,一個block由多個Thread組成。
Grid可以是二維結構、也可以是三維結構。
二維結構:
三維結構:
二、GPU的存儲結構
GPU的存儲系統:
register | shared memory | local memory | global memory | constant memory | texture memory |
---|---|---|---|---|---|
寄存器 | 共享內存 | 局部內存 | 全局內存 | 常量內存 | 紋理內存 |
register | shared memory | local memory | global memory | constant memory | texture memory | |
---|---|---|---|---|---|---|
主機訪問權限 | 否 | 否 | 否 | 讀寫 | 讀寫 | 讀寫 |
GPU訪問權限 | 同線程讀寫 | 同block讀寫 | 同線程讀寫 | 讀寫 | 只讀 | 只讀 |
速度 | 最快 | 快 | 慢 | 慢 | 快 | 快 |
容量 | 很小 | 一般是48K | 小 | 很大 | 小 | 小 |
寄存器
與CPU不同,GPU的每個SM(流多處理器)有成千上萬個寄存器,在GPU技術簡介中已經提到,SM類似於CPU的核,每個SM擁有多個SP(流處理器),所有的工作都是在SP上處理的,GPU的每個SM可能有8~192個SP,這就意味着,SM可同時運行這些數目的線程。
寄存器是每個線程私有的,並且GPU沒有使用寄存器重命名機制,而是致力於爲每一個線程都分配真實的寄存器,CUDA上下文切換機制非常高效,幾乎是零開銷。當然,這些細節對程序員是完全透明的。
和CPU一樣,訪問寄存器的速度是非常快的,所以應儘量優先使用寄存器。無論是CPU還是GPU,通過寄存器的優化方式都會使程序的執行速度得到很大提高。
舉一個例子:
for (int i = 0; i < size; ++i)
{
sum += array[i];
}
sum如果存於內存中,則需要做size次讀/寫內存的操作,而如果把sum設置爲局部變量,把最終結果寫回內存,編譯器會將其放入寄存器中,這樣只需1次內存寫操作,將大大節約運行時間。
Local memory
Local memory和寄存器類似,也是線程私有的,訪問速度比寄存器稍微慢一點。
事實上,是由編譯器在寄存器全部使用完的時候自動分配的。在優化程序的時候可以考慮減少block的線程數量以使每個線程有更多的寄存器可使用,這樣可減少Local memory的使用,從而加快運行速度。
共享內存
每個線程塊都有一個共享內存,該線程塊中的線程都可以讀取該內存,其他線程塊的線程無法訪問該共享內存。共享內存幫助同一線程塊的線程通信與協作。並且共享內存緩存區實在物理GPU上,而不是其他與GPU相連的設備上,訪問效率更高。
常量內存
常量內存通過__constant__來修飾變量,被限制爲只讀。
1.對常量內存的單次讀操作可以廣播到該線程的半線程數中,減少15讀操作。
2.常量內存的數據將緩存起來,因此對相同地址的連續讀操作不會產生額外通信量。