首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CUDA经纱和每个块的最佳线程数

CUDA经纱和每个块的最佳线程数
EN

Stack Overflow用户
提问于 2015-09-30 00:04:05
回答 1查看 994关注 0票数 0

根据我对开普勒GPU和CUDA的一般理解,当一个SMX单元在一个块上工作时,它会启动由32个线程组成的组的翘曲。下面是我的问题:

1)如果SMX单元可以工作在64翘曲上,这意味着每个SMX单元有一个32x64 = 2048个线程的限制。但是开普勒GPU有4个翘曲调度程序,这是否意味着在一个GPU内核中只有4个翘曲可以同时工作?如果是这样的话,这是否意味着我真的应该寻找具有128个线程的倍数(假设线程中没有差异)的块,而不是推荐的32?当然,这忽略了任何差异,甚至忽略了诸如全局内存访问之类的东西会导致阻塞并让调度程序切换到另一种情况的情况。

2)如果以上所述是正确的,那么单个SMX单元同时工作在128个线程上是否是最好的结果?对于有14个SMX单位的GTX泰坦,总共128 x 14 = 1792个线程?我在网上看到的数字不一样。泰坦可以同时运行14x64 (每个SMX最大翘曲)x32(每个SMX线程)= 28,672。那怎么可能是SMX单位发射的翘曲,而只有4个翘曲调度程序?它们不能同时启动每个SMX的所有2048个线程吗?也许我搞不懂GPU可以并发启动的最大线程数的定义,以及允许您排队的是什么?

我很感谢对此的答复和澄清。

EN

回答 1

Stack Overflow用户

发布于 2015-09-30 00:39:56

那么,这是否意味着在GPU内核中只能同时处理4个翘曲呢?

在开普勒SMX上,可在任何给定的时钟周期内安排多达4度翘曲的指令。然而,由于执行单元中的管道,在任何给定的时钟周期中,指令可能处于管道执行的各个阶段,从SMX上当前驻留的所有翘曲开始。

如果是这样的话,这是否意味着我真的应该寻找具有128个线程的倍数(假设线程中没有差异)的块,而不是推荐的32?

我不知道你是怎么从前一点跳到这一步的。由于指令组合可能因翘曲而异(因为不同的翘曲大概位于指令流中的不同点),而且指令组合在指令流中的不同位置不同,所以我不认为在给定的时钟周期中可调度的4个翘曲之间有任何逻辑连接,并且任何需要有4个翘曲的组。给定的翘曲可能位于其指令高度可调度的点(可能是在SP FMA序列中,需要SP核,这是充足的),另外3个翘曲可能位于指令流中的另一个点,其中它们的指令“更难调度”(可能需要SFU,而SFU较少)。因此,任意地将翘曲分成4组没有多大意义。请注意,我们不需要发散就可以使翘曲不同步。调度程序的自然行为,再加上不同的执行资源可用性,可能会产生最初在一起的翘曲,使其处于指令流的不同位置。

对于第二个问题,我认为您的基本知识差距在于理解GPU如何隐藏延迟。假设GPU有一组3条指令要跨翘曲发出:

代码语言:javascript
复制
LD R0, a[idx]
LD R1, b[idx]
MPY R2, R0, R1

第一条指令是来自全局内存的LD,它可以发出,不会拖住翘曲。同样,也可以发出第二条指令。然而,由于全局内存的延迟,翘曲将在第三指令停止。在正确填充R0和R1之前,不能发送乘法指令。主存的延迟会阻止它。GPU通过(希望)有现成的“其他工作”来处理这个问题,即处于未停止状态的其他翘曲(即可以发出指令)。促进这种延迟隐藏过程的最佳方法是向SMX提供许多翘曲。这没有任何粒度(例如需要4翘曲)。一般来说,网格中的线程/翘曲/块越多,GPU隐藏延迟的可能性就越大。

因此,GPU确实不能在一个时钟周期中“启动”2048线程(即从2048线程发出指令)。但是,当翘曲停止时,它会被放置在等待队列中,直到失速状态被解除,在此之前,在下一个时钟周期中,让其他翘曲“准备就绪”是有帮助的。

GPU延迟隐藏是一个常见的误解。如果您搜索它,有许多可用的资源可供学习。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32855684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档