GPU 中的网格、块和线程数
Number of grids, blocks and threads in a GPU
我是 CUDA 和 GPU 架构的新手。
我 运行 这个 code .
结果我只得到了网格的尺寸。我知道每个网格都有 3 个维度,并且有那么多块。在每个块中,又有 xyz 个线程。我的问题是 GPU 中有多少个网格(或者它是否独立于 GPU),如果是,我如何找到它以及如何处理需要超过这么多线程的情况?
CUDA 中的网格就像一个作品space。在查询代码中,您获得的维度即块中的维度 0 指的是该块中的线程数。在现代 GPU 中,大多数情况下是 1024*1024*64。网格维度显示 x、y 和 z 维度中的块数。网格就像一个工作space,你select你需要的块数和每个块你需要的线程,而运行一个__全局__函数。
一个网格有效地代表了一次内核启动,即,它包含所有块(以及线程),这些块将 运行 用于一个特定的内核启动。块和网格的尺寸有一定的限制,主要是特定于体系结构的(通常,它们对于同一代的所有 GPU 型号基本相同)。您可以找到所有特定于设备的限制和功能的详细列表 in the CUDA programming guide。
你如何选择你的块维度将主要取决于获得良好的内存访问模式(以旨在优化合并的全局内存访问的方式划分工作)之间的权衡,哪些线程组可以通过共享内存进行通信,并达到理想的入住率。
虽然最大块和可能还有网格大小(尽管后者几乎不是问题)会因此影响您的编写方式和 运行 您的 CUDA 内核,但最大网格数通常会仅当您使用 Dynamic Parallelism. If your kernels do not fully occupy the GPU, the driver may also overlap kernel execution if possible 时才需要担心,但是,您并没有真正明确地控制它。
我是 CUDA 和 GPU 架构的新手。 我 运行 这个 code .
结果我只得到了网格的尺寸。我知道每个网格都有 3 个维度,并且有那么多块。在每个块中,又有 xyz 个线程。我的问题是 GPU 中有多少个网格(或者它是否独立于 GPU),如果是,我如何找到它以及如何处理需要超过这么多线程的情况?
CUDA 中的网格就像一个作品space。在查询代码中,您获得的维度即块中的维度 0 指的是该块中的线程数。在现代 GPU 中,大多数情况下是 1024*1024*64。网格维度显示 x、y 和 z 维度中的块数。网格就像一个工作space,你select你需要的块数和每个块你需要的线程,而运行一个__全局__函数。
一个网格有效地代表了一次内核启动,即,它包含所有块(以及线程),这些块将 运行 用于一个特定的内核启动。块和网格的尺寸有一定的限制,主要是特定于体系结构的(通常,它们对于同一代的所有 GPU 型号基本相同)。您可以找到所有特定于设备的限制和功能的详细列表 in the CUDA programming guide。
你如何选择你的块维度将主要取决于获得良好的内存访问模式(以旨在优化合并的全局内存访问的方式划分工作)之间的权衡,哪些线程组可以通过共享内存进行通信,并达到理想的入住率。
虽然最大块和可能还有网格大小(尽管后者几乎不是问题)会因此影响您的编写方式和 运行 您的 CUDA 内核,但最大网格数通常会仅当您使用 Dynamic Parallelism. If your kernels do not fully occupy the GPU, the driver may also overlap kernel execution if possible 时才需要担心,但是,您并没有真正明确地控制它。