【NCCL】4 AllGather-PAT算法

AllGather-PAT算法

根据前三篇,可以得知:如果仅想要查看一个算法和其余算法的不同点,着重入手的地方为如下三处

  1. 算法成本权重计算
  2. 预建链
  3. 算子实现

未完,不一定有续

NCCL 中 AllGather 自动选择 PAT 算法的条件

PAT 算法启用的必要条件

1. 硬件要求

GPU 架构要求
cpp 复制代码
if (comm->minCompCap < 60) return 0; // Need SM60 or higher for CUDA atomics
拓扑要求
  • 每节点 GPU 数量 : 必须是 1 GPU/节点(这是最关键的限制)
  • 代码位置 : src/graph/tuning.cc:206
cpp 复制代码
if (comm->nNodes != comm->nRanks) return 0; // PAT only supports 1 GPU per node
网络设备要求
  • 网络设备类型 : 必须是 HOST 类型(不支持网络设备卸载)
  • 代码位置 : src/graph/tuning.cc:207
cpp 复制代码
if (comm->netDeviceType != NCCL_NET_DEVICE_HOST) return 0; // PAT doesn't support net device offload

2. 协议要求

cpp 复制代码
if ((coll == ncclFuncReduceScatter || coll == ncclFuncAllGather)
    && a == NCCL_ALGO_PAT && (p != NCCL_PROTO_SIMPLE || ncclPatEnable(comm) == 0)) continue;

3. 环境变量(可选)

虽然要求不通过环境变量强制指定,但了解相关参数有助于理解:

  • NCCL_PAT_ENABLE: 默认值为 2(自动),可设为 0(禁用)或 1(强制启用)
  • 代码位置 : src/graph/tuning.cc:201-209

PAT 算法的性能模型

带宽计算

  • 基础带宽 : 从拓扑图获取 graphs[NCCL_ALGO_PAT]->bwIntra
  • 效率因子 : 乘以 0.75
  • 代码位置 : src/graph/tuning.cc:310
cpp 复制代码
if (a == NCCL_ALGO_PAT) busBw *= .75;

延迟计算(AllGather)

  • 基础延迟: 8.0 μs(所有协议)
  • 额外延迟 : log2(nNodes) * (interLat/3.5) + nRanks * 2.8
  • 代码位置 : src/graph/tuning.cc:396-400
cpp 复制代码
if (a == NCCL_ALGO_PAT) {
  if (coll == ncclFuncAllGather || coll == ncclFuncReduceScatter) {
    comm->latencies[coll][a][p] += log2i(nNodes) * (interLat/3.5) // Log latency
      + nRanks * 2.8; // Still a linear part
  }
}

硬件延迟(SIMPLE 协议)

算法选择逻辑

成本计算公式

ncclTopoGetAlgoTime() 中:

cpp 复制代码
*time = lat * latCount + nBytes / (1000 * bw);

选择最优算法

topoGetAlgoInfo() 中,遍历所有算法和协议组合,选择时间最短的:

cpp 复制代码
for (int a=0; a<NCCL_NUM_ALGORITHMS; a++) {
  for (int p=0; p<NCCL_NUM_PROTOCOLS; p++) {
    if (table[a][p] >= 0.0 && table[a][p] < minTime) {
      algorithm = a;
      protocol = p;
      minTime = table[a][p];
    }
  }
}

如何让 AllGather 选择 PAT 算法

推荐配置

硬件拓扑
复制代码
拓扑结构: 多节点,每节点 1 GPU
示例: 4 节点 × 1 GPU = 4 个 GPU 总计
GPU 要求
复制代码
GPU 架构: Pascal (SM 6.0) 或更高
推荐: Volta (SM 7.0+), Ampere (SM 8.0+), Hopper (SM 9.0+)
网络配置
复制代码
网络类型: 主机端网络(非 GPU Direct RDMA 卸载)
网络设备: InfiniBand 或高速以太网
CUDA 版本
复制代码
CUDA Runtime: 任意版本(PAT 不需要特定 CUDA 版本)
Driver: 支持对应 GPU 架构的驱动

数据大小建议

PAT 算法在以下情况下性能最优:

  • 中等到大数据量: 建议 > 64 KB
  • 多节点场景: 节点数越多,PAT 的对数延迟优势越明显

示例配置

配置 1: 4 节点 × 1 GPU(最理想)
cpp 复制代码
// 硬件拓扑
nRanks = 4
nNodes = 4  // 每节点 1 GPU
minCompCap = 70  // Volta 或更高
netDeviceType = NCCL_NET_DEVICE_HOST

// AllGather 调用
size_t count = 1024 * 1024;  // 1M 元素
ncclAllGather(sendbuff, recvbuff, count, ncclFloat32, comm, stream);
配置 2: 8 节点 × 1 GPU
cpp 复制代码
// 硬件拓扑
nRanks = 8
nNodes = 8  // 每节点 1 GPU
minCompCap = 80  // Ampere
netDeviceType = NCCL_NET_DEVICE_HOST

// AllGather 调用
size_t count = 512 * 1024;  // 512K 元素
ncclAllGather(sendbuff, recvbuff, count, ncclFloat32, comm, stream);

PAT 算法何时会被选择

性能优势场景

PAT 算法在以下情况下会胜出:

  1. 多节点场景(每节点 1 GPU)

    • PAT 的对数延迟 log2(nNodes) 优于 Ring 的线性延迟 nRanks-1
    • 节点数越多,优势越明显
  2. 中等数据量

    • 延迟占主导时,PAT 的对数延迟优势明显
    • 太小的数据量可能选择 LL 协议的 Ring
    • 太大的数据量带宽占主导,可能选择其他算法
  3. 主机端网络

    • 不使用 GPU Direct RDMA 卸载
    • 网络设备类型为 HOST

性能对比示例

假设 8 节点 × 1 GPU,数据量 1 MB:

算法 延迟计算 带宽 总时间
PAT 8.0 + log2(8)*(interLat/3.5) + 8*2.8 ≈ 35 μs busBw * 0.75 较优
Ring (8-1) * interLat ≈ 98 μs busBw 延迟较高

验证方法

查看日志

启用 NCCL 调试日志查看选择的算法:

bash 复制代码
export NCCL_DEBUG=INFO
export NCCL_DEBUG_SUBSYS=TUNING

运行程序后会看到类似输出:

复制代码
AllGather: 4194304 Bytes -> Algo PAT proto SIMPLE channel{Lo..Hi}={0..15}

代码验证点

scheduleCollTasksToPlan() 中会打印选择的算法:

cpp 复制代码
INFO(NCCL_TUNING, "%s: %ld Bytes -> Algo %s proto %s channel{Lo..Hi}={%d..%d}",
  ncclFuncToString(task->func), task->count * ncclTypeSize(task->datatype), 
  ncclAlgoToString(task->algorithm), ncclProtoToString(task->protocol), 
  devWork->channelLo, devWork->channelHi);

总结

要让 AllGather 自动选择 PAT 算法,需要满足:

必要条件(缺一不可)

  1. GPU 架构: SM 6.0+(Pascal 或更高)
  2. 拓扑结构: nNodes == nRanks(每节点 1 GPU)
  3. 网络类型: netDeviceType == NCCL_NET_DEVICE_HOST
  4. 协议: NCCL_PROTO_SIMPLE
  5. PAT 启用: ncclPatEnable(comm) == 1(默认满足)

性能优势条件

  1. 节点数: 4+ 节点(对数延迟优势明显)
  2. 数据量: 中等到大(64 KB - 几 MB)
  3. 网络: 高速网络(InfiniBand 等)

典型场景

最理想: 8 节点 × 1 GPU/节点,使用 InfiniBand 网络,AllGather 1 MB 数据,Volta 或更高架构的 GPU。

相关推荐
驱动探索者2 小时前
[缩略语大全]之[内存管理]篇
java·网络·算法·内存管理
·云扬·2 小时前
MySQL Join关联查询:从算法原理到实战优化
数据库·mysql·算法
bbq粉刷匠2 小时前
二叉树中两个指定节点的最近公共祖先
java·算法
Alsn863 小时前
29.Java中常见加解密算法的基本实现
java·开发语言·算法
1001101_QIA3 小时前
OpenMP学习笔记
算法
Coovally AI模型快速验证3 小时前
YOLO11算法深度解析:四大工业场景实战,开源数据集助力AI质检落地
人工智能·神经网络·算法·计算机视觉·无人机
(❁´◡`❁)Jimmy(❁´◡`❁)3 小时前
【算法】 二分图理论知识和判断方法
c++·算法
徐子童3 小时前
优选算法---哈希表
数据结构·算法·哈希表
疑惑的杰瑞3 小时前
掌握 C 语言流程控制:分支、循环、goto 与表达式求值详解
c语言·开发语言·算法·算术转换