TGET / TGET_ASYNC 带宽对比示例

概览

本示例对比 TGET(同步远程读)与 TGET_ASYNC(异步 SDMA 远程读)的点对点通信带宽,覆盖 4 KB ~ 4 MB 的传输规模,同时测量 host 侧带宽(GB/s)和 device 侧平均执行 cycle 数。

  • TGET 通过 UB(Unified Buffer)暂存进行远程读:Remote GM → UB → Local GM,受 UB 带宽限制,大传输量时饱和在约 4 GB/s。
  • TGET_ASYNC 通过 SDMA 引擎直传:Remote GM → SDMA → Local GM,绕过 UB 瓶颈,在 4 MB 时可达约 13–14 GB/s。

支持的 AI 处理器

  • A2/A3

目录结构

kernels/manual/a2a3/tget_bandwidth/
├── scripts/
│   └── plot_bw_compare.py           # 绘制带宽对比图
├── CMakeLists.txt                   # 构建配置
├── tget_bandwidth_kernel.cpp        # Kernel 实现(AICORE + Host 编排)
├── tget_bandwidth_kernel.h          # Kernel 头文件
├── main.cpp                         # Host 侧入口(MPI 初始化)
├── run.sh                           # 便捷脚本
├── README_zh.md                     # 本文件
└── README.md                        # 英文版

算子说明

数据流

TGET(同步)

Peer NPU GM ──TGET──▶ Local UB ──TSTORE──▶ Local GM

TGET_ASYNC(异步)

Peer NPU GM ──SDMA──▶ Local GM   (直传,无 UB 中转)

测试流程

  1. 每个 rank 在 HCCL shared memory 中准备发送数据(PrepareSendBufferKernel
  2. root rank 对每种传输规模分别执行 TGET 和 TGET_ASYNC
  3. Host 侧计时测量带宽,device 侧通过 SYS_CNT 测量 cycle 数
  4. 验证接收数据正确性

规格

项目
数据类型 float
NPU 数量 2(点对点)
传输规模 4 KB, 16 KB, 64 KB, 256 KB, 1 MB, 4 MB
测量指标 host 带宽(GB/s)、device 平均 cycle 数

实测性能(参考)

以下数据在 Ascend A2/A3 上测得(float 类型,2 卡点对点)。

传输大小 TGET 带宽 (GB/s) TGET_ASYNC 带宽 (GB/s) TGET device 平均 cycles TGET_ASYNC device 平均 cycles
4 KB 0.21 0.19 50.85 118.18
16 KB 0.72 0.75 202.05 166.42
64 KB 1.75 2.55 780.73 338.10
256 KB 3.01 6.08 3347.12 1094.37
1 MB 3.75 10.48 12703.39 3791.18
4 MB 3.99 12.95 52878.12 14834.47

分析

  • TGET 随传输规模增大,带宽逐步上升但在约 4 GB/s 处饱和——这是 UB 暂存路径的单核带宽上限。
  • TGET_ASYNC 在大传输量(≥256 KB)时显著超越 TGET,4 MB 时达到约 13 GB/s,接近 SDMA 引擎的理论带宽。
  • 在极小传输量(4 KB)下,TGET_ASYNC 由于 SDMA 启动开销反而略慢于 TGET。

带宽对比图

运行绘图脚本生成对比图:

python3 scripts/plot_bw_compare.py

构建与运行

前置条件

  • CANN Toolkit >= 8.5.0(TGET 同步指令);>= 9.0.0(TGET_ASYNC 异步指令)
  • MPICH(推荐;Host 侧通过 comm_mpi.h 动态加载 libmpi.so,communicator handle 与 MPICH 一致)
  • 2 张及以上 Ascend NPU

MPI 安装(推荐 MPICH)

# Ubuntu / Debian
sudo apt install mpich libmpich-dev

# 或用户目录安装(无 root)
# 见 tests/README_zh.md「从源码安装 MPICH」
export PATH=$HOME/mpich/bin:$PATH
export MPI_LIB_PATH=$HOME/mpich/lib/libmpi.so

run.sh 会自动搜索常见 MPICH 路径并设置 MPI_LIB_PATH。也可通过 MPI_SEARCH_DIRS(空格分隔的 bin/ 目录列表)覆盖搜索路径。

说明:本示例不支持 OpenMPIcomm_mpi.h 使用 MPICH 的 MPI_COMM_WORLD handle 编码;OpenMPI 的 communicator 表示不同,运行时 MPI_Bcast 等调用可能失败。--allow-run-as-root 为 OpenMPI 专用参数,MPICH 不支持。

步骤

  1. 配置 Ascend CANN 环境:
source ${ASCEND_HOME_PATH}/bin/setenv.bash
# 或 source <workspace>/set_env_new.sh
  1. 运行示例(默认 2 卡)。run.sh 会自动切换到本目录,可从仓库根或本目录执行:
# 方式 A:先进入示例目录
cd ${git_clone_path}/kernels/manual/a2a3/tget_bandwidth
bash run.sh -r npu -v a3

# 方式 B:在 pto-isa-main 根目录下
bash kernels/manual/a2a3/tget_bandwidth/run.sh -r npu -v a3

可通过 -n 参数指定 rank 数(默认为 2):

bash run.sh -r npu -v a3 -n 2

-v a3 与 ST 测试脚本一致,内部映射为 CMake 的 SOC_VERSION=Ascend910B1(A2/A3 平台)。

成功时输出:

================ TGET/TGET_ASYNC Bandwidth Sweep ================
peer_rank=1 dtype=float tile_elems=1024
[BW] instr=TGET bytes=4096 iters=1000 ...
[BW] instr=TGET_ASYNC bytes=4096 iters=1000 ...
...
test success

变更记录

日期 变更
2026-06-01 文档与 run.sh 对齐 MPICH;移除 OpenMPI 专用 mpirun 参数
2026-04-02 从 ST 测试迁移为独立性能示例