CUDA程序如何選擇最優的grid和block size
疑問
之前一直不太明白的一點:在thread總數確定的情況下,grid size(block number) 和block size(thread number per block)如何組合?
比如說想在8個SM上跑10248個thread,那可以81024,也可以16512,或32256,如何選擇最佳?
Background
首先明確GPU軟硬件的一些情況:
- 計算engine中有很多SM,每個SM有很多core。
- cuda程序中的每個block是跑在GPU中的一個SM上的,一個SM可以同時跑多個block。
- 由於GPU的SIMT架構,每個core都采用流水線機制,處理多個thread才能隱藏延遲,達到最大性能。
- 所以一個SM處理的thread數量往往大於core的數量。
- 每個SM有最大thread數量限制,每個block也有最大block數量。
- thread以warp(32個thread)為單位跑在SM上。
- 在硬件限制條件下,跑越多thread,Occupancy()越高,吞吐量應該就越高。
- 硬件限制包括線程數、維度、共享內存、寄存器等。
一些發現
- GPU中一般SM的最大thread數量限制會大於每個block的最大block數量。
- 根據網上的一些帖子,滿足SM最大thread數量的條件下,block數量少一些比較好。
總結
在需要滿足最高的吞吐量時,盡量滿足SM的最大thread數量,同時block數量盡量少。
舉例:SM最大thread:2048;block最大thread:1024.
這時就盡量安排每個SM 2個block,每個block1024個線程。當然還要滿足register、shared memory的要求。