2012-11-19 29 views
-1

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

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

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

+1

说真的 - 每个问题一个问题,请。并阅读一些文档,这在CUDA编程指南中有清楚的讨论。 – talonmies

+0

@talonmies:好的。每个问题我会提出一个问题。 – robot

+1

@robot,一些建议:首先,这至少是你第三次被建议每个问题提出一个问题。说“OK”然后不做就不会让你拥有任何粉丝。其次,我发现你已经发布了至少4个已回答的问题,并且你没有接受任何答案。有些人可能会看到这一点,并认为它不值得帮助你。我建议你回顾一下已经回答的问题,并接受一些答案,如[this one](http://stackoverflow.com/questions/13329345/quick-hull-worst-case-explanation),你已经已经表明答案对你有帮助。 –

回答

1
  1. 是的,与任何内核启动相关联的网格可以使用GPU中的任何或全部SM。这是由GPU上的硬件调度逻辑处理的,你不应该关心它的细节。 GPU将尝试在可用的SM上最佳地调度您的块以最大化吞吐量。
  2. 提供SM的队列可能有处于准备运行的各个阶段的块。每个SM的8个块指的是SM中的warp调度器可以从任何时候选择这8个块中的任何一个块执行的想法。你可以有更多的块排队,但他们不会有积极运行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的内核,它将会失败。我无法解释你的情况,因为你没有提供一个例子,你只是说“它有效”。对不起,不是工作。请提供一个简短,完整,可编辑的例子,您认为可以演示它,并且有人会向您显示错误。例如,当你以这种方式启动内核时,你在进行错误检查吗?
+0

非常感谢您的及时回复。 1)但是,如果我将GT200的内核配置为:kernelfunction <<<128,32> >>(128 blocks&32 threads),那么它将产生4096个线程。然后没有。每SM的线程数量不会超过其限制?如果我配置为:dimGrid(128,1,1)和dimBlock(32,32,1),那么我们每个块使用1024个线程,每个SM的总线程数可以是1024,这意味着我可以采用1024/1024 = 1个最大/ SM块。这样对吗。我知道这不是好的配置,但它会工作;以及如果我更改为dimBlock(64,64,1)会怎么样。它会起作用吗? – robot

+0

感谢您的回复。是的,其实我试图弄清楚关于边界条件的概念。 你的回答帮助我了解了很多GPU的概念。 – robot

+0

您在第3点提到,如果我配置了1024个线程的65535 * 65535块(2D),那么会出现内核启动失败。如果你能解释我,为什么这个内核启动失败? – robot