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