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的要求。