-1

我已经经历了这么少的好的参考指南,但我仍然对线程和块的限制感到困惑。1)基本问题:配置执行中每个网格的块数,这意味着网格将消耗所有SM还是单个SM?

2)实际上,根据计算能力,每个SM可以有8个块,那么为什么有时他们会说,每个维度可以配置65535个块?我明白了,8 个块将并行运行,但是如何配置 65535 个块,它们将如何执行?它们是每个 SM 还是每个网格?

3) 总数 根据计算能力的线程数是 1024/block 和 1536/SM,那么对于每个维度的 2D,最大线程数是多少。我可以同时拥有多少个线程,然后如果我配置了更多,那么顺序有多少?总数应该在 1024 以内?而且我已经实际检查过,有时我配置的线程超过了每个块的限制,然后它也在工作,为什么会这样?3a)案例a:对于GT200,假设有30个SM,每个SM最多可以有8个block,因此得出的结论是总共可以有240个block(考虑所有SM),那么为什么有时会提到65535个block每个维度都可以配置吗?3b)案例b:另外,在我的一个程序中,我的矩阵输入大小为10,000 x 10,000,并且我已经完成了以下配置,-no。每个网格的块数:1 - 没有。每个块的线程数:10,000,它仍在工作,因为没有。每个块的线程数超过了它仍然工作的限制。谁能让我解释它为什么工作?以及以哪种方式执行线程和块?在职的,

4

1 回答 1

1
  1. 是的,与任何内核启动相关的网格都可以使用 GPU 中的任何或所有 SM。这是由 GPU 上的硬件调度逻辑处理的,您不必关心它的细节。GPU 将尝试在可用的 SM 上最好地安排您的块,以最大限度地提高吞吐量。
  2. 为 SM 提供数据的队列可以包含处于准备运行的不同阶段的块。每个 SM 8 个块是指 SM 中的 warp 调度程序可以从这 8 个块中的任何一个中选择 warp 随时执行。你可以让更多的块排队,但在它们前面的一些块被淘汰之前,它们不可能主动运行 warp。当然,每个启动的 SM 可以有超过 8 个块。这些只是排队等待运行,因为 SM 变得可用(即,当 SM 上的执行槽随着块退休而被释放)。一旦所有 SM 在执行槽中最多有 8 个块,那么网格中的剩余块是等待这些执行槽释放。
  3. 每个网格的线程总数不是一个明确定义的数字。这主要是片上硬件/资源限制的问题,而不是指定或定义的数字。当然,每个块的最大线程数是明确定义的。当然,在一次网格启动中可以处理数亿个线程,甚至可能更多。但是,如果您尝试配置一个具有 65535*65535 个块(2D)的网格,每个块有 1024 个线程(以任何排列方式),您可能会遇到内核启动失败。但是您当然可以在一个维度中获得 65535 个块,而在另一个维度中获得较小的数量(或其他 2 维,对于 3D 网格)。
  4. (3a.) 是的,在 GT200 上,有 30 个 SM。如果每个 SM 可以处理准备执行队列中的 8 个块,那么就是 240 个块。但是我们可以有更多的块在 GPU 的另一个队列中等待运行。他们正在等待执行槽打开。当插槽打开时,它们会从等待队列中出来,并被分配给特定的 SM。因此,一个网格(与内核启动相关的所有块)可以包含超过 240 个块。
  5. (3b.) 如果您尝试启动每个块的线程维度为 10000 的内核,它将失败。我无法解释你的情况,因为你没有提供一个例子,你只是说“它有效”。对不起,它不起作用。请提供一个简短的、完整的、可编译的示例,您认为可以演示它,有人会向您展示错误。例如,当您以这种方式启动内核时,您是否在进行错误检查?
于 2012-11-19T22:18:40.387 回答