CUDA 學習(七) 執行緒束

2021-07-24 01:20:26 字數 962 閱讀 7457

一、概述

執行緒束是gpu的基本執行單元。gpu是一組simd 向量處理器的集合。每一組執行緒或執行緒束中的執行緒同時執行。在理想狀態下,獲取當前指令只需要一次訪存,然後將指令廣播到這個執行緒所占用的所有sp中。

當使用gpu進行程式設計時,必須使用向量型別指令,因為gpu採用的是向量體系結構,只有讓**在成千上萬個執行緒上執行才能充分高效利用gpu的資源。

當前,gpu上的乙個執行緒束的大小為32,即 wrapsize = 32; 

二、為什麼關注執行緒束

那我們為什麼會如此關注執行緒束大小呢?具體原因如下:

(1)、分支

乙個執行緒束是乙個單獨的執行單元,使用分支(例如,if、else、for、while、do、switch)可以產生不同的執行流。在cpu上使用分支很複雜,因為它需要根據之前的運**況來**下一次執行到底執行哪一塊**。在cpu上,指令流通常會被預提取,然後放入cpu指令管線中。假設**是準確的,那麼cpu就避免了一次失速事件。如果**錯誤,cpu則需要重新執行**指令,然後獲取另乙個分支的指令,再將其添入管線之中。

相比之下,gpu 對分支的處理就沒有這麼複雜。gpu在執行完分支結構的乙個分支後接著另乙個分支。對不滿足分支條件的執行緒,gpu在執行這塊**的時候會將它們設定未啟用狀態。當這塊**執行完畢後,gpu繼續執行另外乙個分支,這時,剛剛不滿足分支條件的執行緒如果滿足當前的分支條件,那麼它們將被啟用,然後執行這一段**。最後,所有的執行緒聚合,繼續向下執行。**如下:

(2)、gpu 利用率

我們關注執行緒束的另乙個原因就是防止gpu未被充分利用。cuda 的模式是用成千上萬個執行緒來隱藏記憶體操作的延遲(從發出儲存請求到完成訪存操作所花的時間)。比較經典的,如對全域性記憶體訪問的延遲一般是400-600個時鐘週期。在這個時間裡,gpu會忙於其他任務,而不是空閒地等待訪存操作的完成。



CUDA 執行緒束分化

1.執行緒束分化 執行緒束是sm中基本的執行單元。當乙個執行緒塊的網格被啟動後,網格中的執行緒塊分布在sm中。一旦執行緒塊被排程到乙個sm上,執行緒塊中的執行緒會被進一步劃分為執行緒束。乙個執行緒束由32個連續的執行緒組成,在乙個執行緒束中,所有的執行緒按照單指令多執行緒 simt 方式執行 也就是...

七 執行緒操作

include include include include include include include include include include include define buffer 512 struct copy file void copy void arg if bytes...

Redis 七 執行緒模型

redis內部使用檔案事件處理器file event handler,這個檔案事件處理器是單執行緒的,所以redis才叫做單執行緒的模型。它採用io 多路復用機制同時監聽客戶端的多個連線 多個socket 根據socket上的事件來選擇對應的事件處理器進行處理。檔案事件處理器的結構包含4個部分 多個...