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