CUDA中grid、block、thread、warp与SM、SP的关系
首先概括一下這幾個(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ì)根據(jù)其內(nèi)部SP數(shù)目分配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ú)事可做的狀況了。
實(shí)際上,warp 也是CUDA 中,每一個(gè)SM 執(zhí)行的最小單位;如果GPU 有16 組SM 的話,也就代表他真正在執(zhí)行的thread 數(shù)目會(huì)是32*16 個(gè)。不過(guò)由于CUDA 是要透過(guò)warp 的切換來(lái)隱藏thread 的延遲、等待,來(lái)達(dá)到大量平行化的目的,所以會(huì)用所謂的active thread 這個(gè)名詞來(lái)代表一個(gè)SM 里同時(shí)可以處理的thread 數(shù)目。而在block 的方面,一個(gè)SM 可以處理多個(gè)線程塊block,當(dāng)其中有block 的所有thread 都處理完后,他就會(huì)再去找其他還沒(méi)處理的block 來(lái)處理。假設(shè)有16 個(gè)SM、64 個(gè)block、每個(gè)SM 可以同時(shí)處理三個(gè)block 的話,那一開(kāi)始執(zhí)行時(shí),device 就會(huì)同時(shí)處理48 個(gè)block;而剩下的16 個(gè)block 則會(huì)等SM 有處理完block 后,再進(jìn)到SM 中處理,直到所有block 都處理結(jié)束?
在CUDA 架構(gòu)下,GPU芯片執(zhí)行時(shí)的最小單位是thread。
若干個(gè)thread可以組成一個(gè)線程塊(block)。一個(gè)block中的thread能存取同一塊共享內(nèi)存,可以快速進(jìn)行同步和通信操作。
每一個(gè)block 所能包含的thread 數(shù)目是有限的。執(zhí)行相同程序的block,可以組成grid。不同block 中的thread 無(wú)法存取同一共享內(nèi)存,因此無(wú)法直接通信或進(jìn)行同步。
不同的grid可以執(zhí)行不同的程序(kernel)。
舉個(gè)栗子:
1:一個(gè)SM有8個(gè)SP,SM執(zhí)行一個(gè)Warp時(shí)有32個(gè)線程,這32各線程在8個(gè)SP上執(zhí)行4次,實(shí)際上是8個(gè)8個(gè)輪替,嚴(yán)格意義上來(lái)講不是同時(shí)執(zhí)行,只是隱藏延遲,因?yàn)檐浖游覀兪菍⑵涑橄蟪鰜?lái),因此可以說(shuō)是同時(shí)執(zhí)行。
2:當(dāng)一個(gè)SM中有更多的SP時(shí),例如GP100這種,一個(gè)SM上有64個(gè)SP,線程也不一定是平攤的,看具體架構(gòu)的官方文檔。一般情況下還是8個(gè)sp執(zhí)行4次,也就是說(shuō)當(dāng)你數(shù)據(jù)跑32個(gè)線程的時(shí)候,在有64個(gè)SP的SM里實(shí)際還是8個(gè)SP在跑,和一個(gè)SM里面只有8個(gè)SP的情況是一致的。所以一個(gè)SM有64個(gè)SP的時(shí)候,意味著最多同時(shí)可以并行8個(gè)warp,8×32線程即256和線程。此時(shí)通常情況來(lái)說(shuō)已經(jīng)滿線程了,當(dāng)架構(gòu)能進(jìn)一步降低延遲時(shí),通過(guò)抽象可以跑1024個(gè)線程。
總結(jié)
以上是生活随笔為你收集整理的CUDA中grid、block、thread、warp与SM、SP的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QT 烦人的parent该如何理解
- 下一篇: CUDA硬件架构知识