NCCL软件对象(概念)分析

下面的示意图以 2 个 node、4 个 CUDA device、4 个 rank 为例,展示 NCCL 中各对象的归属关系、通信任务的提交过程,以及运行时的数据传输机制。每个 node 上有一个 Process,分别管理两个 CUDA device;四个 rank 共同组成一个 Communicator,通过多个 Channel 并行处理通信数据。整体分为六个层次,同一列尽量对应同一个 rank 及其资源,将逻辑身份、软件对象与物理设备联系起来。

1. 身份与成员层:确定哪些成员参与通信。

Communicator 定义一组通信参与者及其通信上下文。rank 是成员在该 Communicator 中的逻辑编号,范围为 0 … nRanks−1。每个 rank 通过本地的 ncclComm_t 对象保存自身状态,并关联一个 CUDA device。图中的 comm0~comm3 是同一个 Communicator 在四个 rank 上的本地对象。

UniqueId 是初始化 Communicator 时使用的引导标识,其数据类型为 ncclUniqueId。在图示的 ncclCommInitRank() 初始化方式下,由一个参与者调用 ncclGetUniqueId() 生成 UniqueId,再通过 MPI、Socket 等外部机制分发给所有参与者。因此,图中的四个本地对象使用相同的 UniqueId;独立初始化另一个 Communicator 时,应重新生成 UniqueId。

UniqueId 与 Communicator 并非在所有创建方式下都一一对应:ncclCommInitRankScalable() 可以使用多个 UniqueId 初始化一个 Communicator;ncclCommSplit() 则可以从已有 Communicator 派生新 Communicator,无须用户重新生成 UniqueId。

2. Host 调度层:组织 API 调用并生成执行计划。

Group 是由 ncclGroupStart() 和 ncclGroupEnd() 包围、属于当前 Host thread 的调用范围,可以组织一个线程对多个 CUDA device 的操作,也可以聚合通信调用。最外层 ncclGroupEnd() 统一推进所收集的操作。图中分别展示初始化 Group 和通信 Group,两者属于不同的调用范围。

图中的 job 特指 NCCL 内部的 Host 任务,例如初始化使用的 ncclAsyncJob。它包含执行函数与任务状态,可由当前线程或 worker 执行。

planner 负责将 API 提交的通信任务编排为执行计划。对于图示的常规 kernel 路径,它选择 algorithm / protocol,分配 Channel / chunk,生成 ncclKernelPlan 和 work descriptors,并准备所需的 Proxy 操作。随后由 launch 路径将选定的 kernel 和参数提交给 GPU。这里的“转换”主要是选择和编排已有 kernel,并不意味着将每次 API 调用编译成一个新 kernel;多个调用也可能被组织进同一个执行计划。

3. 本地资源层:展示每个 rank 拥有哪些对象。

每个本地 Communicator 都维护自己的 planner、work 存储和 Channel 等资源。图中采用 workFifo 路径:同一个本地 Communicator 的多个 Channel 共享这份 work 存储,GPU kernel 从中读取执行描述。

每个 Channel 保存自己的 Ring、Tree 等拓扑信息,以及面向通信伙伴的 peers[p] 状态。其中,send / recv 表示发送方向和接收方向的连接资源,包含 buffer、进度信息及 transport 所需的连接状态。四列结构相同,说明各 rank 都维护相应的本地资源。

4. 并行通路层:展示通信数据如何分配给 Channel。

Channel 是 Communicator 内部组织并行通信的逻辑通路。一次通信操作的数据可以划分为多个 chunk,分配给不同 Channel 处理。图中的两个 Channel 使用不同的 Ring 顺序,并分别突出其负责的数据块。

Ring 表示 rank 之间的环形通信关系,Tree 表示树形通信关系。相关拓扑在初始化过程中建立,planner 根据具体操作选择 Channel 并分配数据。Channel 是软件中的逻辑通路,与物理 GPU 互联或 RNIC 之间没有固定的一一对应关系。

5. 队列与运行时层:协调执行描述、数据传输与进度。

workFifo 是 Host planner 向 GPU kernel 提供 work descriptors 的环形存储区,记录 buffer 地址、数据量和 Channel 范围等执行信息。图中的 ncclDevWorkColl 展示了一种集合通信 work descriptor。workFifoProduced 和 workFifoConsumed 跟踪空间的使用与回收,图示路径通过 CUDA event 和 callback 确认相应工作完成。FIFO、Args、Persistent 是不同的 work 存储方式。

connFifo 是连接运行时使用的 slot 元数据数组,GPU kernel 与 CPU Proxy 通过它协作。Proxy 是在 Host 上推进传输工作的执行组件。connFifo 的生产者与消费者需要按具体字段判断:在图示的 NET + Simple 路径中,Send 的 size 由 GPU kernel 写入、CPU Proxy 读取;Shared buffer 模式的 offset 由 CPU Proxy 写入、GPU kernel 读取。因此,connFifo 中包含双向交换的信息。真正的 payload 存放在独立的 buffs[protocol] 等数据 buffer 中。

step 表示推进步骤,通过 step % NCCL_STEPS 选择环形 slot;head / tail 是连接中独立的进度字段,用于协调数据就绪与空间复用,不属于 connFifo slot。Send 路径中,Proxy 需要结合 tail 判断数据是否准备完成,不能只看 size。Recv 路径中,RNIC 写入 payload,Proxy 确认接收完成并完成所需的 flush 后更新 tail,GPU kernel 再消费数据。具体机制随 transport、protocol 和 buffer 模式而变化。

6. 物理映射层:对应实际设备与互联。

图中的 node 表示一台物理主机,CUDA device 表示进程可见的 CUDA 设备。设备编号属于进程的可见设备空间,因此两个 node 上都可以出现 CUDA device 0;而 rank 编号属于 Communicator,两者含义不同。

GPU 内部的 SM 执行计算与通信 kernel,CE 表示 Copy Engine,HBM 存放设备数据。节点内的 GPU 通过 NVLink 互联,并通过 PCIe 与 RNIC 交换数据。RNIC 是支持 RDMA 的网络接口设备,节点之间通过图中所示的 IB / RoCE Network 通信。

相关新闻

深⼊理解指针(1)

深⼊理解指针(1)

深入理解指针(1) 文章目录深入理解指针(1)一. 内存和地址(一)内存(二)如何理解编址二. 指针变量和地址(一)取地址操作符&(二)指针变量和解引用操作符*1. 指针变量2. 如何拆解指针…

2026/10/20 19:54:52 阅读更多 →
自然语言到优化求解:构建可解释的约束驱动系统

自然语言到优化求解:构建可解释的约束驱动系统

1. 这不是又一个“调用大模型API”的玩具项目“从零构建一个自己的自然语言优化求解系统”——这个标题里最需要被拆开揉碎、重新校准的,是“自己的”和“优化求解”这两个词。它不指向一个封装了ChatGLM或Qwen接口的网页前端,也不等于在LangChain里拖拽…

2026/10/20 19:53:51 阅读更多 →
支付宝分账和微信分账哪个好用?商户怎么挑?

支付宝分账和微信分账哪个好用?商户怎么挑?

服装批发市场里,有个档口老板同时挂着微信和支付宝两个收款码,来找货的小店主习惯微信付款,线上拿货的分销商偏爱支付宝。后台一看,两个平台都能分账,功能列表长得差不多,他犯起难来:到底该以哪…

2026/10/20 19:53:51 阅读更多 →

最新新闻

技能习得底层逻辑:从知识到肌肉记忆的刻意练习路径

技能习得底层逻辑:从知识到肌肉记忆的刻意练习路径

1. 从“skills”这个标题说起:一个被严重低估的硬核话题“skills”这个词,单独拎出来看,信息量几乎为零。它不像“分布式锁”“图像分割”“家庭收纳”那样自带场景,也不像“副业”“跳槽”那样自带情绪。但恰恰是这种极简的标题&…

2026/10/20 21:27:39 阅读更多 →
GPT-4o权重存档:为何模型参数比API更关键

GPT-4o权重存档:为何模型参数比API更关键

1. 一场没有官方通告的“退役”:GPT-4o权重开放请愿背后的现实逻辑“GPT-4o退役8个月”这个说法,乍看像一则突发新闻,实则是一次社区自发形成的集体认知校准。它并非来自任何技术公告或产品日志,而是开发者、研究者与开源实践者在…

2026/10/20 21:27:39 阅读更多 →
Kafka NoBrokersAvailable异常排查实战指南

Kafka NoBrokersAvailable异常排查实战指南

kafka.errors.NoBrokersAvailable: NoBrokersAvailable这个异常,只要是写过 Python Kafka 客户端的人,联调和上云阶段大概率都撞见过。我第一次遇到它是在一个数据同步任务里,消费者刚启动日志就刷出这个异常,看起来像整个集群挂了…

2026/10/20 21:27:39 阅读更多 →
UNet图像分割实战:数据管道、损失设计与工业级部署

UNet图像分割实战:数据管道、损失设计与工业级部署

简介:本资源是一份面向Python图像处理初学者与深度学习入门者的U-Net图像分割实践项目,聚焦生物医学、遥感及卫星影像等场景下的像素级分割任务。资源提供完整可运行代码框架与配套示例数据,涵盖数据预处理、模型构建(含跳跃连接与…

2026/10/20 21:27:39 阅读更多 →
从零搭建个人技能管理系统:结构化数据模型与实操流程

从零搭建个人技能管理系统:结构化数据模型与实操流程

1. 当“skills”不再是一个空壳:从零搭建个人技能管理系统的底层逻辑“skills”这个词,单独拎出来看,信息量几乎为零。它可以是简历上罗列的一串名词,可以是招聘JD里反复出现的硬性要求,也可以是某个技术社区里被反复讨…

2026/10/20 21:27:39 阅读更多 →
从函数到能力封装:构建可复用、可编排的skills技能系统

从函数到能力封装:构建可复用、可编排的skills技能系统

1. 当“skills”成为一个项目标题:我看到的不是技能清单,而是一套能力封装系统第一次看到“skills”这个标题时,我脑子里冒出来的不是“技能列表”四个字,而是一个更具体的画面:一个可以被反复调用、组合、扩展的能力单…

2026/10/20 21:26:35 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →