gpt4 book ai didi

concurrency - 每个流具有多个内核的 CUDA 并发内核执行

转载 作者:行者123 更新时间:2023-12-04 15:14:37 28 4
gpt4 key购买 nike

对 CUDA 内核使用不同的流使得并发内核执行成为可能。因此 n n 上的内核如果它们适合硬件,理论上流可以同时运行,对吗?

现在我面临以下问题:没有 n不同的内核,但 n*m哪里m内核需要按顺序执行。例如 n=2m=3将导致以下带有流的执行方案:

Stream 1: <<<Kernel 0.1>>> <<<Kernel 1.1>>> <<<Kernel 2.1>>>
Stream 2: <<<Kernel 0.2>>> <<<Kernel 1.2>>> <<<Kernel 2.2>>>

我天真的假设内核 x.0 和 y.1 应该同时执行(从理论角度来看)或至少不是连续执行(从实际角度来看)。但是我的测量结果表明情况并非如此,而且似乎执行了连续执行(即 K0.0、K1.0、K2.0、K0.1、K1.1、K2.1)。内核本身非常小,所以并发执行应该不成问题。

现在我的方法是完成一种调度,以确保内核以交错方式排队进入 GPU 上的调度程序。但是在处理大量流/内核时,这可能弊大于利。

好的,直截了当:解决这种情况的合适(或至少是不同的)方法是什么?

编辑:测量是通过使用 CUDA 事件完成的。我已经测量了完全解决计算所需的时间,即。 e. GPU 必须计算所有 n * m内核。假设是:在完全并发的内核执行上,执行时间大致(理想情况下) 1/n按顺序执行所有内核所需的时间,因此必须有可能同时执行两个或多个内核。我现在只使用两个不同的流来确保这一点。

我可以测量使用所描述的流和调度交错的内核之间的执行时间的明显差异,即。例如:
Loop: i = 0 to m
EnqueueKernel(Kernel i.1, Stream 1)
EnqueueKernel(Kernel i.2, Stream 2)

相对
Loop: i = 1 to n
Loop: j = 0 to m
EnqueueKernel(Kernel j.i, Stream i)

后者导致更长的运行时间。

编辑 #2:将流编号更改为以 1 开头(而不是 0,请参阅下面的注释)。

编辑 #3:硬件是 NVIDIA Tesla M2090(即 Fermi,计算能力 2.0)

最佳答案

在 Fermi(又名 Compute Capability 2.0)硬件上,最好将内核启动交错到多个流,而不是将所有内核启动到一个流,然后是下一个流,等等。这是因为如果有,硬件可以立即将内核启动到不同的流是足够的资源,而如果后续启动是针对同一个流,通常会引入延迟,从而降低并发性。这就是您的第一种方法表现更好的原因,而这种方法是您应该选择的方法。

启用分析也可以禁用 Fermi 上的并发,所以要小心。此外,在启动循环期间使用 CUDA 事件时要小心,因为这些事件可能会产生干扰——例如,最好在执行时使用事件对整个循环进行计时。

关于concurrency - 每个流具有多个内核的 CUDA 并发内核执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9311015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com