我希望回答我的问题不需要很多时间,因为这是我对这个主题的理解。
因此,问题是并发内核执行的块和网格大小。
首先,让我讲一下我的卡片:它是GeForce GTX TITAN,这里有一些特色,我认为这个特征很重要。
CUDA能力主要/次要版本号:3.5
全局内存总量:6144 MBytes(6442123264字节)
(14)多处理器,(192)CUDA核心/ MP:2688 CUDA核心
翘曲尺寸:32
每个多处理器的最大线程数:2048
每个块的最大线程数:1024
现在,主要问题是:我有一个内核(它执行稀疏矩阵乘法,但它并不那么重要)我希望在一个GPU上的几个流中同时启动它(!),计算不同的矩阵乘法。 请再次注意同时要求 - 我希望所有的内核都在一个时刻开始,然后在另一个内核完成(所有这些内核!),所以当这些内核只是部分重叠时解决方案并不能满足我。 同样非常重要的是,我希望最大化并行内核的数量,即使我们因此而失去一些性能。
好吧,让我们考虑一下我们已经有了内核,我们希望以最佳方式指定它的网格和块大小。
根据卡的特性,我们看到它具有14个sm和3.5的功能,允许运行32个并发内核。 因此,我在这里得出的结论是,启动28个并发内核(每个14个SM两个)将是最佳决策。第一个问题 - 我在这儿吗?
现在,我们再次希望优化每个内核的块和网格大小。好吧,让我们来看看这个特点:
每个多处理器的最大线程数:2048
我这样理解:如果我们启动一个包含1024个线程和2个块的内核,这两个块将同时计算。如果我们启动一个包含1024个线程和4个块的内核,那么将逐个计算两对块。 因此,我做的下一个结论是,每个启动28个内核,每个1024个线程也是最好的解决方案 - 因为这是在每个SM上同时执行它们的唯一方法。第二个问题 - 我在这儿吗?或者有更好的解决方案如何同时执行?
如果你只是说我是对的,那将是非常好的,如果你解释我错误的地方或提出更好的解决方案,我将非常感激。
感谢您阅读本文!
答案 0 :(得分:2)
并发内核已经存在很多问题。您可以搜索并查看其中一些。您必须考虑注册用法,块,线程和共享内存使用等。当您不提供有关寄存器使用或共享内存使用情况的信息时,您的问题无法准确回答。最大化并发内核部分是占用问题,所以你也应该研究它。
然而,您希望观察最大并发内核。正如你已经指出的那样,那就是32。
你有14个SM,每个SM最多可以有2048个线程。 14x2048 / 32 =每个内核896个线程(即每个块的块*线程)
如果线程块大小为128,那么每个内核将有7个块。 7个块* 32个内核=总共224个块。当我们将其除以14个SM时,每个SM得到16个块,恰好与spec limit完全匹配。
因此,上面的分析,32个内核,每个内核7个块,每个块128个线程,可以在仅考虑您提供的数据的情况下进行分析。
如果这对您不起作用,我一定要确保已经解决了concurrent execution的要求,然后关注每个线程或共享内存的寄存器,看看这些是否是“占用”的限制因素在这种情况下。
老实说,我并没有对你见证你所描述的完美情景抱有太多希望,但对此有所了解。我很高兴感到惊讶。仅供参考,如果我尝试做这样的事情,我肯定会在linux而不是Windows上尝试它,特别是考虑到你的卡是一款受Windows下WDDM限制的GeForce卡。
你的理解似乎有缺陷。这样的陈述:
如果我们启动一个包含1024个线程和2个块的内核,这两个块将同时计算。如果我们启动一个包含1024个线程和4个块的内核,那么将逐个计算两对块
对我没有意义。块将按照调度程序认为合适的顺序计算,但是没有规则表示将同时计算两个块,但是将逐个计算四个块。