CUDA并发执行

标签 c cuda multitasking

我希望回答我的问题不需要很多时间,因为这是关于我对这个话题的理解。

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

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

CUDA Capability 主要/次要版本号:3.5

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

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

经纱尺寸:32

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

每个 block 的最大线程数:1024

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

好吧,让我们考虑一下我们已经有了内核,我们想以最好的方式指定它的网格和 block 大小。

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

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

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

我是这样理解的:如果我们启动一个有 1024 个线程和 2 个 block 的内核,这两个 block 将同时计算。如果我们启动一个有 1024 个线程和 4 个 block 的内核,那么将依次计算两对 block 。 因此,我得出的下一个结论是,启动 28 个内核,每个内核有 1024 个线程也是最好的解决方案——因为这是它们可以在每个 SM 上同时执行的唯一方法。第二个问题——我在这儿吗?或者有更好的解决方案如何获得同时执行?

如果你只说我对不对就太好了,如果你能指出我错误的地方或提出更好的解决方案,我将不胜感激。

感谢您阅读本文!

最佳答案

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

然而,您想要观察最大并发内核数。正如您已经指出的,那是 32。

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

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

所以上面的分析,32 个内核,每个内核 7 个 block ,每个 block 128 个线程,将是仅考虑您提供的数据后可以完成的分析范围。

如果这对您不起作用,我一定会确保我已经满足了 concurrent execution 的要求。然后关注每个线程或共享内存的寄存器,看看在这种情况下它们是否是“占用”的限制因素。

老实说,我对您亲眼目睹您描述的完美场景不抱太大希望,但要坚持下去。我会很高兴感到惊讶。仅供引用,如果我尝试做这样的事情,我肯定会在 linux 而不是 windows 上尝试,特别是考虑到您的卡是 GeForce 卡,在 windows 下受 WDDM 限制。

您的理解似乎有问题。像这样的语句:

if we launch a kernel with 1024 threads and 2 blocks, these two blocks will be computed simultaneously. if we launch a kernel with 1024 threads and 4 blocks, then two pairs of block will be computed one after another

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

关于CUDA并发执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26151910/

相关文章:

c - 应用程序未链接到 CUDA

afnetworking - 如何将 AFNetworking 用于多请求?

c -/dev/random 不阻塞

C 客户端-服务器应用程序和 Linux 上的电池节省

c - 如何控制互斥量的加锁和解锁?

cuda - 将 SSE/AVX 单元与 GPU 核心进行比较公平吗?

c - 将文件中的数据放入C中的数组

c++ - 如何在cuda中将结构的指针变量从主机复制到设备

f# - F#中的异步屏障

ios4 - iOS4 上的 Phonegap 后台服务?