NCCL (NVIDIA Collective Communications Library) 中重要 API 的总结表

以下是 NCCL (NVIDIA Collective Communications Library) 中重要 API 的总结表格,涵盖了常用集合通信操作、初始化与管理函数:


📌 NCCL 重要 API 总结表

API 函数 作用简介 关键参数说明
ncclCommInitRank 初始化 NCCL 通信器,为每个进程分配唯一 rank - ncclComm_t* comm: 输出的通信器句柄 - int ndev: 通信组中的总进程数 - ncclUniqueId commId: 由 ncclGetUniqueId 生成的唯一 ID - int rank: 当前进程在通信组中的排名(0 ~ ndev-1)
ncclGetUniqueId 生成用于初始化通信组的唯一 ID - ncclUniqueId* uniqueId: 输出的唯一 ID,需广播给所有参与进程
ncclCommDestroy 销毁通信器,释放资源 - ncclComm_t comm: 要销毁的通信器
ncclCommAbort 异常时强制中止通信器 - ncclComm_t comm: 要中止的通信器
ncclAllReduce 全局规约:所有进程提供输入缓冲区,结果(如求和)广播到所有进程的输出缓冲区 - const void* sendbuff: 发送缓冲区 - void* recvbuff: 接收缓冲区 - size_t count: 元素数量 - ncclDataType_t datatype: 数据类型(如 ncclFloat) - ncclRedOp_t op: 规约操作(如 ncclSum) - ncclComm_t comm: 通信器 - cudaStream_t stream: 关联的 CUDA 流
ncclBroadcast 广播:将 root 进程的数据广播到所有进程 - void* buffer: 输入/输出缓冲区(root 发送,其他接收) - size_t count: 元素数量 - ncclDataType_t datatype: 数据类型 - int root: 源进程 rank - ncclComm_t comm: 通信器 - cudaStream_t stream: CUDA 流
ncclReduce 规约:所有进程提供数据,结果汇总到 root 进程 - const void* sendbuff: 发送缓冲区 - void* recvbuff: 接收缓冲区(仅 root 有效) - size_t count: 元素数量 - ncclDataType_t datatype: 数据类型 - ncclRedOp_t op: 规约操作 - int root: 目标进程 rank - ncclComm_t comm: 通信器 - cudaStream_t stream: CUDA 流
ncclAllGather 全收集:每个进程提供数据,所有数据拼接后分发给所有进程 - const void* sendbuff: 发送缓冲区(大小 = count) - void* recvbuff: 接收缓冲区(大小 = count * ndev) - size_t count: 每个进程发送的元素数 - ncclDataType_t datatype: 数据类型 - ncclComm_t comm: 通信器 - cudaStream_t stream: CUDA 流
ncclReduceScatter 规约散播:先按元素规约,再将结果块分发给各进程 - const void* sendbuff: 发送缓冲区(大小 = count * ndev) - void* recvbuff: 接收缓冲区(大小 = count) - size_t count: 每个进程接收的元素数 - ncclDataType_t datatype: 数据类型 - ncclRedOp_t op: 规约操作 - ncclComm_t comm: 通信器 - cudaStream_t stream: CUDA 流
ncclSend / ncclRecv 点对点通信:在集合通信上下文中发送/接收数据 - const void* sendbuff / void* recvbuff: 发送/接收缓冲区 - size_t count: 元素数量 - ncclDataType_t datatype: 数据类型 - int peer: 目标/源进程 rank - ncclComm_t comm: 通信器 - cudaStream_t stream: CUDA 流
ncclGroupStart / ncclGroupEnd 组合操作:将多个 NCCL 调用组合为一个原子操作 无参数,用于包裹多个集合通信调用,确保它们并行执行

📝 补充说明

1. 数据类型 (ncclDataType_t)

  • ncclInt8, ncclUint8, ncclInt32, ncclUint32, ncclInt64, ncclUint64
  • ncclFloat16, ncclFloat32, ncclFloat64, ncclBfloat16

2. 规约操作 (ncclRedOp_t)

  • ncclSum: 求和
  • ncclProd: 求积
  • ncclMax: 最大值
  • ncclMin: 最小值
  • ncclAvg: 平均值(NCCL 2.10+)

3. 典型使用流程

c 复制代码
// 1. 获取唯一 ID(rank 0 生成并广播)
ncclUniqueId id;
if (rank == 0) ncclGetUniqueId(&id);
MPI_Bcast(&id, sizeof(id), MPI_BYTE, 0, MPI_COMM_WORLD);

// 2. 初始化通信器
ncclComm_t comm;
ncclCommInitRank(&comm, nranks, id, rank);

// 3. 执行集合通信(如 AllReduce)
ncclAllReduce(sendbuf, recvbuf, count, ncclFloat, ncclSum, comm, stream);

// 4. 销毁通信器
ncclCommDestroy(comm);

4. 注意事项

  • NCCL 调用需绑定 CUDA 流,且通常在 GPU 内存上操作
  • 所有进程必须按相同顺序调用集合通信函数
  • 使用 ncclGroupStart/End 可组合多个操作,提升性能

如果需要更详细的示例代码或特定场景的使用指导,可以进一步补充说明!

相关推荐
j_xxx404_2 小时前
Linux:自主shell命令行解释器附源码
linux·运维·服务器
开开心心就好2 小时前
开源免费高速看图工具,支持漫画大图秒开
linux·运维·服务器·安全·ruby·symfony·1024程序员节
花间相见2 小时前
【AI开发】—— Ubuntu系统使用nvm管理Node.js多版本,版本切换一键搞定(实操完整版)
linux·ubuntu·node.js
PPPPPaPeR.2 小时前
从零实现一个简易 Shell:理解 Linux 进程与命令执行
linux·开发语言·c++
Byte不洛3 小时前
Linux 多线程:生产者消费者模型、阻塞队列与条件变量详解
linux·多线程·并发编程·pthread·生产者消费者模型
小Pawn爷3 小时前
13.virtualbox安装ubuntu
linux·运维·ubuntu
VekiSon3 小时前
Linux内核驱动——Ubuntu 网络启动环境配置与操作
linux·arm开发·嵌入式硬件·ubuntu
YYYing.3 小时前
【Linux/C++进阶篇(二) 】超详解自动化构建 —— 日常开发中的“脚本” :Makefile/CMake
linux·c++·经验分享·ubuntu
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][gpio[[gpiolib]
linux·笔记·学习