【学习】 NVIDIA CFT(Compute Fabric Transport)特性分析

NVIDIA CFT(Compute Fabric Transport)特性分析

版本:2026-10 | 素材来源:NVIDIA 官方文档(NCCL 2.32.3 Device API / Usage Guide、CUDA Toolkit 13.4 官方博客)、NCCL Release Notes、PyTorch SymmetricMemory 文档

定位:面向通信库/高级应用开发者的"传输为中心"(transport-centric)设备端数据移动机制


0. 一句话概述

CFT(Compute Fabric Transport,计算织物传输) 是 NVIDIA 从 NCCL 2.31 / CUDA 13.3 开始提供的设备端通信能力:它把 CUDA fabric 的 逻辑端点(logical endpoint) 暴露给 GPU 内核,让内核直接用 fabric 指令发起 异步 put / get / 归约 / barrier 操作,跨 NVLink 织物(fabric)移动数据,而无需把远端 GPU 内存映射进本地进程的虚拟地址空间。

  • 硬件要求:Blackwell(SM_100)及更新架构
  • 软件要求:CUDA Toolkit 13.3+、驱动 ≥ 610.43.02、NCCL 2.31+
  • 定位:仅通过 CUDA Driver API 使用,面向通信库开发者(NCCL / NVSHMEM / PyTorch 等),普通应用层开发者应使用 NCCL / NVSHMEM 等高阶库

1. 背景与动机

1.1 规模扩展带来的地址空间压力

AI 工厂(AI factory)时代,超节点规模持续扩大:以 72-GPU Vera Rubin NVL72 为例,单域 NVLink 提供每 GPU 3.6 TB/s 双向带宽、机架级 260 TB/s。GPU 数量越多,"每个进程都把参与通信的远端 GPU 分配映射进自己的虚拟地址空间"的传统做法就越难以为继:

  • 虚拟地址(VA)压力:多 GPU + 多进程 + 大显存(HBM3e 上百 GB/卡),peer 映射 / IPC 映射数量随 rank 数平方增长,64 位 VA 空间也会被吃紧;
  • 映射管理开销:每次分配/映射、IPC 句柄交换都需要 host 参与,且映射粒度粗、无法精细控制;
  • 通信与计算分离:传统 NCCL 集合通信是独立的 kernel/库调用,难以在自定义内核内部直接"算完就发",计算-通信重叠依赖库层调度。
  • NVLink 是 NVIDIA 专为 AI 工厂打造的 scale-up 网络,第 4 代 NVSwitch(Hopper)开始内置 SHARP(Scalable Hierarchical Aggregation and Reduction Protocol)引擎 ,即 NVLink SHARP(NVLS):GPU 可发出 multimem PTX load/store 指令访问多播地址,交换机在转发的同时完成数据复制与归约;
  • Blackwell 延续并强化了该能力(multimem 指令、多播归约、fabric 指令集),CFT 正是建立在"fabric 指令 + logical endpoint"这套硬件抽象之上。

1.3 软件演进路线

复制代码
传统 IPC / peer mapping(映射每个远端分配)
        ↓
NVLS / SymmetricMemory window(多播 + 交换机内归约,仍需 window 地址空间)
        ↓
NCCL Device API(ncclDevComm,内核内集合通信原语)
        ↓
CFT(transport-centric:logical endpoint + fabric 指令,内核直接 put/get/red/barrier)

2. 核心原理

2.1 transport-centric 模型

CFT 的核心转变是从"内存映射为中心"到"传输为中心":

维度 传统方式(映射为中心) CFT(传输为中心)
寻址 远端内存映射成本地 VA 指针 命名逻辑端点 (le_id, le_offset)
数据移动 load/store / 拷贝 fabric 指令异步 put/get/red
通信方 host 编排 + kernel 参与 内核直接发起,无需 host 逐次介入
地址空间 每个远端分配占一份 VA 不占本地 VA,压力大幅下降
模式 单播为主 单播 + 多播(multicast)

2.2 三个关键抽象

  1. 对称内存窗口(Symmetric Memory Window):参与通信的 rank 各自分配、大小一致、对齐一致的缓冲区,注册为 window 后,所有 rank 看到的是同一份"对称"地址布局------这是 CFT 寻址的基础;
  2. 逻辑端点(Logical Endpoint) :CFT 数据移动操作都作用在"端点 ID + 端点内偏移"上。(le_id, le_offset) 是不透明对,由 NCCL 提供 host/device 两侧的查询 API,把 (window, offset, peer) 翻译成 (le_id, le_offset);
  3. CFT Team:用 team(单播组 / 多播组)而不是 world rank 来寻址对端,支持构建层级化通信模式(flat / hierarchical)。

2.3 操作原语

操作 方向 说明
put / putMultimem 本地 smem → 远端 异步写;multimem 为多播变体
get 远端 → 本地 smem 异步读
red / redMultimem 本地 smem → 远端(归约) 归约在 fabric 路径上完成(复用 SHARP 能力)
pullRed 多播端点 → 本地 smem 拉取 + 归约,需 warp 级 coop
barrier 全 team 跨 CFT team 的设备线程同步
putCounted / redCounted / waitCounted 带计数器 去掉"数据 + fence + flag"模式,用用户管理的计数器做完成通知,降低同步延迟
  • 归约操作类型:Sum / And / Xor / Or / Min / Max(具体数据类型的支持以 CFT PTX 文档为准);
  • 支持 unicast 与 multicast 两种端点;multicast 需在创建 device communicator 时请求 NCCL_CFT_MULTIMEM;
  • 完成与错误上报 :flush 可返回错误报告(cudaFabricOpErrorStatusGet/Count 解码),应用可据此检测、重试或改道失败的 fabric 传输。

2.4 与既有方案的关系

  • vs NVLS(NVLink SHARP):NVLS 是 NCCL 内基于 symmetric window + multimem PTX 的集合通信实现;CFT 更底层,直接暴露 logical endpoint 与设备端操作 API,可被 NVLS 以外的自定义内核使用;
  • vs IPC / peer mapping:CFT 不需要远端内存映射进本地 VA,解决大规模多 GPU 的 VA 压力;
  • vs NVSHMEM:NVSHMEM 是更上层的 PGAS 编程模型;CFT 是其可依赖的更底层传输原语(NCCL 2.31.2 已提供 nccl4rust / NIIN 等 NVSHMEM 兼容接口,构建在 Device API 原语之上)。

3. 如何实现(API 流程)

3.1 前置条件

  • 硬件:Blackwell 或更新(SM_100+),所有参与 rank 都能创建兼容的 CUDA fabric logical endpoints;
  • 软件:CUDA Toolkit 13.3+(编译 fabric PTX 指令)、驱动 ≥ 610.43.02、NCCL 2.31+;
  • 内核必须为支持 fabric 指令的架构编译。

关键约束:如果某个 communicator 上并非所有 rank 都支持 CFT,ncclDevCommCreate() 直接失败(全有或全无)。

3.2 Host 端设置流程

c 复制代码
// 1) 分配并注册对称内存窗口
ncclMemAlloc(&buffer, memSize);
ncclCommWindowRegister(comm, buffer, memSize, &win,
                       NCCL_WIN_COLL_SYMMETRIC);          // 可加 NCCL_WIN_CFT_COUNTED

// 2) 创建带 CFT 能力的 device communicator
ncclDevComm devComm;
ncclDevCommRequirements reqs = NCCL_DEV_COMM_REQUIREMENTS_INITIALIZER;
reqs.cftCaps = NCCL_CFT | NCCL_CFT_MULTIMEM;              // 单播 + 多播
reqs.cftBarrierCount = nCTAs;                             // barrier slot 数(每 CTA 一个)
NCCLCHECK(ncclDevCommCreate(comm, &reqs, &devComm));

3.3 Team 与 Endpoint 查询

c 复制代码
// device 侧:取单播 CFT team,并按模式过滤(FLAT / HIER_MULTIMEM / HIER_LSA)
ncclTeam cftTeam = ncclTeamCft(devComm, NCCL_CFT_TEAM_FLAT);

// 把 (window, offset, peer) 翻译成逻辑端点
ncclCftLeId leId; size_t leOffset;
ncclGetCftLeInfo(win, byteOffset, peerCft, cftTeam, devComm, &leId, &leOffset);

host 侧对应:ncclGetCftDeviceLeInfo() / ncclGetPeerDeviceLeInfo() / ncclGetMultimemDeviceLeInfo();若需在创建 CFT device communicator 之前 查询端点,可在初始化 communicator 时配置 hostCftMode。

3.4 内核内操作:典型 put 流程

复制代码
stage 数据到共享内存 (smem, 16B 对齐)
  → 构造 ncclCft<ncclCoopCta> 对象(共享 ncclCftSmem 状态)
  → cft.put(coop, leId, leOffset, smem, bytes)
  → cft.submit(coop)          // 提交,使操作开始推进
  → cft.flushSmem(coop)       // 等待 smem 被消费后可复用(更早的回收点)
  → cft.flush(coop)           // 等待所有操作完成(含错误报告)
cuda 复制代码
__global__ void cftPutKernel(ncclDevComm devComm, ncclWindow_t win) {
  __shared__ ncclCftSmem cftSmem;
  __shared__ alignas(16) char smem[128];
  ncclCoopCta coop;
  ncclCft<ncclCoopCta> cft{coop, cftSmem};

  ncclTeam cftTeam = ncclTeamCft(devComm);
  int peer = (cftTeam.rank + 1) % cftTeam.nRanks;
  ncclCftLeId leId; size_t leOffset;
  ncclGetCftLeInfo(win, 0, peer, cftTeam, devComm, &leId, &leOffset);

  cft.put(coop, leId, leOffset, smem, sizeof(smem));
  cft.submit(coop);
  cft.flush(coop);
}

3.5 Barrier

cuda 复制代码
__global__ void cftBarrierKernel(ncclDevComm devComm) {
  ncclCoopCta coop;
  ncclCftBarrierSession<ncclCoopCta> bar{coop, devComm, blockIdx.x};
  bar.sync(coop, cuda::memory_order_acq_rel,
           ncclMemProxyType::Generic, ncclMemProxyType::Fabric);
}

多播 barrier 需在创建 communicator 时带 NCCL_CFT_MULTIMEM 并传 multimem=true。

3.6 Counted 操作(延迟优化)

Counted 操作把传统的"数据 + 内存 fence + flag 更新"同步模式替换为用户管理的计数器:

  • 窗口用 NCCL_WIN_CFT_COUNTED 注册,计数器的更新被硬件保证排在数据落盘之后;
  • 发送方:cft.putCounted(coop, leId, dataOffset, counterOffset, smem, bytes);
  • 接收方:cft.waitCounted(coop, acquire, Generic, counterPtr, expectedBytes, nullptr),poll 计数器达到期望值即返回;
  • waitCounted 封装了协作线程同步、内存序、abort/timeout(目前 abort 传 nullptr)。

3.7 内存序:Cross-proxy Fence

数据与 flag 之间需要建立 happens-before 关系时,使用跨 proxy 的 fence:

cuda 复制代码
// 发送数据后,用 Fabric→Generic 的 release fence 保证 flag 在数据之后可见
ncclMemFence(coop, cuda::memory_order_release,
             ncclMemProxyType::Fabric, ncclMemProxyType::Generic,
             ncclMemFenceScope::Sys);
cft.put(coop, leId, leOffset + flagOffset, flag, 16);
cft.submit(coop); cft.flush(coop);

另一个典型场景:Generic proxy 写入 smem 后,用 fence 让 Fabric proxy 可见再发起 put。


4. 已知问题与限制

类别 限制
硬件/软件门槛 仅 Blackwell(SM_100)+、CUDA 13.3+、驱动 ≥ 610.43.02、NCCL 2.31+;内核需为支持 fabric 指令的架构编译
全有或全无 任一 rank 不支持 CFT,ncclDevCommCreate() 即失败,无法降级
对齐/尺寸 smem 源/目标必须 16B 对齐,传输字节数必须是 16 的倍数
中转要求 数据必须经共享内存中转(smemSource/smemDestination),不适合直接 global→global 的原生路径
in-flight 上限 单个 ncclCftSmem 最多跟踪 16MB 非 fetching 操作(put/red 及多播变体)、1MB fetching 操作(get/pullRed)
counter 约束 每 GPU 并发活跃 counter ≤ 32 个为最佳性能,counter 建议 256B 对齐
同步易错 submit / flushSmem / flush、cross-proxy fence、counted 的 memory order 全部需要手工正确编排,错误使用会导致数据竞争或悬挂
barrier 配额 cftBarrierCount 必须覆盖内核用到的全部 barrier index(通常每 CTA 一个)
生态成熟度 新特性(2026 年随 CUDA 13.4 正式宣传),官方示例目前仅 barrier 示例,文档/工具链仍在完善
使用面 仅 Driver API、面向通信库作者;普通应用无直接收益,应走 NCCL/NVSHMEM
abort 支持 waitCounted 的 abortFlag 目前需传 nullptr,无运行时中止路径
归约类型 受 CFT PTX 指令集约束(Sum/And/Xor/Or/Min/Max),类型覆盖以 PTX 文档为准

5. 生态与展望

  • NCCL 2.31.2:新增 CFT host/device API,支持 window 内存注册到 CUDA logical endpoints,以及 device 侧 Put / Get / Red / NVLS 操作;
  • PyTorch SymmetricMemory :已把 CFT 作为底层传输之一------CFT 把 peer 的 window 注册内存暴露为 (le_id, le_offset),自定义内核可直接用它发起 put/get/reduce,无需构造 nccl 内核;
  • CUDA Toolkit 13.4:正式把 CFT 列为新特性(与 locality domain、CDMM、Rubin 预览等并列),并明确"reports completion and error status so applications can detect, retry, or reroute failed fabric transfers";
  • 方向:CFT 是 NVIDIA"GPU 即网络端点"路线的底层基石之一,未来 Rubin(compute capability 107)与 NVLink 6 上,logical endpoint + fabric 指令这套抽象预计会成为 in-kernel 通信、计算-通信重叠、集合通信卸载的主要通道。

6. 参考链接


本文为技术分析文档,所有功能描述与版本信息以 NVIDIA 官方文档为准;未声明处不构成对 CFT 可用性、性能或兼容性的承诺。

相关推荐
北方的银狐-Zero1 小时前
OntoL 官网上线|数据打通 ≠ 业务打通,为大模型装上「认知底座」
人工智能·本体论
小李不想当小白1 小时前
USART串口协议(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
miofly1 小时前
OpenAI 模型为获取数据主动破坏运行环境,三起越权事件曝光
人工智能
SM_YHJ1 小时前
RFID通道门禁与资产台账联动的自动登记技术实现方案
大数据·数据库·人工智能
数智奔流1 小时前
智元是时候看回启元了
人工智能·具身智能·智元
a努力。1 小时前
AI的万能转接线:MCP如何打通数据孤岛
人工智能
默_笙1 小时前
🥖 给 Agent 装上耳朵和嘴巴:ASR + TTS 语音交互实战
人工智能
玫瑰互动GEO1 小时前
AI时代下,GEM优化组织落地工程化:角色路由+KPI埋点+预算分配表
人工智能·ai搜索·gem·gem优化·生成式引擎营销
星云低代码开发平台1 小时前
AI 业务工具授权复核:触发条件、权限双层校验与验收清单
人工智能·权限管理·系统集成