我在 CUDA 中有 2 个相同的内核,报告理论占用率为 50%,并且可以同时运行。但是,在不同的流中调用它们会显示顺序执行。
每个内核调用的网格和块尺寸如下:
Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.
这会导致每个 SM 的线程过多以及每个块的寄存器过多。
我应该将下一步的优化重点放在减少内核使用的寄存器数量上吗?
或者将网格分割成许多较小的网格是否有意义,从而可能允许发布两个内核并同时运行。每个块的寄存器数量仍然会造成问题吗?
Note- deviceQuery 报告:
MAX_REGISTERS_PER_BLOCK 65K
MAX_THREADS_PER_MULTIPROCESSOR 1024
NUMBER_OF_MULTIPROCESSORS 68
我在 CUDA 中有 2 个相同的内核,报告理论占用率为 50%...
OK
...并且可以同时运行
这不是占用的含义,也是不正确的。
50% 的占用率并不意味着您有 50% 的未使用资源可供不同的内核同时使用。这意味着当运行最大理论并发扭曲数的 50% 时,您的代码耗尽了资源。如果您耗尽了资源,则无法再运行任何扭曲,无论它们来自该内核还是任何其他内核。
但是,在不同的流中调用它们会显示顺序执行。
由于上述原因,这正是应该预期的
每个内核调用的网格和块尺寸如下:
Grid(3, 568, 620)
Block(256, 1, 1 )
With 50 registers per thread.
您提供了一个启动 1041600 个块的内核。这比最大的 GPU 可以同时运行的数量级还要高出几个数量级,这意味着如此巨大的网格的并发内核执行范围基本上为零。
这会导致每个 SM 的线程过多以及每个块的寄存器过多。
寄存器压力可能是限制占用率的原因
我应该将下一步的优化重点放在减少内核使用的寄存器数量上吗?
鉴于并发内核执行的目标是不可能的,我认为目标应该是使该内核运行得尽可能快。如何做到这一点是特定于代码的。在某些情况下,寄存器优化可以提高占用率和性能,但有时发生的情况是溢出到本地内存,从而损害性能。
或者将网格分割成许多较小的网格是否有意义,从而可能允许发布两个内核并同时运行。
当您说“很多”时,您将暗示数千个网格,这将意味着如此多的启动和调度延迟,如果您能够设法达到可以并发内核执行的程度,我无法想象这样做有什么好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)