GPU中的网格、块和线程数

4

我对CUDA和GPU架构很陌生。我运行了这个代码

结果中,我只得到了一个网格的维数。我知道每一个网格有3个维度,并且有同样数量的块。在每个块中,又有x*y*z个线程。

我的问题是:一个GPU中有多少个网格(或者是否与GPU无关),如果是,我怎样才能找到它,以及如何处理需要大量线程的情况?

2个回答

3
一个网格有效地代表了一个核心启动,即它包含所有要运行的块(因此也包括线程)的一个特定核心启动。有关块和网格尺寸的限制存在,这些限制主要是架构特定的(通常对于同一代GPU型号而言,它们基本相同)。您可以在CUDA编程指南中找到所有设备特定限制和功能的详细列表。
如何选择块的尺寸主要取决于获取良好的内存访问模式(将工作划分为旨在优化联合全局内存访问的方式),哪些线程组可以通过共享内存进行通信,并实现所需的占用率之间的权衡。

尽管最大块大小和可能的网格大小(虽然后者几乎不会成为问题)会影响您编写和运行CUDA内核的方式,但通常只有在使用动态并行性时才会关注最大网格数。如果您的内核没有完全占用GPU,则驱动程序可能也会重叠内核执行(如果可能),但您实际上无法明确控制。


1
CUDA中的网格类似于工作空间。在查询代码中,您获得的维度(例如块中的维度0)指的是该块中的线程数,在现代GPU中通常为1024 * 1024 * 64。网格维度显示x、y和z维度中块的数量。网格就像一个工作空间,您可以在运行__ global __函数时选择所需的块数和每个块的线程数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接