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

看板C_and_CPP作者 (Lee)時間8年前 (2015/11/06 11:08), 8年前編輯推噓6(6058)
留言64則, 5人參與, 最新討論串1/2 (看更多)
各位前輩好 小弟近來接觸CUDA 在warp與core的觀念上有問題 目前我已知所有的block會被自動分配到各個SM 在一個SM中,每個block中的thread以warp為單位執行 我的問題如下: 假設在一個block中最後一個warp快結束了 那麼其他的core會先執行下一個block中的warp 還是會等一個block中所有的warp執行完,才會執行下一個block 如果是前者,這樣是不是就代表無法避免有core閒置 手機發文,排版方面可能欠佳,先謝謝各位前輩指導 ----- Sent from JPTT on my Sony D6653. -- __ __ _ \ \ / / __ _ _ __ | | ___ ___ \ V / / _` | | '_ \ | | / _ \ / _ \ | | | (_| | | | | | | |___ | __/ | __/ |_| \__,_| |_| |_| |_____| \___| \___| -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.247.115 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1446779320.A.B78.html

11/06 12:34, , 1F
硬體那邊沒有block的概念 執行最小單位就是warp
11/06 12:34, 1F

11/06 12:36, , 2F
至於他挑warp的schedule alg就有round-robin等
11/06 12:36, 2F

11/06 12:37, , 3F
還是有吧 不然syncthreads就不知道要暫停那些warp了
11/06 12:37, 3F

11/06 12:37, , 4F
gpgpu-sim模擬器裡面以前的版本有四種演算法可以選
11/06 12:37, 4F

11/06 12:40, , 5F
也是
11/06 12:40, 5F

11/06 12:44, , 6F
我覺得應該是一個block完全結束後下一個block才會遞補
11/06 12:44, 6F

11/06 12:46, , 7F
否則底層的資源管理會很麻煩
11/06 12:46, 7F

11/06 12:49, , 8F
要保留尚未完全結束的block占用的資源(ex: shared mem)
11/06 12:49, 8F

11/06 12:50, , 9F
同時又要空出位置給新的block進來之類
11/06 12:50, 9F

11/06 12:52, , 10F
nv會去算shared mem使用量來限制同時執行的warp數量
11/06 12:52, 10F

11/06 12:52, , 11F
至於core閒置的問題應該有幾個改善方法
11/06 12:52, 11F

11/06 12:52, , 12F
1. 改用較小的block size
11/06 12:52, 12F

11/06 12:53, , 13F
至少fermi那個世代有這行為
11/06 12:53, 13F

11/06 12:53, , 14F
2. 增加每個block的計算量
11/06 12:53, 14F

11/06 12:54, , 15F
印象中shared mem限制的應該是同時執行的block數量
11/06 12:54, 15F

11/06 12:56, , 16F
當然block數量也會影響warp數量就是了
11/06 12:56, 16F

11/06 12:58, , 17F
不過我的意思是若要允許一個block尚未執行完
11/06 12:58, 17F

11/06 12:58, , 18F
他不可能是等一個block執行完才遞補下一個
11/06 12:58, 18F

11/06 12:59, , 19F
這樣load memory的latency會很明顯
11/06 12:59, 19F

11/06 12:59, , 20F
下一個block就進來 這樣占用的資源會更多
11/06 12:59, 20F

11/06 13:01, , 21F
可能沒講清楚 我的意思不是同時只能有一個block跑
11/06 13:01, 21F

11/06 13:04, , 22F
假設同時可以跑2個block好了,現在有2個block在跑
11/06 13:04, 22F

11/06 13:05, , 23F
但其中一個block只剩一個warp還沒結束
11/06 13:05, 23F

11/06 13:05, , 24F
這種情況應該還是要等那個warp結束 下一個block才會進來
11/06 13:05, 24F

11/06 13:10, , 25F
如果要更aggressive,硬體還是可以讓其他的block先進
11/06 13:10, 25F

11/06 13:11, , 26F
是有可能 但是還沒結束的那個block占用的shared mem
11/06 13:11, 26F

11/06 13:11, , 27F
總不能先釋放掉吧?
11/06 13:11, 27F

11/06 13:12, , 28F
所以就變成在兩個block都占用shared mem的狀況下
11/06 13:12, 28F

11/06 13:12, , 29F
還要再空出一份shared mem讓新block進來
11/06 13:12, 29F

11/06 13:13, , 30F
除非你能以warp為單位來釋放shared mem
11/06 13:13, 30F

11/06 13:13, , 31F
運算開始跟結假如是mem讀寫,他放其他warp近來先讀資料
11/06 13:13, 31F

11/06 13:14, , 32F
他只要知道那塊被占用的shared mem不會再被用就好了
11/06 13:14, 32F

11/06 13:15, , 33F
還有機會提高記憶體頻寬的使用效率
11/06 13:15, 33F

11/06 13:27, , 34F
其實討論可能性當然都很難說死沒辦法做到
11/06 13:27, 34F

11/06 13:28, , 35F
但是原PO關心的應該是CUDA目前的實作是採用什麼方式
11/06 13:28, 35F

11/06 13:29, , 36F
這應該寫個小程式來實驗就可以了..等我有空再來寫吧
11/06 13:29, 36F

11/06 16:01, , 37F
一個sm可以支援很多block在上面跑,不會有這個問題
11/06 16:01, 37F

11/06 16:02, , 38F
至於幾個,請google cuda occupancy calculator
11/06 16:02, 38F

11/07 15:55, , 39F
一個SM同一時間只會處理跑同一個warp內的指令
11/07 15:55, 39F

11/07 15:56, , 40F
所以不會出現原po問題內"部分core"閒置的狀況
11/07 15:56, 40F

11/07 15:58, , 41F
stall就是整個SM一起等 不會只有部分core在跑
11/07 15:58, 41F
也就是說在一個SM中,執行完一個block裡的所有warp後 才會換執行新的一個block中的第一個warp ? ※ 編輯: Yan5566 (1.173.26.97), 11/07/2015 20:17:01 ※ 編輯: Yan5566 (1.173.26.97), 11/07/2015 20:22:52

11/07 23:26, , 42F
可以從很多個block選warp來塞core
11/07 23:26, 42F
願聞其詳!! ※ 編輯: Yan5566 (1.173.26.97), 11/08/2015 02:17:08

11/08 04:23, , 43F
不一定要同一個block 只要資源夠 多個blocks可以同時在
11/08 04:23, 43F

11/08 04:24, , 44F
同一個SM上 你會有更多機會蓋掉global access latency
11/08 04:24, 44F

11/08 04:25, , 45F
Occupancy calculator就是在算同時可有多少Blocks和
11/08 04:25, 45F

11/08 04:26, , 46F
threads在同一個SM上 但是要注意 不一定越高越好
11/08 04:26, 46F

11/08 12:25, , 47F
我一般寫的時候,大致上以越高越好為準則
11/08 12:25, 47F

11/08 12:26, , 48F
不過我得有一篇paper有提到樓上那件事,好像標題
11/08 12:26, 48F

11/08 12:27, , 49F
開頭是neiter more or less的,有興趣可以找找看
11/08 12:27, 49F

05/07 21:02, , 50F
一個SM的warp scheduler可以schedule來自在不同block的
05/07 21:02, 50F

05/07 21:03, , 51F
warp (SM裡面的warp scheduler可能不只一個要看硬體)
05/07 21:03, 51F

05/07 21:04, , 52F
基本上warp scheduler的policy最簡單也最好用的是GTO
05/07 21:04, 52F

05/07 21:05, , 53F
(大部分情況下比RR好) 回歸正題,一個block"的確"要等到
05/07 21:05, 53F

05/07 21:05, , 54F
最後一個warp執行完,才會release他所佔的資源
05/07 21:05, 54F

05/07 21:06, , 55F
這也就是為什麼在寫CUDA的時候,盡量要讓每個thread的
05/07 21:06, 55F

05/07 21:06, , 56F
工作量都要相近,這樣才能盡可能在同一個時間點做完
05/07 21:06, 56F

05/07 21:07, , 57F
早點release resource給下一個block使用
05/07 21:07, 57F

05/07 21:08, , 58F
W大所說的可以先偷塞新的block的warp進去SM
05/07 21:08, 58F

05/07 21:09, , 59F
但這就增加了硬體對於SM管理資源的複雜度
05/07 21:09, 59F

05/07 21:10, , 60F
你要特別建一個表去記錄那個快結束block中的warp
05/07 21:10, 60F

05/07 21:11, , 61F
分別占了SM上面的那些資源(Register, Shared Memory)
05/07 21:11, 61F

05/07 21:14, , 62F
因為原本SM對於資源的控管是以block granularity
05/07 21:14, 62F

05/07 21:15, , 63F
如果要達成W大所說的那個方式,就要對每個"warp"都要去
05/07 21:15, 63F

05/07 21:15, , 64F
記錄他們所站的資源
05/07 21:15, 64F
文章代碼(AID): #1MF1cuju (C_and_CPP)
文章代碼(AID): #1MF1cuju (C_and_CPP)