CUDA程序如何选择最优的grid和block size

CUDA程序如何选择最优的grid和block size

0.0762020.07.26 00:32:15字数 435阅读 940

疑问

之前一直不太明白的一点:在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的要求。

转自https://www.jianshu.com/p/11e75686892a

原文地址:https://www.cnblogs.com/yuyuanbaobei521/p/14272270.html