[原]CUDA中grid、block、thread、warp与SM、SP的关系
[原]CUDA中grid、block、thread、warp與SM、SP的關系
2015-3-27閱讀209 評論0
首先概括一下這幾個概念。其中SM(Streaming Multiprocessor)和SP(streaming Processor)是硬件層次的,其中一個SM可以包含多個SP。thread是一個線程,多個thread組成一個線程塊block,多個block又組成一個線程網格grid。
現在就說一下一個kenerl函數是怎么執行的。一個kernel程式會有一個grid,grid底下又有數個block,每個block是一個thread群組。在同一個block中thread可以通過共享內存(shared memory)來通信,同步。而不同block之間的thread是無法通信的。
CUDA的設備在實際執行過程中,會以block為單位。把一個個block分配給SM進行運算;而block中的thread又會以warp(線程束)為單位,對thread進行分組計算。目前CUDA的warp大小都是32,也就是說32個thread會被組成一個warp來一起執行。同一個warp中的thread執行的指令是相同的,只是處理的數據不同。
基本上warp 分組的動作是由SM 自動進行的,會以連續的方式來做分組。比如說如果有一個block 里有128 個thread 的話,就會被分成四組warp,第0-31 個thread 會是warp 1、32-63 是warp 2、64-95是warp 3、96-127 是warp 4。而如果block 里面的thread 數量不是32 的倍數,那他會把剩下的thread獨立成一個warp;比如說thread 數目是66 的話,就會有三個warp:0-31、32-63、64-65 。由于最后一個warp 里只剩下兩個thread,所以其實在計算時,就相當于浪費了30 個thread 的計算能力;這點是在設定block 中thread 數量一定要注意的事!
一個SM 一次只會執行一個block 里的一個warp,但是SM 不見得會一次就把這個warp 的所有指令都執行完;當遇到正在執行的warp 需要等待的時候(例如存取global memory 就會要等好一段時間),就切換到別的warp來繼續做運算,借此避免為了等待而浪費時間。所以理論上效率最好的狀況,就是在SM 中有夠多的warp 可以切換,讓在執行的時候,不會有「所有warp 都要等待」的情形發生;因為當所有的warp 都要等待時,就會變成SM 無事可做的狀況了。
總結
以上是生活随笔為你收集整理的[原]CUDA中grid、block、thread、warp与SM、SP的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 45万例患者基因检测显示:NGS很难检测
- 下一篇: 别人运行的好好的R代码,到我这怎么就冲突