關於如何選擇#blocks & blockSize已經有很多討論,但我仍然缺少一些東西。我的很多顧慮解決這個問題:How CUDA Blocks/Warps/Threads map onto CUDA Cores?(爲了簡化討論,有足夠的perThread & perBlock內存內存限制是不是一個問題在這裏。)塊,線程,warpSize
kernelA<<<nBlocks, nThreads>>>(varA,constB, nThreadsTotal);
1)爲了保持SM儘可能忙,我應該將nThreads
設置爲warpSize
的倍數。真正?
2)SM一次只能執行一個內核。那是所有SM的HWcores只執行kernelA。 (不是一些運行kernelA的HWcore,而有的運行kernelB。)所以如果我只有一個線程運行,我會「浪費」其他HWcores。真正? 3)如果warp-scheduler問題的工作單位是warpSize
(32個線程),並且每個SM有32個HWCore,那麼SM將被充分利用。當SM有48個HWcores時會發生什麼?當調度程序以32個塊的形式發佈工作時,如何保持所有48個內核的全部利用率? (如果前面的段落是真的,如果調度器以HWcore大小爲單位發佈工作會不會更好?)
4)它看起來像warp-scheduler一次排隊2個任務。因此,當正在執行的內核停頓或阻塞時,第二個內核被交換。(不清楚,但我猜這裏的隊列深度超過2個內核。)這是正確的嗎? 5)如果我的硬件上限爲512個線程(nThreadsMax),這並不意味着512個線程的內核在一個塊上運行速度最快。 (同樣,mem也不是問題。)如果我將512線程內核分佈在多個塊中,而不僅僅是一個,那麼我很有可能會獲得更好的性能。該塊在一個或多個SM上執行。真正?我認爲越小越好,但是我有多小我想要做什麼nBlocks
?問題是,如何選擇nBlocks
的價值體面呢? (不一定是最佳的。)是否有數學方法來選擇nBlocks
,還是僅僅是試用n-err。
該GPU擁有192個CudaCores。那將是4個SM,有48個硬件核心(HWcores)。 4 * 48 = 192 – Doug