PTO A5 平台 TGET_ASYNC RDMA 异步 ST 测试指南:远程 READ 的验证实现与端点发现原理

发布时间:2026/9/20 3:28:25
PTO A5 平台 TGET_ASYNC RDMA 异步 ST 测试指南:远程 READ 的验证实现与端点发现原理 人工智能指令集算子库CANNAscend【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址https://gitcode.com/cann/pto-isa点击查看免费下载导读本文聚焦 CANN PTO-ISA 仓库中tget_async_rdma测试目标它用于在 A5HNS1825 网卡平台上验证TGET_ASYNC指令的 RDMA 后端实现——即 root rank 通过 RDMA 单边远程 READ拉取各 peer 的 send buffer。文章以该 target 复用的共享实现tput_async_rdma/README_zh.md为主体完整覆盖前置条件、构建运行命令、环境变量、端点发现流程与问题定位并深入源码分析TGET_ASYNC的 RDMA 调用链、通信缓冲区布局与测试用例矩阵帮助读者既能在真实 A5 环境跑通用例也能理解底层实现原理。1. RDMA 异步 ST 测试家族与 tget_async_rdma 的定位在tests/npu/a5/comm/st/testcase/目录下RDMA 异步 ST 由三个测试目标共享同一套 RDMA 测试 Kernel 实现共享实现位于 tests/npu/a5/comm/st/testcase/tput_async_rdma目标验证语义数据面方向tput_async_rdma远程 WRITETPUT_ASYNCroot rank 将 send buffer 写入每个 peer 的 recv buffertget_async_rdma远程 READTGET_ASYNCroot rank 从每个 peer 的 send buffer 读取到本地 recv buffertput_async_notify_rdma带Set通知的远程 WRITETPUT_ASYNC_NOTIFYroot rank 写远端 payload 并触发远端 signaltget_async_rdma自身只包含一个简短的 README 说明指出该 target 复用 RDMA 异步 ST 的共享实现前置条件、配置、运行命令和问题定位参见 RDMA异步ST说明转换后为 tests/npu/a5/comm/st/testcase/tput_async_rdma/README_zh.md。其目录结构与tput_async_rdma对等CMakeLists.txt、README.md/README_zh.md、gen_data.py、main.cpp其中main.cpp通过#include ../tput_async_rdma/tput_async_rdma_kernel.h直接复用共享 Kernel 的宿主入口RunGetAsyncRdmaRootGetPlan而共享 Kernel 文件通过#ifdef PTO_RDMA_GET_TEST条件编译为 GET 目标单独构建TGetAsyncRdmaKernelImpl入口点见 tput_async_rdma_kernel.cpp。从源码结构看tget_async_rdma是 PUT 目标在TPUT_ASYNC之外的平行验证通道专门覆盖单边读路径。2. 前置条件在 A5 平台运行 RDMA 异步 ST 需要满足以下条件来自 共享 README硬件与软件配备 HNS1825 网卡及匹配驱动、HCOMM 组件的 A5 环境MPI 与 HCCL按顶层测试说明配置 MPI 和 HCCL网络各参与 rank 使用的 RDMA 网卡 IPv4 互相可达。三个条件缺一不可HNS1825 网卡驱动与 HCOMM 提供 RDMA 控制面verbs provider 与 topology 解析MPI/HCCL 提供多 rank 进程编排与集合通信原语IPv4 可达性保证数据面通道能够建链。3. 构建与运行3.1 选择 RDMA 后端并运行 targetPTO_RDMA_BACKEND必须在CMake 配置阶段之前设置随后运行所需的 RDMA ST targetexport PTO_RDMA_BACKENDHNS_1825 python3 tests/script/run_st.py -r npu -v a5 -t comm/tput_async_rdma -d -n 2 python3 tests/script/run_st.py -r npu -v a5 -t comm/tget_async_rdma -d -n 2 python3 tests/script/run_st.py -r npu -v a5 -t comm/tput_async_notify_rdma -d -n 2命令参数说明以tests/script/run_st.py为准参数含义-r npu运行平台为 NPU-v a5NPU 架构/版本为 A5-t comm/tget_async_rdma指定 ST target 路径-d构建调试版本-n 2使用 2 个 rank3.2 关键约束构建期变量与二进制复用PTO_RDMA_BACKEND仅在 CMake 配置该 ST 构建时读取一次。未设置、空值或不支持的值会构建不含 RDMA 支持的测试对应源码中PTO_RDMA_SUPPORTED宏未定义Kernel 会退化为 SKIP 或空操作路径。因此run_st.py默认会重新构建修改该变量后不要使用-w/--without-build复用已有二进制否则 RDMA 支持不会进入新构建若 CMake 配置阶段提示 RDMA 未使能需重新设置PTO_RDMA_BACKENDHNS_1825并在不使用-w的情况下重新配置。3.3 定向用例运行run_st.py支持-g/--gtest_filter参数见 run_st.py用于只运行指定 gtest case。首次验证TPUT_ASYNC_NOTIFY时建议先只运行 2 个 rank 的定向用例export PTO_RDMA_BACKENDHNS_1825 python3 tests/script/run_st.py -r npu -v a5 -t comm/tput_async_notify_rdma \ -g TPutAsyncNotifyRdma.Int32SetAndCanaries -d -n 2该用例检查远端 payload、远端 signal 及 signal 两侧 canary并等待接口返回的AsyncEvent完成。接收端观察到 signal 后先维护数据缓存再校验 payload。tget_async_rdma同样可以借助-g TGetAsyncRdma.*或具体 case 名做定向验证。注意当前 RDMA 后端不支持AtomicAdd因此没有对应的 RDMA 用例。4. 测试用例矩阵与覆盖维度tget_async_rdma的用例全部定义在 main.cpp 中通过ExpectGetPlan/ExpectGetResult模板统一驱动RunGetAsyncRdmaRootGetPlan覆盖了多个数据形状与完成模式维度用例数据类型/大小传输计划完成模式TGetAsyncRdma.Vec_FloatSmallfloat×256单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_Int32Largeint32×4096单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_Uint8Smalluint8×512单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_Uint8_64Buint8×64单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_Float_256Bfloat×64单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_Uint8_Offset_63Buint8×512offset17、count63STATUS_WAIT_EACHTGetAsyncRdma.Vec_Int32_MultiWqe_WaitEachint32×409616 次 WQE、每段 256STATUS_WAIT_EACHTGetAsyncRdma.Vec_Int32_MultiWqe_WaitLastint32×409616 次 WQE、每段 256STATUS_WAIT_LASTTGetAsyncRdma.Vec_Float_PublicEventWaitTestfloat×256单次全量PUBLIC_EVENT_WAIT_TESTTGetAsyncRdma.Vec_Float_MR_6MBfloat×524288单次全量STATUS_WAIT_EACHTGetAsyncRdma.Vec_FloatSmall_4Ranksfloat×256单次全量4 rankSTATUS_WAIT_EACH由此可以归纳出测试覆盖的四个维度数据类型与字节宽度float4B、int324B、uint81B覆盖不同元素大小的 RDMA 传输数据规模从 64B 小报文Vec_Uint8_64B到约 2MB 大缓冲区Vec_Float_MR_6MB524288×4B的多档位传输计划transfer plan非零偏移Vec_Uint8_Offset_63B、多 WQE 分片Vec_Int32_MultiWqe_*完成模式completion mode三种模式全部覆盖详见下文 5.4 节。所有用例在 rank 数不足时通过SKIP_IF_RANKS_LT直接跳过多 rank 用例如Vec_FloatSmall_4Ranks需要mpirun至少 4 个进程。每个用例运行前还会校验传输计划的合法性elemOffset 0 elemCount 0 operationCount 0且offset count×operations ≤ 总元素数见 tput_async_rdma_kernel.cpp。5. 数据面实现TGET_ASYNC 的 RDMA 调用链5.1 指令入口与引擎分派TGET_ASYNC的 A5 实现在 include/pto/comm/a5/async/TGetAsync.hpp 中通过模板参数DmaEngine在 SDMA、URMA、RDMA 三种引擎间分派。当指定DmaEngine::RDMA时编译路径进入TGET_ASYNC_RDMA_IMPL// 摘录自 include/pto/comm/a5/async/TGetAsync.hpp const uint64_t eventHandle rdma::Read( session, reinterpret_cast__gm__ uint8_t*(dstGlobalData.data()), reinterpret_cast__gm__ uint8_t*(srcGlobalData.data()), transferSize, peer); return AsyncEvent(eventHandle, DmaEngine::RDMA);其中dst是本端本地 recv buffer、src是远端peer 的 send bufferpeer参数用于选择对应的 RDMA 队列/内存资源——这正是单边远程 READ语义的体现数据由本端发起读取远端网卡无需 CPU 参与。调用前有两条关键校验见 TGetAsync.hppTGetAsyncIsFlatContiguous1Dsrc/dst tensor 必须是 packed 布局的单逻辑行flat contiguous 1D否则触发PTO_ASSERTdstElems srcElems本地接收缓冲区必须不小于远端数据量。5.2 通信缓冲区布局共享 Kernel 采用与 URMA 测试一致的对齐通信缓冲区布局见 tput_async_rdma_kernel.cpp[64 × int32 header][sendBuf: count × T][recvBuf: count × T]kRdmaTestDataOffset 64 * sizeof(int32_t)数据区起始偏移header 首字用于写 device statusGET 路径下recvBuf sendBuf count本地接收区紧随本地 send 区之后远端目标 VA 通过PeerMrBaseAddr(rdmaWorkspace, sourcePeer) kRdmaTestDataOffset计算得到——即从 peer 已注册 MR 的基址PeerMrBaseAddr加上接收区偏移。5.3 多 peer、多 WQE 的 GET 执行流程ExecuteGetRdma见 tput_async_rdma_kernel.cpp描述了 root rank 上的完整数据面流程清空deviceStatus通过pipe_barrier(PIPE_ALL)与其他 rank 同步仅 root rank 继续用TASSIGN清零 scratch tile调用BuildRdmaTestSession建立AsyncSession失败则写kRdmaSessionBuildError并退出遍历每个sourcePeer跳过自身取peerBase PeerMrBaseAddr(workspace, sourcePeer)调用PostGetOperationsPostGetOperations内循环operationCount次每次计算 operation 内偏移构造本地 recvGlobalTensor与远端 sendGlobalTensor调用TGET_ASYNCDmaEngine::RDMA(localRecvGlobal, remoteSendGlobal, session, sourcePeer)将返回的AsyncEvent交给完成模式处理任一操作失败即提前 break最终状态写入deviceStatus并经pipe_barrier通知对端。值得注意的是 PUT 路径中仅 root 写 peer非 root 直接 barrier 返回而 GET 路径中所有 rank 都先执行pipe_barrier且本地 recv 区按sourcePeer × count分槽确保每个 peer 的数据互不覆盖见InitializeRdmaBufferstrue,...中的outputElements nRanks × count。5.4 三种完成模式完成模式枚举定义于 tput_async_rdma_kernel.h其语义在CompleteRdmaEvent/CompleteRdmaOperation/CompleteRdmaPeertput_async_rdma_kernel.cpp中体现模式行为STATUS_WAIT_EACH每个 WQE 提交后立即WaitEventStatus等待完成任一失败即中止后续操作STATUS_WAIT_LAST批量提交所有 WQE最后只等待最后一个AsyncEventPUBLIC_EVENT_WAIT_TEST先用event.Test()首次可能合法地为 false再event.Wait()完成事件最后再次Test()验证已被消费的 target index 为完成态Wait 失败返回kRdmaPublicEventWaitError0x30000Test 失败返回kRdmaPublicEventTestError0x30001STATUS_WAIT_EACH与STATUS_WAIT_LAST分别验证逐 WQE 同步与批量同步两条路径PUBLIC_EVENT_WAIT_TEST则专门覆盖公共事件的 Test/Wait/Test 语义组合。6. 控制面端点发现Bootstrap机制6.1 三级本地 IPv4 查找顺序Bootstrap 先解析每个 rank 的物理设备 idphyId和 RDMA IPv4再通过 MPI 交换端点与注册内存信息。本地 IPv4 的查找顺序为见 hns_1825_bootstrap.hpp固定 root-info 文件解析/etc/hccl_rootinfo.json中与 phyId 匹配的 rank 块取net_type:CLOS条目的 IPv4ResolveLocalRdmaIpHCOMM topology 组件通过dlsym/dlopen解析GetRoceIpFromXmllibtopoaddrinfo.so读取固定/var/run/ascend-topologyd/virtualTopology.xmlResolveLocalRdmaIpFromVirtualTopology测试专用 IP 变量兜底使用PTO_ROCE_LOCAL_IP/PTO_ROCE_IPS。ST 不会生成或修改这两个拓扑文件也不提供路径覆盖变量——路径在源码中以常量固定kDefaultRootInfoPath、kDefaultVirtualTopologyPath。phyId 的解析同样采用符号动态解析优先aclrtGetPhyDevIdByUserDevId其次aclrtGetPhyDevIdByLogicDevId、rtGetDevicePhyIdByIndex均不可用时才回退到 ACL device id或由PTO_ROCE_PHYIDS环境变量按 rank 索引直接指定见 hns_1825_bootstrap.hpp。6.2 MPI 交换与一致性校验解析出本地端点后Bootstrap 通过MPI_Allgather完成三类信息的跨 rank 交换peer IP各 rank 的本地 IPv4 字符串定长 64B 缓冲区peer phyId各 rank 的物理设备 idpeer symAddr各 rank 已注册通信缓冲区的基址 VAsymmetricAddr后续PeerMrBaseAddr依赖它计算远端目标 VA。一致性校验有两处关键约束所有 rank 必须使用相同的 base portResolveAndAgreeBasePort会 Allgather 校验默认60032使用PTO_ROCE_IPS时还必须使用相同的按 rank 排序列表。任一 rank 本地 IP 解析失败都会产生集体 SKIP而非误报 PASSAgreeOnLocalIp通过AllRanksReady协调。6.3 环境变量参考变量说明PTO_RDMA_BACKEND配置阶段选择项当前唯一支持值为HNS_1825PTO_ROCE_PHYIDS可选按 MPI rank 索引、逗号分隔的物理设备 idPTO_ROCE_LOCAL_IP当前 MPI 进程使用的最终兜底 IPv4必要时需为各 rank 分别设置PTO_ROCE_IPS最终兜底列表按 MPI rank 排序且 IPv4 数量必须等于 rank 数PTO_ROCE_BASE_PORT各 rank 一致的 channel base port默认60032PTO_ROCE_VERBOSE设为1打印端点、MR、channel 和释放进度HCCL_RDMA_TCHCOMM traffic class默认132HCCL_RDMA_SLHCOMM service level默认4优先级规则PTO_ROCE_LOCAL_IP高于PTO_ROCE_IPSroot-info 或 virtual topology 解析成功时两者均被忽略。7. 问题定位CMake 提示 RDMA 未使能设置PTO_RDMA_BACKENDHNS_1825并在不使用-w/--without-build的情况下重新配置构建。端点发现失败检查物理设备映射以及 root-info 或 virtual topology 中的 CLOS IPv4必要时使用测试专用 IP 变量兜底。verbs provider 加载失败HCOMM 无法从默认路径加载 HNS1825 verbs provider 时将IBV_EXTEND_DRIVERS指向驱动提供的libhrn5-rdmav34.so。阶段区分设置PTO_ROCE_VERBOSE1可区分端点发现、MR 注册、channel 建链和释放阶段的错误。Kernel 侧还提供设备侧状态码辅助定位0x30000public event wait 失败、0x30001wait 后 test 失败以及会话构建失败kRdmaSessionBuildErrorhost 端PrintRdmaDeviceStatus会将 CQE syndrome 或后端状态描述一并打印见 tput_async_rdma_kernel.cpp。8. 小结tget_async_rdma作为 RDMA 异步 ST 家族中的远程 READ 验证目标完整覆盖了TGET_ASYNCDmaEngine::RDMA从指令分派、rdma::Read单边读、通信缓冲区寻址到多 WQE/多完成模式的整条链路。它与tput_async_rdma、tput_async_notify_rdma共享同一套 Kernel 与 Bootstrap 实现体现了 PTO 测试体系一个共享实现、多个验证视角的组织方式。无论是排查端点发现问题还是深入理解单边通信的数据面/控制面分工本文所梳理的源码路径tput_async_rdma_kernel.cpp、hns_1825_bootstrap.hpp、TGetAsync.hpp都值得继续深读。赞分享人工智能指令集算子库CANNAscend【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址https://gitcode.com/cann/pto-isa点击查看免费下载相关推荐CANN PTO-ISA RDMA 异步通信测试指南HNS1825 平台上 TPUT_ASYNC / TGET_ASYNC / TPUT_ASYNC_NOTIFY 的构建、运行与端点发现CANN PTO ISA RDMA 异步通信测试指南HNS1825 平台上 TPUT_ASYNC / TGET_ASYNC / TPUT_ASYNC_NOTI人工智能指令集算子库CANNAscendPTO-ISA TGET_ASYNC 异步远程读原语实战指南SDMA / URMA / RDMA 三引擎实现与使用详解PTO ISA TGET_ASYNC 异步远程读原语实战指南SDMA / URMA / RDMA 三引擎实现与使用详解 TGET_ASYNC 是 CANN P人工智能指令集算子库CANNAscendPTO 通信指令测试实战A5 平台基于 RDMAHNS1825的 TPUT_ASYNC_NOTIFY 异步写与 Set 信号验证PTO 通信指令测试实战A5 平台基于 RDMAHNS1825的 TPUT_ASYNC_NOTIFY 异步写与 Set 信号验证 导读 tput_asyn人工智能指令集算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考