→ 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