【问题标题】:Concurrent Kernels with CUSPARSE Library带有 CUSPARSE 库的并发内核
【发布时间】:2015-12-30 09:01:47
【问题描述】:

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

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

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

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

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

非常感谢。

【问题讨论】:

  • “我希望两个操作可以同时执行”和“我观察到两个操作完全重叠”。那么有什么问题呢?您是在问为什么调度程序会设法交错执行两个内核,否则如果不同时启动就会使 GPU 饱和?

标签: cuda nvidia


【解决方案1】:

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

我认为这是一个错误的说法。据我所知,块的低级调度行为并没有在 CUDA 中指定。

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

因此,如果您同时启动 2 个内核(A 和 B),每个内核都有大量块,那么您可能会观察到任何一个

  • 内核 A 的块与内核 B 并发执行
  • 内核 A 的所有(或几乎所有)块在内核 B 之前执行
  • 内核 B 的所有(或几乎所有)块在内核 A 之前执行

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

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

【讨论】:

  • 非常感谢您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2011-06-19
  • 2021-09-24
相关资源
最近更新 更多