本教程旨在通过一系列由浅入深的示例,帮助您理解和掌握 NVIDIA 集合通信库 (NCCL)。
- 第一章:NCCL 简介
- 背景介绍:什么是 NCCL,它的优势以及应用场景。
- 第二章:入门:初始化和基本集合操作
- 背景介绍:如何初始化 NCCL 通信器,并使用
ncclAllReduce进行一个简单的集合操作。 - 代码示例:
all_reduce_simple.c - 总结
- 背景介绍:如何初始化 NCCL 通信器,并使用
- 第三章:集合通信:广播 (Broadcast)
- 背景介绍:理解广播操作,即一个 GPU 将数据发送到所有其他 GPU。
- 代码示例:
broadcast_simple.c - 总结
- 第四章:集合通信:归约 (Reduce)
- 背景介绍:学习归约操作,即从所有 GPU 收集数据并进行计算,将结果存储在一个 GPU 上。
- 代码示例:
reduce_simple.c - 总结
- 第五章:集合通信:全收集 (All-Gather)
- 背景介绍:掌握全收集操作,每个 GPU 收集所有其他 GPU 的数据。
- 代码示例:
all_gather_simple.c - 总结
- 第六章:点对点通信:发送和接收
- 背景介绍:除了集合通信,NCCL 也支持点对点操作。
- 代码示例:
send_recv_simple.c - 总结
- 第七章:管理多个 GPU
- 背景介绍:如何在一个程序中管理多个 GPU 设备,并让它们协同工作。
- 代码示例:
multi_gpu_all_reduce.c - 总结
- 第八章:NCCL 与 CUDA 流
- 背景介绍:如何将 NCCL 操作与 CUDA 流结合,以实现计算和通信的重叠。
- 代码示例:
stream_all_reduce.c - 总结
- 第九章:集合通信:归约分散 (Reduce-Scatter)
- 背景介绍:学习归约分散操作,将所有GPU数据归约后分散到各GPU的不同部分。
- 代码示例:
reduce_scatter_simple.c - 总结
- 第十章:集合通信:全交换 (All-to-All)
- 背景介绍:掌握全交换操作,每个GPU向每个其他GPU发送和接收不同的数据。
- 代码示例:
all_to_all_simple.c - 总结
本教程现已涵盖了 NCCL 支持的所有主要集合通信算子:
- AllReduce (第二章) - 所有GPU参与归约,结果广播给所有GPU
- Broadcast (第三章) - 一个GPU广播数据到所有其他GPU
- Reduce (第四章) - 所有GPU数据归约到指定的根GPU
- AllGather (第五章) - 收集所有GPU数据,每个GPU都获得完整数据集
- ReduceScatter (第九章) - 归约后分散,每个GPU获得结果的不同部分
- Send/Recv (第六章) - 点对点通信,GPU之间直接发送和接收数据
- AllToAll (第十章) - 全交换通信,每个GPU与所有其他GPU交换不同数据
- 多GPU管理 (第七章) - 在单个程序中协调多个GPU设备
- CUDA流集成 (第八章) - 将NCCL与CUDA流结合实现计算通信重叠
这些算子构成了分布式深度学习和高性能计算的基础通信原语,涵盖了从简单的数据广播到复杂的数据重分布等各种通信模式。
本教程中的所有示例都假定在支持 RoCEv2 的网络环境下运行,以实现高效的 RDMA 通信。