Re: [問題] CUDA的核心與block分配問題

作者: jun0325 (俊)   2016-05-07 22:07:55
一個SM的warp scheduler可以schedule來自不同block的warp
概念就是
我現在有一個warp pool
而這個warp pool的warps是來自不同的block
warp scheduler根據heuristic的policy
每個cycle去從這個warp pool去選最適合的warp來issue
而SM裡面的warp scheduler可能不只一個要看硬體
kepler有四個 (issue width = 4)
fermi有兩個 (issue width = 2)
這有點像super scalar的概念
同一個cycle可以issue多個independent的warp instruction
基本上warp scheduler的policy最簡單也最好用的是GTO
(大部分情況下也比RR好)
回歸正題,現在的架構下
一個block"的確"要等到
最後一個warp執行完,才會release他所佔的資源
(寫個簡單的小程式就可以了,
讓block中的其中一個thread做dummy的for-loop就可以了)
這點也在GPGPU-sim裡面得到驗證,裡面模擬的model
就是一定要等到最後一個warp執行完才能release所佔的資源(reg shared)
新的block才能下下來
(雖然GPGPU-sim目前還停留在GTX480...)
這也就是為什麼在寫CUDA的時候,盡量要讓每個thread的
工作量都要相近,這樣才能盡可能在同一個時間點做完
避免造成load imbalance的問題
W大所說的可以先偷塞新的block的warp進去SM
也不是不可能
因為原本SM對於資源的management是以"block granularity"
也就是說,一個block結束,才會release所佔的資源
當你想對資源的掌控是以"warp granularity"
想當然爾,就會比block granularity來得更複雜
需要多增加硬體的去管理SM上面的resource
稍微想了一下大概有幾點是需要考慮的:
1. # of blocks or # of threads
當這個kernel bound to # of blocks or # or threads/warps的時候
除非你把那個block裡的最後一個warp執行完
否則永遠沒辦法偷丟新的block裡面的warp
當然硬體的解當然是去突破這個# of blocks or # of threads/warps的限制
2. Shared Memory
當這個kernel bound to shared memory的時候
你沒辦法偷丟新的block的新的warp下來
因為根本沒有足夠的shared memory給你放新的block
你最後一個warp沒執行完
沒辦法release這塊shared memory
因為你永遠不知道這個warp剩下的指令還會不會再讀寫這塊memory
其實最根本的原因就是
shared memory是visible to all the warps in a block
所以不能亂release啊...
如果你說
啊我只偷丟一個warp進來,用不到shared memory吧?
那萬一你這個warp也用到shared memory,那不就GG了
3.
如果都沒bound to 上面兩個條件的話
register感覺是比較有機會能做到W大所說的方法
因為register本來就是warp自己在用的
為了達到
"在舊的block剩最後一個warp還沒執行完
卻想要丟新的warp進去的目的"
我們就需要建一個register usage的table
當提早執行完的warp
就去mark 這個table的那段register是free的
當新的warp進來時
去check這個table那些區段的register是available的就行了
重點還是
The registers of one warp are only visible to the warp
以上是我對於NV的架構下
對於
"是否能在舊的block還沒執行完的條件下
能否塞新的block的warp到SM
需要對硬體做什麼修改的討論"
歡迎大家來討論~~~
※ 引述《Yan5566 (Lee)》之銘言:
: 各位前輩好
: 小弟近來接觸CUDA 在warp與core的觀念上有問題
: 目前我已知所有的block會被自動分配到各個SM
: 在一個SM中,每個block中的thread以warp為單位執行
: 我的問題如下:
: 假設在一個block中最後一個warp快結束了
: 那麼其他的core會先執行下一個block中的warp
: 還是會等一個block中所有的warp執行完,才會執行下一個block
: 如果是前者,這樣是不是就代表無法避免有core閒置
: 手機發文,排版方面可能欠佳,先謝謝各位前輩指導
:
作者: freef1y3 ( )   2016-05-08 00:16:00
不過如果先塞進來的warp遇到syncthreads 還是必須等剩下的warp都進來之後才能往下做

Links booklink

Contact Us: admin [ a t ] ucptt.com