1

我的 GPU 能力为 2.1,有 2 个 SM,每个 SM 有 48 个内核。根据 CUDA-C 编程指南中提供的技术规范,网格的最大块数为 65535,每个多处理器的最大驻留块数为 8。

我对可以启动多少块感到困惑。如果每个 SM 的最大块数为 8,这是否意味着如果只有 2 个 SM,我最多可以启动 16 个块?但是我成功地启动了更多的块。

也许有诸如活动块和非活动块之类的东西?如果这是事实,那么这些块是如何安排的?不活动的是否等到所有 8 个活动块都完成?但这带来了同步问题......


还有一些问题……如果每个 SM 上有 48 个核心,那么可以同时执行 3 个半扭曲。但是共享内存只有 32 个 bank。如果两个线程同时尝试从同一个band中读取,即使它们属于不同的half-warp,它们是否会产生bankconflict?

4

2 回答 2

2

我参加聚会肯定迟到了,但由于之前的答案未被接受,我提供了一个希望帮助其他用户解决同样问题的答案。

一个 SM 中可以包含的最大块数是指给定时间内的最大活动块数。块可以组织成一维或二维网格,每个维度最多包含 65,535 个块,但 GPU 的 SM 将只能容纳一定数量的块。此限制以两种方式与您的 Gpu 的计算能力相关联。

  1. CUDA 规定的硬件限制。

每个 gpu 允许每个 SM 的最大块限制,无论它包含的线程数和使用的资源量如何。例如,计算能力为 2.0 的 GPU 的限制为 8 Blocks/SM,而计算能力为 7.0 的 GPU 的限制为 32 Blocks/SM。这是您可以实现的每个 SM 的最佳活动块数:我们称之为 MAX_BLOCKS。

  1. 限制来自每个块使用的资源量。

块由线程组成,每个线程使用一定数量的寄存器:它使用的寄存器越多,包含它的块使用的资源数量就越多。类似地,分配给块的共享内存量增加了块需要分配的资源量。一旦超过某个值,一个块所需的资源数量将如此之大,以至于 SM 将无法分配 MAX_BLOCKS 允许的尽可能多的块:这意味着每个块所需的资源量是有限的每个 SM 的最大活动块数。

我如何找到这些界限?

CUDA 也考虑过这一点。在他们的网站上提供了Cuda Occupancy Calculator 文件,您可以使用该文件发现按计算能力分组的硬件限制。您还可以输入块使用的资源量(线程数、每个线程的寄存器、共享内存的字节数)并获取有关活动块数的图表和重要信息。

于 2020-04-23T09:37:35.687 回答
1

根据 CUDA-C 编程指南中提供的技术规范,网格的最大块数为 65535,每个多处理器的最大驻留块数为 8。

我对可以启动多少块感到困惑。如果每个 SM 的最大块数为 8,这是否意味着如果只有 2 个 SM,我最多可以启动 16 个块?

最大块数(网格中的每个维度)是 CUDA 调度程序可以处理的限制。除了最近的 Kepler GPU,每个维度的限制是 65535。

实际上,活动块的数量取决于很多事情。每个 SM 可以启动的块数量有一个硬性限制,但如果每个块使用大量共享内存、寄存器或线程,数量也可以更小。

调度器切换出非活动块(即由于各种原因而停止的块)并切换到活动块。大量的块被启动而不是物理上可能的,以保持 SM 尽可能活跃。

但这带来了同步问题......

永远不要假设 CUDA 块是按顺序启动的。它们可以乱序处理,唯一的同步点是完成内核和cudaDeviceSynchronize主机。

于 2013-07-15T10:45:34.887 回答