有啥更好的——有更多的块或线程?
Posted
技术标签:
【中文标题】有啥更好的——有更多的块或线程?【英文标题】:What is better -- having more blocks or threads?有什么更好的——有更多的块或线程? 【发布时间】:2013-01-25 20:03:19 【问题描述】:更好 = 更快。
我问的是一般情况,但是考虑一个情况,当我的“工作人员”比数据多时——它是否比每个块的最后一个线程保持不使用更好,或者每个网格的最后一个块不使用更好?
【问题讨论】:
您无法给出最佳内核启动配置的一般答案。它始终取决于寄存器、共享内存等的使用。您可以使用cuda occupancy calculator 来查看内核配置将如何使用 gpu 的容量。 好的,我理解你的意思,但我也会理解所涉及的内容,最后,理解要调整的内容。所以对于像我这样的初学者,假设我有输入数组,当每个元素乘以 2 时,我必须生成输出数组。 【参考方案1】:您应该记住这个事实,即每 8 个块都运行在一个 SM(流式多处理器)上。您可以将它们视为 CPU 内核。每个block目前最多可以运行1024个线程,相当于逻辑核心,比如现在的intel i系列的核心,不管你用不全这些线程,剩下的都会浪费,因为你没有用他们和其他人都做不到。因此,例如,如果您的 GPU 上有 8 个 SM,您可以分配 64 个块,但不能为每个块分配 1024 个线程,因为每个 SM 的线程总数有限制,例如 2048。(编辑了这些基于中心提供的信息)
【讨论】:
如果不受寄存器和共享内存的使用限制,每个 SM 最多可以并行运行 8 个块。当你可以运行 8 个块和 512 个线程时,你会浪费大量的 gpu 计算能力,但你只想运行一个块。 是的,我明白你的意思,将 1024 个线程和 4 个块与 8 个块和 512 个线程进行比较,假设它们在单个 SM 上运行,哪个更快?还是一样? 谢谢(+1),但我想完全理解它。这是否意味着,如果我全心全意为原始力量而其他一切都无关紧要——我应该做到这一点,并为所有可能的块/线程传递计算,但是以这种方式,我在@987654322 中只使用0
线程@ 堵塞?让其余的闲置?如果我理解正确,我可以达到最大值。每个 SM 工作,所有 SM 都将参与其中。
不是 0 个线程,至少一个线程,根据 CUDA by Example 的说法,使用线程具有使用共享内存的优势,并且可能还有其他一些东西,比如它们之间的同步能力,但从技术上讲是的,线程和块的乘法对单个 SM 很重要。编辑:也没有什么是空闲的,为了充分利用它,你可以在单个 SM 上运行的线程总数是 2048,所以你可以有 2 个块和 1024 个线程,或者你可以有 4 个块 512 个等等开。
好的,所以我得出结论(我希望这是正确的),我应该在 SM 之间分配工作,而不是线程本身,因为我最终可以让一个 SM 运行所有线程。以上是关于有啥更好的——有更多的块或线程?的主要内容,如果未能解决你的问题,请参考以下文章
为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调