带有 CUSPARSE 库的并发内核
Concurrent Kernels with CUSPARSE Library
我想问你一个关于 Nvidia GPU 中并发内核执行的问题。我向我们解释我的情况。我有一个代码,它为 2 个不同的矩阵(每个矩阵一个)启动 1 个稀疏矩阵乘法。这些矩阵乘法是使用 cuSPARSE 库执行的。我希望这两个操作可以同时执行,所以我使用 2 个流来启动它们。使用 Nvidia Visual 分析器,我观察到这两个操作(cuSPARSE 内核)完全重叠。两个内核的时间戳是:
- 内核 1) 开始时间:206,205 毫秒 - 结束时间:284,177 毫秒。
- 内核 2) 开始时间:263,519 毫秒 - 结束时间:278,916 毫秒。
我正在使用带有 13 个 SM 的 Tesla K20c,每个 SM 最多可以执行 16 个块。两个内核都有 100% 的占用率并启动足够数量的块:
- 内核 1) 2277 个块,32 Register/Thread,1,156 KB 共享内存。
- 内核 2) 46555 个块,32 Register/Thread,1,266 KB 共享内存。
使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充 GPU 的所有 SM。然而,Nvidia Visual Profiler 显示这些内核正在重叠。为什么?。任何人都可以解释为什么会发生这种行为?
非常感谢。
With this configuration, both kernels shouldn´t show this behaviour, since both kernels launch an enough number of blocks to fill all SMs of the GPU.
我认为这是一个不正确的说法。据我所知,块的低级调度行为没有在 CUDA 中指定。
较新的设备(带有 hyper-Q 的 cc3.5+)可以更轻松地同时从并发内核调度块。
因此,如果您同时启动 2 个内核(A 和 B),每个内核都有大量块,那么您可能会观察到其中一个
- 来自内核 A 的块与内核 B
同时执行
- 内核A的所有(或几乎所有)块在内核B之前执行
- 内核 B 的所有(或几乎所有)块在内核 A 之前执行
由于没有这个级别的规范,所以没有直接的答案。以上任何一种都是可能的。低级块调度器可以自由选择任意顺序的块,不指定顺序。
如果给定的内核启动 "completely saturates" 机器(即在机器执行时使用足够的资源来完全占用机器),那么没有理由认为该机器有额外的容量用于第二个并发内核.因此,没有理由期望从 运行 两个内核同时加速而不是顺序加速。在这种情况下,无论它们是否并发执行,我们预计 2 个内核 运行 并发的总执行时间与两个内核按顺序启动或调度时的总执行时间大致相同(忽略尾部效应和发射开销等)。
我想问你一个关于 Nvidia GPU 中并发内核执行的问题。我向我们解释我的情况。我有一个代码,它为 2 个不同的矩阵(每个矩阵一个)启动 1 个稀疏矩阵乘法。这些矩阵乘法是使用 cuSPARSE 库执行的。我希望这两个操作可以同时执行,所以我使用 2 个流来启动它们。使用 Nvidia Visual 分析器,我观察到这两个操作(cuSPARSE 内核)完全重叠。两个内核的时间戳是:
- 内核 1) 开始时间:206,205 毫秒 - 结束时间:284,177 毫秒。
- 内核 2) 开始时间:263,519 毫秒 - 结束时间:278,916 毫秒。
我正在使用带有 13 个 SM 的 Tesla K20c,每个 SM 最多可以执行 16 个块。两个内核都有 100% 的占用率并启动足够数量的块:
- 内核 1) 2277 个块,32 Register/Thread,1,156 KB 共享内存。
- 内核 2) 46555 个块,32 Register/Thread,1,266 KB 共享内存。
使用此配置,两个内核都不应显示此行为,因为两个内核都会启动足够数量的块来填充 GPU 的所有 SM。然而,Nvidia Visual Profiler 显示这些内核正在重叠。为什么?。任何人都可以解释为什么会发生这种行为?
非常感谢。
With this configuration, both kernels shouldn´t show this behaviour, since both kernels launch an enough number of blocks to fill all SMs of the GPU.
我认为这是一个不正确的说法。据我所知,块的低级调度行为没有在 CUDA 中指定。
较新的设备(带有 hyper-Q 的 cc3.5+)可以更轻松地同时从并发内核调度块。
因此,如果您同时启动 2 个内核(A 和 B),每个内核都有大量块,那么您可能会观察到其中一个
- 来自内核 A 的块与内核 B 同时执行
- 内核A的所有(或几乎所有)块在内核B之前执行
- 内核 B 的所有(或几乎所有)块在内核 A 之前执行
由于没有这个级别的规范,所以没有直接的答案。以上任何一种都是可能的。低级块调度器可以自由选择任意顺序的块,不指定顺序。
如果给定的内核启动 "completely saturates" 机器(即在机器执行时使用足够的资源来完全占用机器),那么没有理由认为该机器有额外的容量用于第二个并发内核.因此,没有理由期望从 运行 两个内核同时加速而不是顺序加速。在这种情况下,无论它们是否并发执行,我们预计 2 个内核 运行 并发的总执行时间与两个内核按顺序启动或调度时的总执行时间大致相同(忽略尾部效应和发射开销等)。