📄️ 使用NCCL
使用NCCL与使用其他库类似,你需要按照以下步骤在代码中使用:
📄️ 创建通信器
创建通信器时,需要为通信器中的每个CUDA设备分配一个介于0和n-1之间的唯一rank。
📄️ 集合通信
必须为每个rank(即CUDA设备)调用集合通信,以形成完整的集合通信。否则,其他rank将无限期等待。
📄️ 数据指针
通常情况下,NCCL将接受从与通信对象关联的CUDA设备可访问的任何CUDA指针。这包括:
📄️ CUDA流语义
NCCL调用与流相关,并作为集合通信函数的最后一个参数传递。NCCL调用在操作已被有效排队到给定的流上时返回,或者返回错误。集合通信然后在CUDA设备上异步执行。
📄️ 组调用
组函数 (ncclGroupStart/ncclGroupEnd) 可以用于 将多个调用合并为一个。这主要有三个用途:
📄️ 点对点通信
(自NCCL 2.7起) 点对点通信可以用于在进程之间表达任意的通信模式。
📄️ 线程安全
NCCL基本原语一般不是线程安全的,但它们是可重入的。多个线程应该使用单独的通信器对象。
📄️ 原地操作(in-place)
In-place operations 是指在不使用额外空间的情况下对数据进行操作的方法。在计算机科学中,in-place操作指的是在原地进行修改,而不需要创建新的副本或分配额外的内存。
📄️ 使用 CUDA 图形与 NCCL
从 NCCL 2.9 开始,NCCL操作可以被 CUDA 图形所捕获。
📄️ 用户缓冲区注册
userbufferreg}