CUDA 设备最大连接数
内容提要
CUDA_DEVICE_MAX_CONNECTIONS 环境变量控制 GPU 硬件并发连接数,默认仅为 8。即使软件层创建大量 CUDA 流,若该值不足,GPU 仍会因硬件队列限制而利用率低下。实验用 32 个流测试,吞吐量随该值从 1 增至 32 几乎翻倍,达 84601 QPS。每个流映射一个硬件队列,建议将其设为与流数一致以最大化 GPU 利用率。AMD GPU 对应变量为 GPU_MAX_HW_QUEUES,默认 4。
延伸解读
硬件队列:软件并发的隐形瓶颈
文章指出,每个 CUDA 流会映射到 GPU 上的一个硬件队列,而硬件队列的数量由 CUDA_DEVICE_MAX_CONNECTIONS 控制。默认值仅为 8,这意味着即使软件层创建了 32 个流,硬件也只能同时处理 8 个队列,导致 GPU 利用率低下。因此,在编写多流应用时,必须检查并调整该环境变量,使其与流数量匹配,才能充分发挥 GPU 的并发能力。
实验数据:吞吐量随连接数线性增长
文章通过实验展示了 CUDA_DEVICE_MAX_CONNECTIONS 从 1 增加到 32 时,系统吞吐量(QPS)几乎翻倍增长,从 3845.73 提升至 84601.20。这表明硬件连接数直接决定了多流应用的性能上限。开发者若忽略此设置,即使内核轻量、流数量充足,GPU 仍会因硬件队列不足而出现大量气泡,无法达到预期吞吐。
AMD GPU 的对应设置与默认限制
文章提到,AMD GPU 也有类似的硬件队列概念,通过 GPU_MAX_HW_QUEUES 环境变量控制,默认值为 4,比 CUDA 的默认值更低。这意味着在 AMD 平台上,多流应用的并发限制可能更严重。开发者需要根据流数量调整该变量,并可通过 Perfetto trace 中的 hsa_queue 属性验证流到硬件队列的映射情况。
Q&A
CUDA_DEVICE_MAX_CONNECTIONS 环境变量的作用是什么?
它控制 GPU 硬件并发连接数,即 GPU 上硬件队列的数量。每个 CUDA 流会映射到一个硬件队列,该变量决定了最多有多少个流可以同时映射到不同的硬件队列,从而影响 GPU 的并发执行能力。
CUDA_DEVICE_MAX_CONNECTIONS 的默认值是多少?如果不设置会有什么影响?
默认值为 8。如果不设置,即使软件层创建了大量 CUDA 流,GPU 硬件并发也会被限制在 8 个连接,导致 GPU 利用率低下,系统吞吐量无法达到最优。
如何设置 CUDA_DEVICE_MAX_CONNECTIONS 来最大化 GPU 利用率?
建议将其设置为与应用程序中创建的 CUDA 流数量一致。例如,如果使用 32 个流,就将该变量设为 32,这样每个流都能映射到独立的硬件队列,从而最大化 GPU 并发和吞吐量。
CUDA_DEVICE_MAX_CONNECTIONS 对多流工作负载的性能影响有多大?
影响显著。实验使用 32 个流,当该值从 1 增加到 32 时,系统吞吐量从 3,845.73 QPS 提升到 84,601.20 QPS,几乎翻倍增长。这表明该值与整体性能强相关。
为什么即使创建了很多 CUDA 流,GPU 利用率仍然不高?
因为 CUDA_DEVICE_MAX_CONNECTIONS 默认只有 8,限制了硬件队列的数量。如果流数超过该值,多个流会共享同一个硬件队列,导致 GPU 上出现大量气泡(空闲时间),即使内核很轻量,也无法充分利用 GPU。
AMD GPU 上对应的硬件队列控制变量是什么?默认值是多少?
AMD GPU 上对应的环境变量是 GPU_MAX_HW_QUEUES,它指定了可用于映射流的最大硬件队列数。默认值为 4,意味着如果不调整,GPU 并发能力非常有限。