如何优化可以在CUDA中同时运行的两个占用率为50%的相同内核



CUDA中有两个相同的内核,它们报告了50%的理论占用率,并且可以同时运行。然而,在不同的流中调用它们显示了顺序执行。

每个内核调用都有如下的网格和块维度:

Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.

这导致每个SM有太多线程,每个块有太多寄存器。

我应该把下一步的优化工作集中在减少内核使用的寄存器数量上吗?

或者,将网格拆分为许多较小的网格是否有意义,这可能会允许两个内核同时发布和运行。每个块的寄存器数量在这里还会引起问题吗?

注意-设备查询报告:

MAX_REGISTERS_PER_BLOCK 65K
MAX_THREADS_PER_MULTIPROCESSOR 1024
NUMBER_OF_MULTIPROCESSORS 68

我在CUDA中有两个相同的内核,它们报告了50%的理论占用率。。。

OK

。。。并且可以同时运行

这不是占用率的含义,也不正确。

50%的占用率并不意味着你有50%的未使用资源,不同的内核可以同时使用。这意味着您的代码在运行最大理论并发扭曲数的50%时耗尽了资源。如果您已经耗尽了一个资源,那么就不能再运行任何warp,无论它们是来自那个内核还是任何其他内核。

然而,在不同的流中调用它们会显示顺序执行。

由于上述的原因,这正是预期的结果

每个内核调用都有如下网格和块维度:

Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.

你给出了一个启动1041600个块的内核。这比即使是最大的GPU也能并发运行高出几个数量级,这意味着对于这样一个巨大的网格,并发内核执行的范围基本上为零。

这会导致每个SM有太多线程,每个块有太多寄存器。

寄存器压力可能是限制占用的原因

我应该把下一步的优化工作集中在减少内核使用的寄存器数量上吗?

考虑到并发内核执行的目标是不可能的,我认为目标应该是让这个内核尽可能快地运行。如何做到这一点取决于代码。在某些情况下,寄存器优化可以提高占用率和性能,但有时只会溢出到本地内存,从而影响性能。

或者将网格拆分为许多较小的网格是否有意义,这可能允许两个内核同时发布和运行。

当你说";许多";你将意味着数千个网格,这将意味着如此多的启动和调度延迟,如果你能设法达到并发内核执行的地步,我无法想象这样做有任何好处。

最新更新