news 2026/5/9 11:34:31

CANN/catlass矩阵乘API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/catlass矩阵乘API

CATLASS Gemm API

【免费下载链接】catlass本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass

CATLASS针对NPU上不同层级上执行的矩阵乘累加(MMAD)操作,提供了一个统一的编程模型。CATLASS的Gemm API对应于以下分层,由高到低分别是:

CATLASS Gemm模型

CATLASS基于上述的分层结构,实现了经典“三层嵌套循环”的矩阵乘算法。

以下伪代码描述了针对像mmad这样的单核内同步矩阵乘法指令的Matmul 内核的模型。整个算子被称为“Matmul”,这是伪代码,仅用于说明哪些层次的部分对应于矩阵乘的内部或外部循环。

// Catlass::Gemm::Kernel::BasicMatmul: BlockTileM 和 BlockTileN 循环 // 在AICores上并行 for (int block_m = 0; block_m < MatmulM; block_m += BlockTileM) { for (int block_n = 0; block_n < MatmulN; block_n += BlockTileN) { // Catlass::Gemm::Block::BlockMmad: 在k-tile上迭代的主循环 // 在这个阶段没有循环展开 for (int k_tile = 0; k_tile < MatmulK; k_tile++) { // Tile级内循环: (m,k) x (k,n) => (m,n) // TileMmad使用硬件指令 AscendC::Mmad for (int tile_mma_m = 0; tile_mma_m < m; tile_mma_m++) { for (int tile_mma_n = 0; tile_mma_n < n; tile_mma_n++) { for (int tile_mma_k = 0; tile_mma_k < k; tile_mma_k++) { mmad.call(c, a, b); } // tile_mma_k } // tile_mma_n } // tile_mma_m } // k_tile mainloop } // block_n } // block_m

前两重嵌套的for循环对应于多个AICore上的并行性。代码上并不将它们显式地表达为两重for循环,而是通过BlockIdx来区分不同核心处理的数据块。

在两重嵌套的for循环内部,将全局内存分片,然后将分片搬运到更“局部”的内存(如L1 Buffer或L0 Buffer)并执行MMAD计算。这些分片拷贝和分片MMAD计算的迭代通常是完全静态的,并且完全展开。

CATLASS Gemm组件

CATLASS使用以下组件表达上述循环嵌套,这些组件针对数据类型、数据排布和数学指令进行特化。

API 层级API 类 和/或 函数 名称
DeviceCatlass::Gemm::Device::DeviceGemm
KernelCatlass::Gemm::Kernel::BasicMatmul
BlockCatlass::Gemm::Block::BlockMmad
Catlass::Epilogue::Block::BlockEpilogue
Tile (MMAD and Copy)TileMmadandTileCopy
BasicAscendC::MmadandAscendC::DataCopy

在CATLASS中,我们通过首先在Kernel层组合Block主循环和Block后处理,然后用主机侧适配器包装它们来组装内核。

用户使用这些组件组装内核时,需要通过以下顺序实例化。

  1. 组装所需的Block主循环和Block后处理。
  2. 将Blocks组合在一起构建成Kernel。
  3. 用Device层适配器包装Kernel。

这个顺序也反映在CATLASS的示例中examples/00_basic_matmul,如下文摘录所示。

// 第一步: 创建所需的特化Block层mmad // 参数 using DispatchPolicy = Gemm::MmadAtlasA2Pingpong<true>; using L1TileShape = GemmShape<128, 256, 256>; using L0TileShape = GemmShape<128, 256, 64>; using AType = Gemm::GemmType<ElementA, LayoutA>; using BType = Gemm::GemmType<ElementB, LayoutB>; using CType = Gemm::GemmType<ElementC, LayoutC>; using BlockMmad = Gemm::Block::BlockMmad<DispatchPolicy, L1TileShape, L0TileShape, AType, BType, CType>; // 第二步:指定Block层的后处理类型(可选) using BlockEpilogue = void; // 第三步:指定计算时的数据走位方式 using BlockScheduler = typename Gemm::Block::GemmIdentityBlockSwizzle<>; // 第四步:在kernel层将mmad和后处理组合到一起 using MatmulKernel = Gemm::Kernel::BasicMatmul<BlockMmad, BlockEpilogue, BlockScheduler>; // 第五步:将kernel放入device适配器中,host侧处理kernel使用 using Matmul = Catlass::Gemm::Device::DeviceGemm<MatmulKernel>;

Block API

Block API包括“矩阵乘累加”和后处理。它负责实现上述三层嵌套循环伪代码中的k_tile循环。

Block在昇腾NPU的SPMD编程模型中指一个Process,是逻辑核的概念。它提供的硬件特性包括:

  • 异步内存拷贝(例如,从全局内存到L1 Buffer);
  • 适用于L0 Buffer中的分片粒度数据的MMAD指令;
  • 多核间、核内不同流水线间的同步操作,用以确保异步操作之间的数据依赖关系得到满足。

Block使用TileMmaTileCopyAPI(见下文)来执行分片粒度的数据拷贝和MMAD运算。

Block中的不同硬件流水线(例如,MTE1、MTE2或FixPipe)提供不同能力,不同的硬件流水线间需要共享数据并协调对共享数据的访问。例如,MTE2将数据从全局内存拷贝到L1 Buffer后,需要让MTE1知道输入已准备好。这里Kernel::层负责对Block::层接口进行调用,Block::层接口负责独立的C矩阵分块计算。

Block Mmad

Catlass::Gemm::Block::BlockMmad是矩阵乘(Block层级)累加(MMAD)主循环的主要接口。

BlockMmad类定义在头文件中 include/catlass/gemm/block/block_mmad.hpp.

namespace Catlass::Gemm::Block { //////////////////////////////////////////////////////////////////// template < class DispatchPolicy, class L1TileShape, class L0TileShape, class AType, class BType, class CType, class BiasType = void, class TileCopy = Gemm::Tile::TileCopy<typename DispatchPolicy::ArchTag, AType, BType, CType, BiasType>, class TileMmad = Gemm::Tile::TileMmad<typename DispatchPolicy::ArchTag, AType, BType, BiasType> > struct BlockMmad {}; //////////////////////////////////////////////////////////////////// } // namespace Catlass::Gemm::Block
  • DispatchPolicy是Block层重要的参数之一,下一节会详细介绍。
  • L1TileShapeL0TileShape对应L1 Buffer和L0 Buffer上使用的基本块大小,后续详细介绍。
  • ATypeBTypeCTypeBiasTypeGemmType的实例,其中包含了全局内存上A、B、C矩阵和Bias向量的数据类型和数据排布。
  • TileCopyTile::TileCopy的实例,包含了不同访存层级间的块粒度数据拷贝,如全局内存到L1 Buffer,L1 Buffer到L0 Buffer等。
  • TileMmadTile::TileMmad的实例,完成L0上基本块粒度的矩阵乘累加运算。

Block Dispatch Policies

BlockMmad的实现不是通用的。相反,它们必须针对每个算法和NPU架构特例化。用户可以通过选择与该特例化匹配的模板参数来调度到BlockMmad的特例化。 CATLASS采用基于标签的调度策略类型来特例化Block层Mmad实现,并为其提供调优能力。

以下给出了一个Dispatch Policy的样例,对应AtlasA2的架构下,采用L1 Buffer上pingpong Buffer,启用unitflag优化:

// 2-Buffer in L1 Buffer , // unitflag enable struct MmadAtlasA2Pingpong { using ArchTag = Arch::AtlasA2; static constexpr uint32_t STAGES = 2; static constexpr bool ENABLE_UNIT_FLAG = true; };

STAGES参数使用户可以方便地调整多buffer场景的buffer片数,ENABLE_UNIT_FLAG参数用于表示是否启用Mmad运算与L0C结果拷贝到全局内存的细粒度并行。

采用Dispatch Policy的设计还有如下优点:

  • 它避免了代码重复,主循环可以被多个不同的内核使用。
  • 它使编写通用代码更容易,因为主要类型名称BlockMmad在任何实现中都不会改变。
  • 它提供了一个清晰、单一的扩展点,供用户插入针对他们自己调度策略特化实现的新的、定制的主循环。

TileShape

L1TileShapeL0TileShape对应L1 Buffer和L0 Buffer上使用的基本块大小,由(m,n,k)表示

Epilogue

尾处理实现了涉及输出矩阵的逐元素操作。用户可以提供自定义的尾处理,或者使用标准尾处理之一。这些尾处理位于目录include/catlass/epilogue/block/中,包括像Catlass::Epilogue::Block::BlockEpilogue这样的类。CATLASS提供的尾处理不在include/catlass/gemm目录下,也不在Catlass::Gemm命名空间中,因为它们可以用于除Gemm之外的其他计算。

Kernel API

Kernel对应了所有Block在NPU上执行逻辑的集合。Kernel层BasicMatmul承担以下功能:

  • 对包含的不同Block的逻辑进行组合,加入必要的同步逻辑。
  • 不同Block和处理全局内存上数据的对应关系(Swizzling)。
  • 将输入数据在Block粒度分片。

Kernel层API是设备侧调用的入口,也是融合连续矩阵乘、尾处理或其他操作的组合点。

Kernel API 入口在Catlass::Gemm::Kernel::BasicMatmul, 位于头文件 include/catlass/gemm/kernel/basic_matmul.hpp.BasicMatmul是一个无状态的设备侧内核,实现的矩阵乘运算由两部分组成:

  • Block Mmad
  • Block Epilogue
namespace Catlass::Gemm::Kernel { template < class BlockMmad_, class BlockEpilogue_, class BlockScheduler_ > class BasicMatmul; } // namespace Catlass::Gemm::Kernel

注:无状态指调用者管理着内核的状态,例如上述描述的设备API。内核仅接收输入和输出参数 (Params).

其中Block Mmad代表局部数据块上的矩阵乘加运算,Block Epilogue代表mmad之后的运算,例如C := beta * C + alpha * A * B中的beta * C

Device API

Device层是Host侧调用的入口,在这一层屏蔽调用Device侧函数的差异。用户定义完Kernel结构之后放入Device层模板,便可以执行算子。

using BlockMmad = Gemm::Block::BlockMmad<DispatchPolicy, L1TileShape, L0TileShape, AType, BType, CType>; using BlockEpilogue = void; using BlockScheduler = typename Gemm::Block::GemmIdentityBlockSwizzle<>; // kernel using MatmulKernel = Gemm::Kernel::BasicMatmul<BlockMmad, BlockEpilogue, BlockScheduler>; // device using Matmul = Gemm::Device::DeviceGemm<MatmulKernel>; Matmul matmulOp; // args为维度信息等参数的封装结构体 matmulOp(args, workspace, stream);

Tile MMAD and Copy

Tile粒度的MMAD和Copy是对基础API的MMAD和数据拷贝接口的组合,这一层的目的是构建可组合的NPU微内核,这些微内核由硬件加速的数学运算和数据拷贝操作组成,每个操作都有其数据类型和排布。Tile粒度的MMAD和Copy提供了不同硬件上完成相同计算或数据拷贝语义的统一API。

用户可以在本文档顶部的三重嵌套循环伪代码的“内层”循环中使用Tile::TileMmad()Tile::CopyGmToL1()Tile::CopyL0CToGm()等来调用这些操作。

我们将这个API层级称为“Tile”,因为它使用基础API提供的原子能力去构建更大粒度的操作,作为一个可重用组件,它就像将单独的瓷砖拼接在一起构建成马赛克的图案。

Basic API

Basic层级API封装了实际的硬件指令调用,这些指令加速了MMAD或数据拷贝操作,对应CATLASS的基础API,实现了对硬件能力的抽象,开放了芯片能力,保证了完备性和兼容性,其中ISASI类API,不保证跨硬件版本兼容。

【免费下载链接】catlass本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

科学绘图软件Origin下载与安装教程(详细教程,附安装包) 2025最新版详细图文安装教程

文章目录Origin安装包下载方式Origin2024详细安装步骤1. 文件准备工作2. 启动安装向导3. Origin授权方式选择4. 用户信息输入5. 设置安装路径6. 自定义功能选择7. 完成安装程序8. 查看安装后操作说明9. 配置文件处理10. 授权文件配置11. 系统配置修改12. 界面语言设置13. 创建桌…

作者头像 李华
网站建设 2026/5/9 11:25:12

3步掌握鼠标键盘自动化神器,彻底告别重复劳动

3步掌握鼠标键盘自动化神器&#xff0c;彻底告别重复劳动 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否厌倦了每天…

作者头像 李华
网站建设 2026/5/9 11:24:59

在Hermes Agent项目中接入Taotoken多模型服务的详细步骤

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Hermes Agent项目中接入Taotoken多模型服务的详细步骤 1. 准备工作&#xff1a;获取Taotoken凭据与模型信息 在开始配置之前&am…

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

2026年育才路汉滨初中周围,究竟哪家托管能收获好口碑?

在育才路汉滨初中周围&#xff0c;每到放学时间&#xff0c;总能看到一群群孩子背着书包寻找合适的托管机构。对于家长们来说&#xff0c;选择一家靠谱的托管机构至关重要&#xff0c;它不仅关系到孩子的学业提升&#xff0c;还涉及孩子的饮食、安全等多个方面。在众多的托管机…

作者头像 李华
网站建设 2026/5/9 11:24:48

CANN/Graph-autofusion项目AI开发指令

Project Prompts 【免费下载链接】graph-autofusion Graph-autofusion 是一个面向昇腾&#xff08;Ascend&#xff09;芯片的轻量级、解耦式组件集合&#xff0c;旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件&#xff0c;未来将持续开放更多自动融合相关模…

作者头像 李华
网站建设 2026/5/9 11:19:46

Figma中文插件终极指南:5分钟快速安装让设计界面秒变中文

Figma中文插件终极指南&#xff1a;5分钟快速安装让设计界面秒变中文 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而烦恼吗&#xff1f;每次看到满屏的英文…

作者头像 李华