当前位置: 首页 > news >正文

CANN/asc-devkit稀疏矩阵乘加API

# MmadWithSparse

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

产品支持情况

  • Ascend 950PR/Ascend 950DT:不支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

头文件路径为:basic_api/kernel_operator_mm_intf.h。

MmadWithSparse接口负责完成特殊稀疏矩阵乘加操作。稀疏矩阵是一种特殊类型的矩阵,即矩阵中包含较多的零元素。4:2结构化稀疏要求一个连续的4个权重或激活值的组(通常是张量中的一行或一列)中,最多只有2个值为非零,其余2个强制为零。

MmadWithSparse接口传入的左矩阵A为稀疏矩阵,右矩阵B为稠密矩阵。矩阵A是个全尺寸矩阵,在MmadWithSparse计算时完成稠密化;矩阵B是经过4:2结构化稀疏过滤掉零值之后的稠密矩阵,需要在计算执行前的输入数据准备时自行完成稠密化(按照下文中介绍的稠密算法进行稠密化)。B稠密矩阵需要通过调用LoadDataWithSparse载入,同时加载索引矩阵,索引矩阵在矩阵B稠密化的过程中生成,再用于A矩阵的稠密化。索引矩阵存储在内部缓冲区,该索引矩阵的布局和布局大小与矩阵B相同,用于在进行矩阵乘加操作之前进一步将矩阵A压缩。

跟Mmad接口实现昇腾NPU矩阵乘计算能力类似,MmadWithSparse接口的数学表达式为:

$$ C = A \times B + C $$

完整示例请参考:MmadWithSparse样例。

表1Sparse矩阵计算矩阵A、B、C解释说明

矩阵计算逻辑矩阵计算物理位置维度输入/输出数据格式数据类型
AL0A BufferM x KZzint8_t
BL0B BufferK/2 x NZnint8_t
CL0C BufferM x NNzint32_t

下面的图展示了Cube如何计算出其中一行和一列的内积:

图1MmadWithSparse接口计算流程示意图 ![MmadWithSparse接口计算流程示意图](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mmadwithsparse_workflow_demo.png "MmadWithSparse接口计算流程示意图"?utm_source=gitcode_repo_files)

其中矩阵A原始分形为(16, 2*C0),索引矩阵Index分形为(C0,16),每一行矩阵A的数据会基于索引矩阵Index中对应的一列数据进行4选2,索引矩阵分形格式及生成方式请参考4选2稀疏索引矩阵,选择算法参考矩阵A稀疏选择算法说明;经过选择处理后的矩阵A分形变成(16, C0),矩阵B原始分形为(C0, 16),接下来会执行普通Mmad运算,即矩阵A中一行和矩阵B中一列完成内积运算得到结果矩阵C中对应一个元素。

函数原型

template <typename T = int32_t, typename U = int8_t, typename Std::enable_if<Std::is_same<PrimT<T>, int32_t>::value, bool>::type = true, typename Std::enable_if<Std::is_same<PrimT<U>, int8_t>::value, bool>::type = true> __aicore__ inline void MmadWithSparse(const LocalTensor<T>& dst, const LocalTensor<U>& fm, const LocalTensor<U>& filter, const MmadParams& mmadParams)

参数说明

表3模板参数说明

参数名描述
Tdst的数据类型。
Ufm、filter的数据类型。
当dst、fm、filter为基础数据类型时,T必须为int32_t类型,U必须为int8_t类型,否则编译失败。

表4参数说明

参数名称输入/输出含义
dst输出目的操作数,结果矩阵C,类型为LocalTensor,支持的物理存储位置为L0C Buffer(TPosition:CO1)。
LocalTensor的起始地址需要256个元素(1024字节)对齐。
fm输入源操作数,左矩阵A,类型为LocalTensor,支持的物理存储位置为L0A Buffer(TPosition: A2)。
LocalTensor的起始地址需要512字节对齐。
filter输入源操作数,右矩阵B,类型为LocalTensor,支持的物理存储位置为L0B Buffer(TPosition:B2)。
LocalTensor的起始地址需要512字节对齐。
mmadParams输入矩阵乘相关参数,类型为MmadParams。
具体定义请参考${INSTALL_DIR}/asc/include/basic_api/interface/kernel_struct_mm.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。
参数说明请参考表5。

表5MmadParams结构体内参数说明(Sparse场景)

参数名称含义
m左矩阵Height,取值范围:m∈[0, 4095]。默认值为0。
n右矩阵Width,取值范围:n∈[0, 4095]。默认值为0。
k左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095]。默认值为0。
cmatrixInitVal是否开启C矩阵默认初始化清零操作。默认值为 true。
• true:C矩阵默认初始化为0;
• false:C矩阵不进行默认操作,通过设置cmatrixSource参数进行初始化。
cmatrixSource配置C矩阵初始值是否来源于BT Buffer。默认值为false。
• false:不对L0C Buffer进行初始化操作;
• true:使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。
Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持配置为true/false。
Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持配置为true/false。
Atlas 200I/500 A2 推理产品,支持配置为true/false。
注意:带Bias输入的接口配置该参数无效,会根据Bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。
isBias该参数废弃,新开发内容不要使用该参数。如果需要累加初始矩阵,请使用带Bias的接口来实现;也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口,相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。
配置是否需要累加初始矩阵,默认值为false,取值说明如下:
• false:矩阵乘,无需累加初始矩阵,C = A * B。
• true:矩阵乘加,需要累加初始矩阵,C += A * B。
unitFlagunitFlag是一种Mmad指令和Fixpipe指令细粒度的并行,开启该功能后,硬件每计算完一个分形,计算结果就会被搬出。取值说明如下:
• 0(2'b00):不开启unitFlag;
• 2(2'b10):开启unitFlag,硬件执行完指令之后,不复位单元标记位;
• 3(2'b11):开启unitFlag,硬件执行完指令之后,复位单元标记位。
开启该功能时,须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。
该参数仅支持如下型号:
Atlas A2 训练系列产品/Atlas A2 推理系列产品;
Atlas A3 训练系列产品/Atlas A3 推理系列产品。
参数设置方案和特性细节可参考:UnitFlag。
kDirectionAlignSparse场景本开关默认为false,不支持配置为true。K方向对齐的核心功能是通过kDirectionAlign参数控制在使用float数据类型时,L0A Buffer和L0B Buffer矩阵在K方向上的对齐方式。
fmOffset左矩阵offset(整个左矩阵对应一个值),支持Scalar(应与src_fm.dtype一致)/立即数,默认0。
注:未使用,兼容旧款产品接口传入,Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。
enSsparse开启结构化稀疏特性,默认false;
注:未使用,兼容旧款产品接口传入,Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。
enWinogradA指示矩阵a是否通过winograd_feature_map_transform()生成,用于支持winograd特性,bool类型,默认false;
注:未使用,兼容旧款产品接口传入,Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。
enWinogradB指示矩阵b是否通过winograd_weight_transform()生成,用于支持winograd特性,bool类型,默认false;
注:未使用,兼容旧款产品接口传入,Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。

数据类型

表6A、B、C支持的精度类型组合(Atlas 200I/500 A2 推理产品)(Atlas A2 训练系列产品/Atlas A2 推理系列产品)(Atlas A3 训练系列产品/Atlas A3 推理系列产品)

左矩阵A右矩阵B结果矩阵C
int8_tint8_tint32_t

返回值说明

约束说明

调用示例

完整使用样例请参见MmadWithSparse样例。

AscendC::LocalTensor<int8_t> a1Local(AscendC::TPosition::A1, a1Addr, aSize); AscendC::LocalTensor<int8_t> a2Local(AscendC::TPosition::A2, a2Addr, aSize); AscendC::LocalTensor<int8_t> b1Local(AscendC::TPosition::B1, b1Addr, bSize); AscendC::LocalTensor<uint8_t> idxB1Local(AscendC::TPosition::B1, idxB1Addr, bSize / 4); AscendC::LocalTensor<int8_t> b2Local(AscendC::TPosition::B2, b2Addr, bSize); AscendC::LocalTensor<int32_t> cLocal(AscendC::TPosition::CO1, cAddr, cSize); // GM->L1 Buffer,将原始矩阵a,稠密化矩阵b与对应idx矩阵搬运至L1 Buffer CopyIn(a1Local, b1Local, idxB1Local); AscendC::SetFlag<AscendC::HardEvent::MTE2_MTE1>(EVENT_ID0); AscendC::WaitFlag<AscendC::HardEvent::MTE2_MTE1>(EVENT_ID0); // L1 Buffer->L0A Buffer/L0B Buffer,将原始矩阵a,稠密化矩阵b与对应idx矩阵搬运至L0A Buffer/L0B Buffer SplitA(a1Local, a2Local); SplitB(b2Local, b1Local, idxB1Local); AscendC::SetFlag<AscendC::HardEvent::MTE1_M>(EVENT_ID0); AscendC::WaitFlag<AscendC::HardEvent::MTE1_M>(EVENT_ID0); // mmad需要指定矩阵的维度进行计算 uint32_t m = 128; uint32_t k = 64; uint32_t n = 128; AscendC::MmadWithSparse(c1Local, a2Local, b2Local, { m, n, k, false, 0, false, false, false });

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

http://www.cnnetsun.cn/news/3426385.html

相关文章:

  • Claudian插件3分钟安装指南:在Obsidian中集成AI编码助手
  • 网约房民宿数字化治理落地:智能锁如何解决合规风控与无人运营难题
  • 运放电路设计:从虚短虚断到实际应用
  • QMCFLAC2MP3终极指南:快速免费解锁QQ音乐加密格式,实现跨设备播放自由
  • 炉石传说自动化脚本终极指南:3分钟快速配置,24小时智能刷金
  • 深度解析dynamic-datasource多环境配置合并:5个实战技巧解决Spring Boot数据源管理难题
  • 如何用Trainers‘ Legend G开启你的中文赛马娘之旅:从日语小白到游戏大师的蜕变
  • 终极指南:在Windows上实现macOS风格三指拖拽的完整教程
  • QMCFLAC2MP3终极指南:如何三步解锁QQ音乐加密文件实现自由播放
  • Ubuntu系统清理:5种高效释放磁盘空间的方法
  • 开发板实战手记之STM32H743-01 从零到点灯
  • Jupyter Lab局域网访问配置全指南:ip=0.0.0.0与token安全实战
  • 基于Windows API的窗口尺寸强制调整解决方案:突破应用程序界面限制的技术实现
  • VidBee:如何在1000+网站上轻松下载视频的终极指南
  • 3步轻松掌握跨平台图表神器:drawio-desktop完全替代Visio的终极方案
  • CANN/asc-devkit矩阵计算数据搬入接口
  • Palworld存档编辑终极指南:3步实现游戏数据可视化修改
  • Windows 11终极精简方案:如何选择最适合你的系统镜像制作工具
  • 5分钟快速上手:GBFR Logs让《碧蓝幻想Relink》伤害统计一目了然
  • 超越想象的图像理解能力:Ornith-1.0-9B-OptiQ-4bit视觉功能全解析
  • 小程序毕设项目:托管学生档案管理系统的设计与实现 基于 SpringBoot + 微信小程序的小学托管日常巡查系统 (源码+文档,讲解、调试运行,定制等)
  • Windows 11系统安装与开发环境配置全指南
  • 阿里云ECS部署Hermes Agent与OpenClaw实战指南
  • 5步彻底解决ComfyUI ControlNet Aux模型下载失败:深度解析与实战指南
  • 如何用Python实现贝叶斯分析?PyMC3与ArviZ实战指南
  • 3DSident架构升级:从用户模式到系统级集成的技术实现与性能优化
  • 如何一键找回被遗忘的QQ空间记忆:GetQzonehistory完整指南
  • 车辆视角路面锥形桶交通导流锥路障识别分割数据集labelme格式3417张3类别
  • Xournal++:你的跨平台数字笔记革命,重新定义手写与PDF批注体验
  • Ubuntu国内镜像源配置指南与优化实践