繁体   English   中英

CUDA并发执行

[英]CUDA concurrent execution

我希望回答我的问题不会花费很多时间,因为这与我对这个主题的理解有关。

因此,问题在于并发内核执行的块和网格大小。

首先,让我介绍一下我的显卡:它是GeForce GTX TITAN,下面是它的一些特性,我认为在这个问题中很重要。

CUDA功能主要/次要版本号:3.5

全局内存总量:6144 MB(6442123264字节)

(14)个多处理器,(192)CUDA内核/ MP:2688 CUDA内核

经纱尺寸:32

每个多处理器的最大线程数:2048

每个块的最大线程数:1024

现在,主要问题是:我有一个内核(它执行稀疏矩阵乘法,但不是那么重要),我想在一个GPU上的多个流中同时启动它(!),以计算不同的矩阵乘法。 请再次注意同时要求-我希望所有内核都在某个时刻开始,而在另一个时刻(它们全部!)结束,所以当这些内核仅部分重叠时的解决方案令我不满意。 即使我们因此而失去一些性能,我也要最大化并行内核的数量也很重要。

好的,让我们考虑一下我们已经有了内核,并且我们希望以最佳方式指定其网格大小和块大小。

查看卡的特性,我们看到它具有14 sm和3.5的功能,该功能可以运行32个并发内核。 因此,我在这里得出的结论是,启动28个并发内核(每14个SM中每个内核两个)是最好的决定。 第一个问题-我在这里吗?

现在,我们再次要优化每个内核的块和网格大小。 好吧,让我们看一下这个特性:

每个多处理器的最大线程数:2048

我这样理解:如果我们启动一个包含1024个线程和2个块的内核,则将同时计算这两个块。 如果我们启动一个具有1024个线程和4个块的内核,则将逐对计算两对块。 因此,我得出的下一个结论是,启动每个带有1024个线程的28个内核也是最佳解决方案-因为这是在每个SM上同时执行它们的唯一方法。 第二个问题-我在这里吗? 还是有更好的解决方案如何使同时执行?

如果您只说我对或错,那将是非常好的,如果您解释我的错误之处或提出更好的解决方案,我将不胜感激。

谢谢您阅读此篇!

关于并发内核已经有很多问题。 您可能会搜索并查看其中的一些。 您必须考虑寄存器使用情况,块,线程和共享内存使用情况等。 当您不提供有关寄存器使用或共享内存使用的信息时,您的问题就无法准确回答。 最大化并发内核在某种程度上是一个占用问题,因此您也应该进行研究。

不过,您要观察最大并发内核数。 正如您已经指出的那样,它是32。

您有14个SM,每个SM最多可以具有2048个线程。 14x2048 / 32 =每个内核896个线程(即,块*每个块的线程)

如果线程块大小为128,则每个内核7个块。 7个块* 32个内核=总共224个块。 当我们将其除以14个SM时,每个SM得到16个块,这恰好与规格限制完全匹配。

因此,上面的分析(32个内核,每个内核7个块,每个块128个线程)将是仅考虑您提供的数据即可完成的分析范围。

如果这对您不起作用,我将确保确保已满足并发执行的要求,然后着重于每个线程或共享内存的寄存器,以查看在这种情况下这些寄存器是否对“占用率”有所限制。

老实说,我对您所描述的完美场景并不抱有太大希望,但是有希望。 我很惊讶。 仅供参考,如果我尝试做这样的事情,我当然会在linux而不是Windows上尝试,尤其是考虑到您的卡是GeForce卡,在Windows下受WDDM限制。

您的理解似乎有缺陷。 像这样的语句:

如果我们启动具有1024个线程和2个块的内核,则将同时计算这两个块。 如果我们启动一个具有1024个线程和4个块的内核,则将逐对计算两对块

对我来说没有意义。 将以调度程序认为合适的顺序来计算块,但是没有规则说两个块将被同时计算,但是四个块将被两个两个地计算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM