线程和块的限制以及线程和块的执行

时间:2012-11-19 21:05:11

标签: cuda

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

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

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

1 个答案:

答案 0 :(得分: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个块,在另一个维度中获得更小的数量(或者对于3D网格,其他2个维度)。
  4. (3a。)在GT200上是,有30个SM。如果每个SM可以在准备执行的队列中处理8个块,那么这就是240个块。但是我们可以在GPU的另一个队列中有更多的块,等待运行。他们正在等待执行槽打开。当一个插槽打开时,它们会从等待队列中退出,并被分配给特定的SM。因此,网格(与内核启动相关的所有块)中可以包含超过240个块。
  5. (3b。)如果您尝试启动每个块的线程维度为10000的内核,它将失败。我无法解释你的情况,因为你没有提供一个例子,你只是说“它有用”。对不起,工作。请提供一个您认为可以演示的简短,完整,可编译的示例,并且有人会向您显示错误。例如,您是否以这种方式启动内核时进行错误检查?