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

看板C_and_CPP (C/C++)作者 (洨菌)時間10年前 (2016/05/07 22:07), 10年前編輯推噓0(002)
留言2則, 1人參與, 最新討論串2/2 (看更多)
一個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閒置 : 手機發文,排版方面可能欠佳,先謝謝各位前輩指導 : ----- : Sent from JPTT on my Sony D6653. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.228.229.175 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462630078.A.B5E.html ※ 編輯: jun0325 (36.228.229.175), 05/07/2016 22:08:55 ※ 編輯: jun0325 (36.228.229.175), 05/07/2016 22:11:39 ※ 編輯: jun0325 (36.228.229.175), 05/07/2016 22:12:30

05/08 00:16, , 1F
不過如果先塞進來的warp遇到syncthreads 還是必須等剩下
05/08 00:16, 1F

05/08 00:16, , 2F
的warp都進來之後才能往下做
05/08 00:16, 2F
文章代碼(AID): #1NBVQ-jU (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1NBVQ-jU (C_and_CPP)