news 2026/5/14 1:24:19

CANN PTO-ISA开发模式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN PTO-ISA开发模式详解

开发模式详解

【免费下载链接】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

模式 1:P2P 通信

最基础的模式,使用 TPUT/TGET 在两个 NPU 间传输数据。

#include <pto/comm/pto_comm_inst.hpp> #include <pto/pto-inst.hpp> using namespace pto; __global__ AICORE void P2PSendKernel(__gm__ half *local_data, __gm__ half *remote_addr) { using ShapeDyn = Shape<DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC>; using StrideDyn = Stride<DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC>; using Global = GlobalTensor<half, ShapeDyn, StrideDyn, Layout::ND>; using TileData = Tile<TileType::Vec, half, 128, 256, BLayout::RowMajor, -1, -1>; ShapeDyn shape(1, 1, 1, 128, 256); StrideDyn stride(128 * 256, 128 * 256, 128 * 256, 256, 1); Global srcG(local_data, shape, stride); Global dstG(remote_addr, shape, stride); TileData stagingTile(128, 256); TASSIGN(stagingTile, 0x0); comm::TPUT(dstG, srcG, stagingTile); }

模式 2:集合通信

使用内置的集合通信指令(适合标准场景)。

template <typename T, int NRANKS> __global__ AICORE void ReduceKernel(__gm__ T *group_ptrs[NRANKS], __gm__ T *result, int my_rank) { using TileT = Tile<TileType::Vec, T, 1, 1024>; using GTensor = GlobalTensor<T, Shape<1,1,1,1,1024>, Stride<1024,1024,1024,1024,1>, Layout::ND>; GTensor tensors[NRANKS]; for (int i = 0; i < NRANKS; ++i) tensors[i] = GTensor(group_ptrs[i]); comm::ParallelGroup<GTensor> group(tensors, NRANKS, my_rank); GTensor dstG(result); TileT accTile, recvTile; comm::TREDUCE(group, dstG, accTile, recvTile, comm::ReduceOp::Sum); }

模式 3:自定义集合通信(TPUT + TNOTIFY/TWAIT)

当内置集合通信指令不满足需求时(如 ReduceScatter + AllGather 组合实现 AllReduce),使用底层指令组合。

方式 A:使用 TPUT<AtomicAdd>(推荐,一步完成 RS + Reduce)

每个 rank 将自己的数据通过TPUT<AtomicAdd>直接累加到 owner rank 的输出缓冲区,无需独立的 Reduce 阶段。

// ReduceScatter:使用 TPUT<AtomicAdd> 直接累加到 owner AICORE inline void ReduceScatterViaTput(__gm__ half *local_src, __gm__ half *remote_dst, TileData &pingTile, TileData &pongTile) { Global srcG(local_src, shape, stride); Global dstG(remote_dst, shape, stride); // TPUT<AtomicAdd> 自动处理流水线同步,内部分块滑动 comm::TPUT<AtomicType::AtomicAdd>(dstG, srcG, pingTile, pongTile); } // AllGather:使用 TPUT<AtomicNone> 直接写到远端 AICORE inline void AllGatherViaTput(__gm__ half *local_src, __gm__ half *remote_dst, TileData &pingTile, TileData &pongTile) { Global srcG(local_src, shape, stride); Global dstG(remote_dst, shape, stride); comm::TPUT(dstG, srcG, pingTile, pongTile); }

方式 B:使用 TLOAD/TSTORE_IMPL(更底层,需手动流水线同步)

需要在 TLOAD 和 TSTORE_IMPL 之间手动插入set_flag/wait_flag做流水线同步。适合需要在传输间插入自定义逻辑的场景。

// ReduceScatter:手动流水线 + AtomicAdd AICORE inline void ReduceScatterManual(__gm__ half *src_addr, __gm__ half *dst_addr, TileData &pingTile, TileData &pongTile, int pp_count) { bool use_ping = (pp_count % 2 == 0); TileData &curTile = use_ping ? pingTile : pongTile; event_t curEv = use_ping ? EVENT_ID0 : EVENT_ID1; Global srcG(src_addr, shape, stride); Global dstG(dst_addr, shape, stride); TLOAD(curTile, srcG); set_flag(PIPE_MTE2, PIPE_MTE3, curEv); wait_flag(PIPE_MTE2, PIPE_MTE3, curEv); TSTORE_IMPL<TileData, Global, AtomicType::AtomicAdd>(dstG, curTile); set_flag(PIPE_MTE3, PIPE_MTE2, curEv); wait_flag(PIPE_MTE3, PIPE_MTE2, curEv); } // AllGather:手动流水线 + 普通写 AICORE inline void AllGatherManual(__gm__ half *src_addr, __gm__ half *dst_addr, TileData &tile) { Global srcG(src_addr, shape, stride); Global dstG(dst_addr, shape, stride); TLOAD(tile, srcG); set_flag(PIPE_MTE2, PIPE_MTE3, EVENT_ID0); wait_flag(PIPE_MTE2, PIPE_MTE3, EVENT_ID0); TSTORE_IMPL<TileData, Global, AtomicType::AtomicNone>(dstG, tile); set_flag(PIPE_MTE3, PIPE_MTE2, EVENT_ID0); wait_flag(PIPE_MTE3, PIPE_MTE2, EVENT_ID0); }

方式选择

方式优点缺点适用
TPUT<AtomicAdd>代码简洁,自动流水线同步灵活性低标准 RS/AG 场景
TLOAD/TSTORE_IMPL可插入自定义逻辑需手动 set_flag/wait_flag需要精细控制的场景

模式 4:通算融合(计算+通信重叠)

将计算 kernel 和通信 kernel 分别部署在不同的 AICore Block 上,通过 Stream 并行和队列同步实现重叠。

computeStream: [GEMM Block 0] [GEMM Block 1] ... [GEMM Block N] │ │ │ Enqueue Enqueue Enqueue │ │ │ ▼ ▼ ▼ commStream: [RS: poll queues, TPUT<AtomicAdd>] → [Barrier] → [AG: TPUT<AtomicNone>]

关键设计要素

  1. 双 Stream:计算流(Cube kernel)和通信流(Vec kernel)并行执行
  2. 就绪队列:计算完成后将 tile 索引入队,通信 kernel 轮询出队
  3. 信号矩阵:跨 rank 同步,确保 RS 阶段完成后才开始 AG
  4. Phase Barrier:多阶段执行的 rank 间同步

就绪队列设计(SPSC 无锁队列)

// 生产者端(计算 kernel): PerBlockQueueEnqueueFast(cached_queue, tile_idx, local_slot); // 消费者端(通信 kernel):使用 TTEST 硬件指令轮询 comm::Signal sig(const_cast<__gm__ int32_t *>(&queue->count)); if (!comm::TTEST(sig, local_head + 1, comm::WaitCmp::GE)) { return -1; // 无新数据 }

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 15:10:20

cann/hccl HCCL网卡配置说明

HCCL_SOCKET_IFNAME 【免费下载链接】hccl 集合通信库&#xff08;Huawei Collective Communication Library&#xff0c;简称HCCL&#xff09;是基于昇腾AI处理器的高性能集合通信库&#xff0c;为计算集群提供高性能、高可靠的通信方案 项目地址: https://gitcode.com/cann…

作者头像 李华
网站建设 2026/5/9 15:01:31

LSTM+云原生:O-RAN网络智能异常检测工程实践

1. 项目概述与核心价值最近在搞O-RAN网络运维的朋友&#xff0c;估计都遇到过同一个头疼的问题&#xff1a;网络里那些稀奇古怪的异常&#xff0c;比如基站性能突然跳水、切片资源分配异常、CU/DU之间接口时延飙升&#xff0c;总是事后才被发现。传统的基于固定阈值的告警系统&…

作者头像 李华
网站建设 2026/5/9 14:50:32

动态域名解析工具diny:基于Cloudflare API的轻量级DDNS解决方案

1. 项目概述&#xff1a;一个轻量级、可定制的动态域名解析工具最近在折腾个人服务器和家庭网络服务时&#xff0c;我又一次被动态公网IP的问题给绊住了。相信很多自己搭网站、建NAS或者跑一些自研服务的朋友都深有体会&#xff1a;运营商给的公网IP说变就变&#xff0c;一旦IP…

作者头像 李华
网站建设 2026/5/9 14:49:53

OpenClaw会话历史管理工具:本地CLI与Web界面实现

1. 项目概述与核心价值如果你和我一样&#xff0c;是OpenClaw的重度用户&#xff0c;那你肯定遇到过这个痛点&#xff1a;想回顾一下昨天那个Discord机器人是怎么处理用户请求的&#xff0c;或者想看看上周那个定时任务&#xff08;cron job&#xff09;的执行日志&#xff0c;…

作者头像 李华