我是CUDA和GPU架构的新手。 我运行了这个code。
结果是我只得到了网格的尺寸。我知道每个网格都有3维,并且有很多块。在每个块中,又有x y z个线程。我的问题是,GPU中有多少个网格(或者它是独立于GPU的)?如果是这样,我如何找到它?如何处理需要多个线程的情况?
答案 0 :(得分:3)
一个网格有效地代表了一个内核启动,即它包含了要为一个特定内核启动运行的所有块(以及线程)。关于块和网格的尺寸存在某些限制,这些限制主要是特定于体系结构的(通常,对于同一代的所有GPU模型,它们在很大程度上是相同的)。您可以找到所有特定于设备的限制和功能的详细列表in the CUDA programming guide。
如何选择块尺寸主要是由以下因素之间的权衡决定的:获得良好的内存访问模式(以优化工作的方式进行划分,以优化合并的全局内存访问),线程组可以通过共享内存进行通信,以及达到理想的入住率。
尽管最大块数以及可能还有网格大小(尽管后者几乎不成问题)将因此影响您编写和运行CUDA内核的方式,但是通常只有在以下情况下才需要考虑最大网格数:您使用Dynamic Parallelism。如果您的内核没有完全占用GPU,驱动程序可能也会与内核执行if possible重叠,但是,您实际上并没有对此的明确控制。
答案 1 :(得分:1)
CUDA中的网格就像一个工作空间。在查询代码中,您在块中获得的尺寸(即尺寸0)是指该块中的线程数。在现代GPU中,大多数情况下为1024 * 1024 * 64。网格尺寸以x,y和z尺寸显示块数。网格就像一个工作区,您可以在运行__全局__函数时选择所需的块数和所需的每个块的线程。