ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CANN PTO 通信指令集核心类型详解:Signal、ParallelGroup 与异步会话的完整参考

CANN PTO 通信指令集核心类型详解:Signal、ParallelGroup 与异步会话的完整参考 CANN PTO 通信指令集核心类型详解Signal、ParallelGroup 与异步会话的完整参考【免费下载链接】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 仓库中 PTO-COMM 通信指令集TPUT/TGET/TNOTIFY/TWAIT/TGATHER/TPUT_ASYNC 等所依赖的核心类型体系从标量Signal、二维信号网格Signal2D、集合通信分组ParallelGroup到通知/比较/归约/原子等枚举类型再到异步 DMA 的AsyncEvent与AsyncSession。读完本文你将掌握每个类型的精确定义、约束条件、构造方式并能结合 comm_types.hpp 等源码正确书写可编译、可运行的 PTO 通信算子代码。概述PTO-COMM 的类型骨架PTO-COMMParallel Tile Operation Communication是 pto-isa 提供的 tile 级通信指令体系共覆盖 12 条指令同步点对点TPUT/TGET、信号同步TNOTIFY/TWAIT/TTEST、集合通信TGATHER/TSCATTER/TBROADCAST/TREDUCE以及异步通信TPUT_ASYNC/TGET_ASYNC/BuildAsyncSession。所有指令的参数都建立在少量核心类型之上它们集中定义在 include/pto/comm/comm_types.hpp集合通信与异步会话相关类型进一步引用 async_types.hpp编译入口为统一头文件 pto_comm_inst.hpp#include pto/comm/pto_comm_inst.hpp // 统一公共 API只需此一个头文件 #include pto/pto-inst.hpp // PTO 核心指令TLOAD/TSTORE 等 using namespace pto; using namespace pto::comm;pto_comm_inst.hpp会根据编译宏自动分发到 NPU 原生实现或 CPU 仿真后端因此同一份源码可在 CPU 仿真与 NPU 双端运行。使用前先明确三点心智模型地址方向同步点对点与异步传输存在本地/远端之分——TPUT/TPUT_ASYNC源在本地、目标在远端TGET/TGET_ASYNC方向相反信号指令中TNOTIFY写远端TWAIT/TTEST检测本地。无需设备端动态分配ParallelGroup是外部数组的轻量视图所有缓冲UB Tile、GM 地址由调用者预先分配并传入符合 NPU kernel 的编程约束。编译期类型驱动Signal2D、Tile 形状、步长等大量信息在编译期确定越界等错误在编译期或PTO_ASSERT运行时断言中尽早暴露。Signal — 标量信号Signal是 PTO-COMM 中最基础的同步原语用于单标志同步本质是对int32_t类型 GM 地址的封装别名using Signal GlobalTensorint32_t, Shape1,1,1,1,1, Stride1,1,1,1,1, Layout::ND;对应源码见 comm_types.hpp 的comm_types.hpp第 213 行。它等价于一个形状、步长全部为 1 的 5 维GlobalTensor即一个int32_t元素comm::Signal sig(ptr); // ptr: __gm__ int32_t*关键约束元素类型必须为int32_tSignal/Signal2D均如此这是所有信号指令TNOTIFY/TWAIT/TTEST的硬性要求地址应 4 字节对齐int32_t自然对齐只承载单个标志值适合 barrier、事件通知、计数器等轻量同步场景。实际使用中Signal与TWAIT/TTEST配合时指向本地地址与TNOTIFY配合时指向远端地址成对使用时务必注意方向。测试用例 tests/npu/a5/comm/st/testcase/twait/twait_kernel.cpp 与 tests/npu/a5/comm/st/testcase/ttest/ttest_kernel.cpp 展示了完整的构造与等待流程。Signal2D — 二维信号矩阵Signal2DR, C是编译期形状的二维信号网格继承自GlobalTensorint32_t, Shape1,1,1,Rows,Cols, Stride1,1,1,DYNAMIC,1, Layout::ND见 comm_types.hpp。其 DIM_3 步长在编译期不可知DYNAMIC由构造函数决定// 密集 4×8 网格步长自动推导为 8即 Cols comm::Signal2D4, 8 grid(ptr); // 从 128 列大网格中的子区域步长 128 comm::Signal2D4, 8 sub(ptr offset, 128);两个构造重载源码 comm_types.hpp构造函数语义步长Signal2D(DType* ptr)密集连续网格自动推导为ColsSignal2D(DType* ptr, int stride)大网格中的子区域视图显式传入strideSignal2D的价值在于一次等待多个信号TWAIT(grid, 1, WaitCmp::GE)会要求 4×8 网格中所有元素都满足条件才返回对 tensor 信号全部满足才放行支持最高 5 维。在 twait/ttest 测试用例中可以找到子区域视图的实战用法pto::comm::Signal2DSubRows, SubCols subRegion(subPtr, FullCols);这表示从一个FullCols列的大信号矩阵中取SubRows × SubCols的子区域TWAIT/TTEST只需检查该子集。ParallelGroup — 集合通信分组ParallelGroupGlobalData是集合通信指令TGATHER/TSCATTER/TBROADCAST/TREDUCE的参与者描述是一个轻量级视图封装多 rank 的GlobalTensor对象数组完整定义见 comm_types.hpptemplate typename GlobalData struct ParallelGroup { GlobalData *tensors; // 每个 rank 的 GlobalTensor 数组外部数组非指针数组 int nranks; // rank 总数 int rootIdx; // root NPU 在组内的 rank 索引 static ParallelGroup Create(GlobalData *tensorArray, int size, int rootIdx); };关键约束零动态分配tensors指向调用者提供的外部数组设备端不支持std::vector等容器ParallelGroup只是视图包装统一的 rootIdxrootIdx是 root rank 在组内的索引组内所有 rank 必须传入相同的rootIdx按 team rank 索引通过operator[]按 team rank 访问对应GlobalTensor越界时触发PTO_ASSERT见源码 comm_types.hpp每个元素通常代表该 team rank 的GlobalTensor视图一般通过SetRank映射到 world rank。配套辅助ParallelGroupTraitsParallelGroupGlobalData用于从分组类型中提取GlobalDataType源码 comm_types.hpp编译器在展开集合通信指令时依赖它推导参与者的 GlobalTensor 类型。此外GetRootIdx()、GetSize()、empty()提供了只读访问。典型构造GPerRank tensors[NRANKS]; for (int i 0; i NRANKS; i) tensors[i] GPerRank(group_addrs[i]); comm::ParallelGroupGPerRank group comm::ParallelGroupGPerRank::Create(tensors, NRANKS, my_rank);常见错误tensors未正确初始化远端地址未设置是集合通信最常见的错误之一另外仅 root 可调用集合指令非 root 调用属于未定义行为。NotifyOp — 通知操作类型NotifyOp描述TNOTIFY写远端信号的方式定义见 comm_types.hpp值说明NotifyOp::AtomicAdd原子加signal value使用硬件原子加指令NotifyOp::Set直接赋值signal value执行直接存储// 直接赋值通知 comm::Signal sig(remote_signal); comm::TNOTIFY(sig, 1, comm::NotifyOp::Set); // 原子计数器自增多发送方并发安全 comm::Signal counter(remote_counter); comm::TNOTIFY(counter, 1, comm::NotifyOp::AtomicAdd);原子加模式天然适合多 producer 递增同一计数器的场景配合TWAIT(counter, expected_count, WaitCmp::GE)可实现等待 N 个信号全部到达的栅栏语义。WaitCmp — 比较运算符WaitCmp用于TWAIT/TTEST的信号条件判断定义见 comm_types.hpp值说明WaitCmp::EQ等于 ()WaitCmp::NE不等于 (!)WaitCmp::GT大于 ()WaitCmp::GE大于等于 ()WaitCmp::LT小于 ()WaitCmp::LE小于等于 ()// 等待单个信号等于 1 comm::TWAIT(sig, 1, comm::WaitCmp::EQ); // 等待信号矩阵所有元素 1 comm::Signal2D4, 8 grid(signal_matrix); comm::TWAIT(grid, 1, comm::WaitCmp::GE); // 等待计数器达到阈值GE 是计数器场景最常用的比较符 comm::TWAIT(counter, expected_count, comm::WaitCmp::GE);TWAIT阻塞等待硬件自旋更节能TTEST非阻塞检测返回bool常用于带超时的轮询for (int i 0; i max_iters; i) { if (comm::TTEST(sig, 1, comm::WaitCmp::EQ)) break; }场景推荐原因确定必须等待barrierTWAIT硬件自旋更节能等待期间需执行其他工作TTEST可交错执行需要超时控制TTEST可设循环上限就绪队列消费TTEST先检查再处理ReduceOp — 归约运算符ReduceOp指定TREDUCE的逐元素归约方式定义见 comm_types.hpp值说明ReduceOp::Sum逐元素求和ReduceOp::Max逐元素取最大值ReduceOp::Min逐元素取最小值comm::ParallelGroupGTensor group(tensors, NRANKS, my_rank); GTensor dstG(result); TileT accTile, recvTile; comm::TREDUCE(group, dstG, accTile, recvTile, comm::ReduceOp::Sum);TREDUCE的完整约束见 collective-instructions.md仅 root 调用dstGlobalData指向本地accTileData/recvTileData或乒乓模式下的accTilepingTilepongTile必须是预先分配的 UB Tile数据超出 Tile 容量时自动二维滑动分块静态ValidRow/ValidCol必须能整除对应维度。AtomicType — 原子操作类型AtomicType用于TPUT的原子写控制定义于 include/pto/common/type.hpp而非 comm 目录是 PTO 公共类型值说明AtomicType::AtomicNone无原子操作默认AtomicType::AtomicAdd原子加操作作为模板参数使用编译期类型或运行时参数使用// 编译期原子类型模板参数 comm::TPUTAtomicType::AtomicAdd(dstG, srcG, stagingTile); // 运行时选择原子类型 comm::TPUT(dstG, srcG, stagingTile, AtomicType::AtomicAdd);TPUT支持AtomicNone/AtomicAdd而TGET是读操作不支持原子操作。常见错误是给TGET传入原子类型。DmaEngine — DMA 引擎选择DmaEngine指定异步传输使用的硬件引擎定义见 comm_types.hpp值说明DmaEngine::SDMASDMA 引擎支持二维传输通用默认DmaEngine::URMAURMA 引擎支持一维传输仅 Ascend950 / NPU_ARCH 3510DmaEngine::RDMARDMA 引擎由RdmaBackend标识二进制中编译的 NIC 实现见 rdma_backend.hppcomm::AsyncEvent ev comm::TPUT_ASYNCcomm::DmaEngine::SDMA(dstG, srcG, session);选择依据对应 SKILL 中的决策树一对一且需要 UB 中间暂存Tile 级操作用同步TPUT/TGET大块 GM→GM 直传不经 UB用TPUT_ASYNC/TGET_ASYNC其中 SDMA 通用、URMA 仅 A5 平台。AsyncEvent — 异步事件句柄TPUT_ASYNC/TGET_ASYNC启动传输后立即返回AsyncEvent用于完成检测定义见 comm_types.hppstruct AsyncEvent { uint64_t handle; DmaEngine engine; bool valid() const; // handle ! 0 时返回 true bool Wait(const AsyncSession session) const; // 阻塞直到传输完成 bool Test(const AsyncSession session) const; // 非阻塞完成检测 };实际源码中还包含 URMA 相关的目标 CQEurmaTargetCqe与 jetty 位图字段comm_types.hpp供 URMA 引擎内部使用。合法事件handle ! 0才可 Wait/Test——若传输使用了非一维 tensor返回的 event 无效。Quiet 语义重要event.Wait(session)阻塞直到自上次 Wait 以来所有已发出的异步操作全部完成类似 shmem 的 quiet 语义。因此批量发送时只需对最后一个AsyncEvent调用一次Wait无需逐个等待comm::AsyncEvent lastEvent; for (int rank 0; rank nranks; rank) { GT dstG(remoteDst rank * size, shape, stride); lastEvent comm::TPUT_ASYNC(dstG, srcG, session); } (void)lastEvent.Wait(session); // 等待所有 pending 操作完成AsyncSession — 异步会话AsyncSession是引擎无关的会话对象通过BuildAsyncSessionengine()构建用户把它传给TPUT_ASYNC/TGET_ASYNC/event.Wait()时无需关心引擎内部实现。仓库中的完整定义见 async_types.hpp相比速查手册中的简化结构实际还携带 context GM 指针、tmpBuf、syncId、channelGroupIdx、blockBytes、RDMA 后端信息等运行参数。SDMA 构建默认template DmaEngine engine DmaEngine::SDMA, typename ScratchTile bool BuildAsyncSession(ScratchTile scratchTile, __gm__ uint8_t *workspace, AsyncSession session, uint32_t syncId 0, const sdma::SdmaBaseConfig baseConfig {sdma::kDefaultSdmaBlockBytes, 0, 1}, uint32_t channelGroupIdx sdma::kAutoChannelGroupIdx);参数说明scratchTile用于 SDMA 控制元数据的 UB scratch tile非数据负载推荐TileTileType::Vec, uint8_t, 1, comm::sdma::UB_ALIGN_SIZE256Bworkspace由 Host 侧SdmaWorkspaceManager分配的 GM 指针见 sdma_workspace_manager.hppsyncIdMTE3/MTE2 管道同步事件 ID0-7避免与 kernel 内其他管道屏障冲突baseConfig{block_bytes, comm_block_offset, queue_num}默认适用于单队列场景channelGroupIdxSDMA 通道组索引默认使用get_block_idx()映射kAutoChannelGroupIdx值为UINT32_MAX常量kDefaultSdmaBlockBytes 1024 * 1024每 SQE 的块大小见 async_types.hpp。URMA 构建仅 Ascend950 / NPU_ARCH 3510bool BuildAsyncSession(__gm__ uint8_t *workspace, uint32_t destRankId, AsyncSession session);URMA workspace 必须由 Host 侧UrmaWorkspaceManager分配见 urma_workspace_manager.hpp且需要大页内存ACL_MEM_MALLOC_HUGE_ONLY小页分配会导致注册失败。完整示例SDMA 批量传输// 构建会话 using ScratchTile TileTileType::Vec, uint8_t, 1, comm::sdma::UB_ALIGN_SIZE; ScratchTile scratchTile; TASSIGN(scratchTile, 0x0); comm::AsyncSession session; if (!comm::BuildAsyncSessioncomm::DmaEngine::SDMA(scratchTile, sdmaWorkspace, session)) { return; } // 批量传输 一次 Wait comm::AsyncEvent lastEvent; for (int rank 0; rank nranks; rank) { GT dstG(remoteDst rank * size, shape, stride); lastEvent comm::TPUT_ASYNC(dstG, srcG, session); } (void)lastEvent.Wait(session); // 等待所有 pending 操作完成核心类型速查表类型用途关键约束Signal标量同步信号int32_t4 字节对齐Signal2DR,C二维信号网格编译期形状支持子区域视图ParallelGroupG集合通信分组外部数组视图所有 rank 必须传相同rootIdxNotifyOp通知操作类型AtomicAdd原子加/Set直接赋值WaitCmp比较运算符EQ / NE / GT / GE / LT / LEReduceOp归约运算符Sum / Max / MinAtomicType原子操作类型AtomicNone默认/AtomicAddDmaEngineDMA 引擎选择SDMA通用/URMA仅 A5AsyncEvent异步事件句柄Wait使用 Quiet 语义等待所有 pendingAsyncSession异步会话通过BuildAsyncSession构建指令与类型的对应关系指令使用到的核心类型返回类型TPUTGlobalTensor、Tile、AtomicTypeRecordEventTGETGlobalTensor、TileRecordEventTNOTIFYSignal/Signal2D、NotifyOpvoidTWAITSignal/Signal2D、WaitCmpvoidTTESTSignal/Signal2D、WaitCmpboolTGATHER/TSCATTER/TBROADCASTParallelGroup、TileRecordEventTREDUCEParallelGroup、Tile、ReduceOpRecordEventTPUT_ASYNC/TGET_ASYNCGlobalTensor、AsyncSession、DmaEngineAsyncEvent常见错误速查#错误规则1TNOTIFY发到本地 /TWAIT等远端TNOTIFY→ 远端TWAIT/TTEST→ 本地2非 root 调用集合通信仅 root 执行非 root 不得调用3乒乓 Tile UB 地址重叠pingTile和pongTile使用不同TASSIGN偏移4异步传输使用非一维 tensorTPUT_ASYNC/TGET_ASYNC仅支持扁平连续一维5Signal类型不是int32_tSignal/Signal2D元素类型必须为int32_t6ParallelGrouptensors 未初始化远端地址必须正确设置7给TGET传原子类型TGET不支持原子操作深入阅读本文是 PTO-COMM 指令速查手册体系的一部分。核心类型详解对应的完整指令参考如下指令速查手册总览SKILL.md指令分类总览、数据流模型、指令选择决策树与约束速查表信号同步指令详解TNOTIFY/TWAIT/TTESTP2P 指令详解TPUT/TGET集合通信指令详解TGATHER/TSCATTER/TBROADCAST/TREDUCE异步通信指令详解TPUT_ASYNC/TGET_ASYNC/BuildAsyncSession。源码级证据仅列出可直接验证的关键路径类型定义include/pto/comm/comm_types.hpp、include/pto/comm/async_common/async_types.hpp、include/pto/common/type.hpp指令实现NPU 后端 include/pto/comm/a5/ 与 include/pto/comm/a2a3/含TWait.hpp、TTest.hpp、TNotify.hpp、TPut.hpp、TGet.hpp、TGather.hpp等异步实现见 include/pto/comm/async/测试用例tests/npu/a5/comm/st/testcase/含 twait/ttest/tput/tget/gather/scatter/broadcast/reduce/async 等目录。本文内容基于当前仓库CANN pto-isa的实际源码与文档整理平台能力如 URMA 引擎、CCU 集合通信后端以对应硬件与编译宏如NPU_ARCH 3510为前提使用时请以实际运行环境为准。【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表