我想问你一个关于Nvidia GPU中并发内核执行的问题。我向我们解释了我的情况。我有一个代码,为2个不同的矩阵(每个矩阵一个)启动1个稀疏矩阵乘法。这些矩阵乘法是使用cuSPARSE库执行的。我希望两个操作可以同时执行,所以我使用2个流来启动它们。使用Nvidia Visual profiler,我发现两个操作(cuSPARSE内核)都完全重叠。两个内核的时间戳是:
我正在使用带有13个SM的Tesla K20c,每个SM可以执行16个块。两个内核都占有100%的占用率并启动足够数量的块:
使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充GPU的所有SM。但是,Nvidia Visual Profiler显示这些内核正在重叠。为什么?。任何人都可以解释为什么会出现这种行为?
非常感谢提前。
答案 0 :(得分:1)
使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充GPU的所有SM。
我认为这是一个不正确的陈述。据我所知,CUDA中没有指定块的低级调度行为。
较新的设备(带有hyper-Q的cc3.5 +)可以更容易地同时从并发内核调度块。
所以,如果你同时启动2个内核(A和B),每个内核都有大量的块,那么你可以观察到
由于此级别没有规范,因此没有直接答案。以上任何一种都是可能的。低级块调度程序可以按任意顺序自由选择块,并且不指定顺序。
如果给定的内核启动“完全饱和”机器(即在执行时使用足够的资源来完全占用机器),那么没有理由认为机器具有额外的第二个并发内核容量。因此,没有理由期望同时运行两个内核而不是顺序地加速运行两个内核(如果有的话)。在这种情况下,无论它们是否同时执行,我们都希望同时运行的2个内核的总执行时间与总执行时间大致相同,如果两个内核按顺序启动或调度(忽略尾部效果并启动)间接费用等。)