对 CUDA 内核使用不同的流使得并发内核执行成为可能。所以n
内核上n
如果流适合硬件,理论上它们可以同时运行,对吧?
现在我面临以下问题: 没有n
不同的内核但是n*m
where m
内核需要按顺序执行。例如n=2
and m=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 上的调度程序中。但是,当处理大量流/内核时,这可能弊大于利。
好吧,开门见山:解决这种情况的适当(或至少不同)方法是什么?
Edit:测量是通过使用 CUDA 事件完成的。我测量了完全解决计算所需的时间,即。 e. GPU 必须计算所有n * m
内核。假设是:在完全并发的内核执行上,执行时间大致为(理想情况下)1/n
按顺序执行所有内核所需时间的倍数,因此必须可以同时执行两个或多个内核。我现在只使用两个不同的流来确保这一点。
我可以测量使用所描述的流和交错分派内核之间执行时间的明显差异,即。即:
Loop: i = 0 to m
EnqueueKernel(Kernel i.1, Stream 1)
EnqueueKernel(Kernel i.2, Stream 2)
versus
Loop: i = 1 to n
Loop: j = 0 to m
EnqueueKernel(Kernel j.i, Stream i)
后者导致更长的运行时间。
Edit #2:将流编号更改为以 1 开头(而不是 0,请参阅下面的注释)。
Edit #3:硬件是NVIDIA Tesla M2090(即Fermi,计算能力2.0)