CUDA 從GPU結構理解執行緒

2021-09-02 16:26:44 字數 1418 閱讀 3653

在使用gpu執行緒時不是執行緒越多就越好,其實從硬體角度分析,支援cuda的nvidia 顯示卡,都是由多個multiprocessors 組成。每個 multiprocessor 裡包含了8個stream processors,其組成是四個四個一組,也就是兩組4d的處理器。

每個 multiprocessor 還具有 很多個(比如8192個)暫存器,一定的(比如16kb) share memory,以及 texture cache 和 constant cache

在 cuda 中,大部份基本的運算動作,都可以由 stream processor 進行。每個 stream processor 都包含乙個 fma(fused-multiply-add)單元,可以進行乙個乘法和乙個加法。比較複雜的運算則會需要比較長的時間。

在執行 cuda 程式的時候,每個 stream processor 就是對應乙個 thread。每個 multiprocessor 則對應乙個 block。但是我們乙個block往往有很大量的執行緒,之前我們用到了256個和1024個,遠超乙個 multiprocessor 所有的8個 stream processor 。

實際上,雖然乙個 multiprocessor 只有八個 stream processor,但是由於 stream processor 進行各種運算都有 latency,更不用提記憶體訪問的 latency,因此 cuda 在執行程式的時候,是以warp 為單位。

比如乙個 warp 裡面有 32 個 threads,分成兩組 16 threads 的 half-warp。由於 stream processor 的運算至少有 4 cycles 的 latency,因此對乙個 4d 的stream processors 來說,一次至少執行 16 個 threads(即 half-warp)才能有效隱藏各種運算的 latency。也因此,執行緒數達到隱藏各種latency的程度後,之後數量的提公升就沒有太大的作用了。

還有乙個重要的原因是,由於 multiprocessor 中並沒有太多別的記憶體,因此每個 thread 的狀態都是直接儲存在multiprocessor 的暫存器中。所以,如果乙個 multiprocessor 同時有愈多的 thread 要執行,就會需要愈多的暫存器空間。例如,假設乙個 block 裡面有 256 個 threads,每個 thread 用到20 個暫存器,那麼總共就需要 256x20 = 5,120 個暫存器才能儲存每個 thread 的狀態。

而一般每個 multiprocessor 只有 8,192 個暫存器,因此,如果每個 thread 使用到16 個暫存器,那就表示乙個 multiprocessor 的暫存器同時最多只能維持 512 個 thread 的執行。如果同時進行的 thread 數目超過這個數字,那麼就會需要把一部份的資料儲存在顯示卡記憶體中,就會降低執行的效率了。

GPU 高效能程式設計 CUDA 執行緒協作

並行執行緒塊的分解 在向量加法中,為向量中的每乙個元素都啟動乙個執行緒塊 add dev a,dev b,dev c 尖括號中的第乙個引數建立的執行緒塊的數量,第二個引數表示每個執行緒塊中建立的執行緒數量,所以上述啟動的執行緒數量為 n n 1 使用執行緒實現 gpu 上的向量求和 需要修改兩個地方...

CUDA下的GPU程式設計 執行緒和變數

cuda的執行緒是多維的,啟動乙個執行緒格,執行緒格可以是多維的,執行緒格中分為執行緒塊,執行緒塊也可以是多維的,執行緒塊中包含執行緒,對於gpu來說,同時啟動200萬個執行緒是很輕易的事情。blockidx 當前執行裝置 的執行緒塊的索引 dim3 grid dim,dim 宣告乙個二維的執行緒格...

CUDA精講(2) GPU體系結構之執行緒執行

本講是cuda精講的第二部分,在cuda精講 1 中主要列出了cuda程式設計的一些基本概念。為了進一步地深入cuda的系統優化我們需要了解gpu的硬體體體系結構。大部分的處理器體系結構都可以分成計算 儲存 控制三部分。gpu中主要強調計算 thread exection 與儲存 memory hi...