使用CUSPARSE库的并发内核

时间:2015-10-02 07:20:54

标签: cuda nvidia

我想问你一个关于Nvidia GPU中并发内核执行的问题。我向我们解释了我的情况。我有一个代码,为2个不同的矩阵(每个矩阵一个)启动1个稀疏矩阵乘法。这些矩阵乘法是使用cuSPARSE库执行的。我希望两个操作可以同时执行,所以我使用2个流来启动它们。使用Nvidia Visual profiler,我发现两个操作(cuSPARSE内核)都完全重叠。两个内核的时间戳是:

  • 内核1)开始时间:206,205 ms - 结束时间:284,177 ms。
  • 内核2)开始时间:263,519 ms - 结束时间:278,916 ms。

我正在使用带有13个SM的Tesla K20c,每个SM可以执行16个块。两个内核都占有100%的占用率并启动足够数量的块:

  • 内核1)2277个块,32个寄存器/线程,1,156 KB共享内存。
  • 内核2)46555个块,32个寄存器/线程,1,266 KB共享内存。

使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充GPU的所有SM。但是,Nvidia Visual Profiler显示这些内核正在重叠。为什么?。任何人都可以解释为什么会出现这种行为?

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

  

使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充GPU的所有SM。

我认为这是一个不正确的陈述。据我所知,CUDA中没有指定块的低级调度行为。

较新的设备(带有hyper-Q的cc3.5 +)可以更容易地同时从并发内核调度块。

所以,如果你同时启动2个内核(A和B),每个内核都有大量的块,那么你可以观察到

    来自内核A的
  • 块与内核B同时执行
  • 内核A的所有(或几乎所有)块在内核B之前执行
  • 内核B的所有(或几乎所有)块在内核A之前执行

由于此级别没有规范,因此没有直接答案。以上任何一种都是可能的。低级块调度程序可以按任意顺序自由选择块,并且不指定顺序。

如果给定的内核启动“完全饱和”机器(即在执行时使用足够的资源来完全占用机器),那么没有理由认为机器具有额外的第二个并发内核容量。因此,没有理由期望同时运行两个内核而不是顺序地加速运行两个内核(如果有的话)。在这种情况下,无论它们是否同时执行,我们都希望同时运行的2个内核的总执行时间与总执行时间大致相同,如果两个内核按顺序启动或调度(忽略尾部效果并启动)间接费用等。)