看板 C_and_CPP 關於我們 聯絡資訊
各位前輩好 小弟近來接觸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
walelile: 硬體那邊沒有block的概念 執行最小單位就是warp 11/06 12:34
walelile: 至於他挑warp的schedule alg就有round-robin等 11/06 12:36
freef1y3: 還是有吧 不然syncthreads就不知道要暫停那些warp了 11/06 12:37
walelile: gpgpu-sim模擬器裡面以前的版本有四種演算法可以選 11/06 12:37
walelile: 也是 11/06 12:40
freef1y3: 我覺得應該是一個block完全結束後下一個block才會遞補 11/06 12:44
freef1y3: 否則底層的資源管理會很麻煩 11/06 12:46
freef1y3: 要保留尚未完全結束的block占用的資源(ex: shared mem) 11/06 12:49
freef1y3: 同時又要空出位置給新的block進來之類 11/06 12:50
walelile: nv會去算shared mem使用量來限制同時執行的warp數量 11/06 12:52
freef1y3: 至於core閒置的問題應該有幾個改善方法 11/06 12:52
freef1y3: 1. 改用較小的block size 11/06 12:52
walelile: 至少fermi那個世代有這行為 11/06 12:53
freef1y3: 2. 增加每個block的計算量 11/06 12:53
freef1y3: 印象中shared mem限制的應該是同時執行的block數量 11/06 12:54
freef1y3: 當然block數量也會影響warp數量就是了 11/06 12:56
freef1y3: 不過我的意思是若要允許一個block尚未執行完 11/06 12:58
walelile: 他不可能是等一個block執行完才遞補下一個 11/06 12:58
walelile: 這樣load memory的latency會很明顯 11/06 12:59
freef1y3: 下一個block就進來 這樣占用的資源會更多 11/06 12:59
freef1y3: 可能沒講清楚 我的意思不是同時只能有一個block跑 11/06 13:01
freef1y3: 假設同時可以跑2個block好了,現在有2個block在跑 11/06 13:04
freef1y3: 但其中一個block只剩一個warp還沒結束 11/06 13:05
freef1y3: 這種情況應該還是要等那個warp結束 下一個block才會進來 11/06 13:05
walelile: 如果要更aggressive,硬體還是可以讓其他的block先進 11/06 13:10
freef1y3: 是有可能 但是還沒結束的那個block占用的shared mem 11/06 13:11
freef1y3: 總不能先釋放掉吧? 11/06 13:11
freef1y3: 所以就變成在兩個block都占用shared mem的狀況下 11/06 13:12
freef1y3: 還要再空出一份shared mem讓新block進來 11/06 13:12
freef1y3: 除非你能以warp為單位來釋放shared mem 11/06 13:13
walelile: 運算開始跟結假如是mem讀寫,他放其他warp近來先讀資料 11/06 13:13
walelile: 他只要知道那塊被占用的shared mem不會再被用就好了 11/06 13:14
walelile: 還有機會提高記憶體頻寬的使用效率 11/06 13:15
freef1y3: 其實討論可能性當然都很難說死沒辦法做到 11/06 13:27
freef1y3: 但是原PO關心的應該是CUDA目前的實作是採用什麼方式 11/06 13:28
freef1y3: 這應該寫個小程式來實驗就可以了..等我有空再來寫吧 11/06 13:29
johnjohnlin: 一個sm可以支援很多block在上面跑,不會有這個問題 11/06 16:01
johnjohnlin: 至於幾個,請google cuda occupancy calculator 11/06 16:02
mike0227: 一個SM同一時間只會處理跑同一個warp內的指令 11/07 15:55
mike0227: 所以不會出現原po問題內"部分core"閒置的狀況 11/07 15:56
mike0227: stall就是整個SM一起等 不會只有部分core在跑 11/07 15:58
也就是說在一個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
johnjohnlin: 可以從很多個block選warp來塞core 11/07 23:26
願聞其詳!! ※ 編輯: Yan5566 (1.173.26.97), 11/08/2015 02:17:08
mike0227: 不一定要同一個block 只要資源夠 多個blocks可以同時在 11/08 04:23
mike0227: 同一個SM上 你會有更多機會蓋掉global access latency 11/08 04:24
mike0227: Occupancy calculator就是在算同時可有多少Blocks和 11/08 04:25
mike0227: threads在同一個SM上 但是要注意 不一定越高越好 11/08 04:26
johnjohnlin: 我一般寫的時候,大致上以越高越好為準則 11/08 12:25
johnjohnlin: 不過我得有一篇paper有提到樓上那件事,好像標題 11/08 12:26
johnjohnlin: 開頭是neiter more or less的,有興趣可以找找看 11/08 12:27
jun0325: 一個SM的warp scheduler可以schedule來自在不同block的 05/07 21:02
jun0325: warp (SM裡面的warp scheduler可能不只一個要看硬體) 05/07 21:03
jun0325: 基本上warp scheduler的policy最簡單也最好用的是GTO 05/07 21:04
jun0325: (大部分情況下比RR好) 回歸正題,一個block"的確"要等到 05/07 21:05
jun0325: 最後一個warp執行完,才會release他所佔的資源 05/07 21:05
jun0325: 這也就是為什麼在寫CUDA的時候,盡量要讓每個thread的 05/07 21:06
jun0325: 工作量都要相近,這樣才能盡可能在同一個時間點做完 05/07 21:06
jun0325: 早點release resource給下一個block使用 05/07 21:07
jun0325: W大所說的可以先偷塞新的block的warp進去SM 05/07 21:08
jun0325: 但這就增加了硬體對於SM管理資源的複雜度 05/07 21:09
jun0325: 你要特別建一個表去記錄那個快結束block中的warp 05/07 21:10
jun0325: 分別占了SM上面的那些資源(Register, Shared Memory) 05/07 21:11
jun0325: 因為原本SM對於資源的控管是以block granularity 05/07 21:14
jun0325: 如果要達成W大所說的那個方式,就要對每個"warp"都要去 05/07 21:15
jun0325: 記錄他們所站的資源 05/07 21:15