asc-devkit静态Tensor编程Matmul计算
基于静态Tensor编程实现Matmul计算概述本样例基于静态Tensor编程范式实现多核矩阵乘计算。支持的产品Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品目录结构介绍├── matmul_basic_api │ ├── scripts │ │ ├── gen_data.py // 输入数据和真值数据生成脚本文件 │ │ └── verify_result.py // 真值对比文件 │ ├── CMakeLists.txt // 编译工程文件 │ ├── data_utils.h // 数据读入写出函数 │ └── matmul_basic_api.asc // Ascend C样例实现 调用样例样例描述样例功能本样例使用Ascend C基础API实现一个最基础的矩阵乘法Matmul核函数。矩阵乘法的计算公式如下 $$ C A * B $$ 其中A矩阵的形状为[M, K]B矩阵的形状为[K, N]输出C矩阵的形状为[M, N]。对输出矩阵C中的每一个元素C[m, n]都会累加A矩阵第m行和B矩阵第n列在K轴上的乘积。样例规格本样例参数M 256, N 256, K 64输入输出均为half类型、ND格式。样例启动2个核完成计算每个核负责输出矩阵C在M轴方向的128行、N轴方向的全部256列第0个核计算C矩阵的第0~127行。第1个核计算C矩阵的第128~255行。输入输出规格如下表所示样例类型(OpType)Matmul样例输入nameshapedata typeformatA[M, K]halfNDB[K, N]halfND样例输出C[M, N]halfND核函数名mmad_custom样例实现Kernel侧整体思路mmad_custom是一个__global__ __cube__核函数表示该函数运行在AI Core的Cube计算单元上主要用于矩阵计算。样例使用静态Tensor编程方式通过LocalMemAllocator创建LocalTensor。CUBE_BLOCK 16表示half数据类型分形为16 x 16代码中按16 x 16的分形为单位进行LoadData搬运。Kernel侧详细流程创建GlobalTensorhalf对象aGM、bGM、cGM分别表示GMGlobal Memory全局内存中的A、B、C矩阵。通过AscendC::GetBlockIdx()获取当前核号并计算mIterIdx。本样例只沿M轴切分任务因此每个核只需要处理A矩阵和C矩阵中属于自己的M轴分片。设置GM地址偏移aGM偏移mIterIdx * singleCoreM * K使当前核读取自己负责的A矩阵行块。bGM不偏移因为每个核都需要读取完整B矩阵。cGM偏移mIterIdx * singleCoreM * N使当前核把结果写回C矩阵中自己负责的行块。通过LocalMemAllocator创建静态LocalTensora1LocalA矩阵在L1中的临时存储。a2LocalA矩阵在L0A中的临时存储供Mmad读取。b1LocalB矩阵在L1中的临时存储。a1Local和b1Local使用同一个L1 allocator按申请顺序分配避免手动维护L1地址偏移。b2LocalB矩阵在L0B中的临时存储供Mmad读取。cLocal矩阵乘结果在L0C中的临时存储。调用DataCopy将A、B矩阵从GM搬运到L1。这里使用Nd2NzParams参数在搬运过程中将输入的ND格式数据转换为Cube计算需要的Nz格式。调用SetFlagHardEvent::MTE2_MTE1和WaitFlagHardEvent::MTE2_MTE1进行同步。DataCopy属于MTE2流水后续LoadData属于MTE1流水MTE1必须等待MTE2完成避免读取到尚未搬运完成的L1数据。调用LoadData将A矩阵从L1搬运到L0A将B矩阵从L1搬运到L0B。L0A和L0B是Cube矩阵计算单元直接读取的输入缓存。调用SetFlagHardEvent::MTE1_M和WaitFlagHardEvent::MTE1_M进行同步。LoadData属于MTE1流水后续Mmad属于M流水M流水必须等待MTE1完成避免读取到尚未搬运完成的L0A/L0B数据。调用Mmad(cLocal, a2Local, b2Local, {baseM, baseN, baseK, 0, false, true})执行矩阵乘。这里baseM 128、baseN 256、baseK 64对应单个核一次计算的矩阵块大小。调用SetFlagHardEvent::M_FIX和WaitFlagHardEvent::M_FIX进行同步。Mmad属于M流水后续Fixpipe属于FIX流水FIX流水必须等待M流水完成避免读取到尚未计算完成的L0C结果。调用Fixpipe将L0C中的float累加结果转换为half并搬运回GM中的C矩阵输出位置。最后调用PipeBarrierPIPE_ALL()确保当前核内相关流水任务完成。调用实现使用内核调用符调用核函数。调用时模板参数传入矩阵规格、单核计算量和基础Tile大小运行时参数传入Device侧A、B、C矩阵地址。接口参数说明以下结构体均以花括号{}方式传参各字段含义如下字段顺序与API文档保持一致实际struct声明中部分字段顺序可能不同AscendC::Nd2NzParams—DataCopy接口使用描述ND→Nz格式转换参数struct Nd2NzParams { int32_t ndNum; // 传输ND矩阵的数目[0, 4095] uint16_t nValue; // ND矩阵的行数[0, 16384] int32_t dValue; // ND矩阵的列数[0, 65535] int32_t srcNdMatrixStride; // 相邻ND矩阵起始地址偏移单位元素[0, 65535] int32_t srcDValue; // 同一ND矩阵相邻行偏移单位元素[1, 65535] uint16_t dstNzC0Stride; // 目的Nz中同源行转换后多行相邻偏移单位C0_SIZE(32B)[1, 16384] uint16_t dstNzNStride; // 目的Nz中Z型矩阵相邻行偏移单位C0_SIZE(32B)[1, 16384] int32_t dstNzMatrixStride; // 目的Nz中相邻Nz矩阵起始地址偏移单位元素[1, 65535] };例如搬运A矩阵时{1, baseM, baseK, 0, K, baseM, 1, 0}将baseM×baseK的ND数据转为Nz格式。AscendC::LoadData2DParams—LoadData接口使用描述Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品中A矩阵L1到L0A和B矩阵L1到L0B的数据搬运参数struct LoadData2DParams { int32_t startIndex; // 分形矩阵ID0为第1个单位512B[0, 65535] int32_t repeatTimes; // 迭代次数每个迭代处理512B[1, 255] int32_t srcStride; // 相邻迭代源分形起始地址间隔单位512B[0, 65535] int32_t sid; // 预留配置为0 int32_t dstGap; // 目的端相邻迭代分形间隔单位512B[0, 65535] bool ifTranspose; // 是否转置每个分形默认false bool addrMode; // 地址更新方式false递增true递减默认false };例如Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品中L0A上的排布格式为Zz搬运A矩阵时{0, baseK / CUBE_BLOCK, baseM / CUBE_BLOCK, 0, 0, false, 0}搬运B矩阵时ifTransposetrue完成Nz到Zn的转置搬运。AscendC::LoadData2DParamsV2—LoadData接口使用描述Ascend 950PR/Ascend 950DT产品中A矩阵L1到L0A和B矩阵L1到L0B的数据搬运参数struct LoadData2DParamsV2 { uint32_t mStartPosition; // M方向起始位置单位512B uint32_t kStartPosition; // K方向起始位置单位512B uint16_t mStep; // M方向搬运分形数 uint16_t kStep; // K方向搬运分形数 int32_t srcStride; // 源端相邻K方向分形间隔单位512B uint16_t dstStride; // 目的端相邻K方向分形间隔单位512B bool ifTranspose; // 是否转置每个分形默认false uint8_t sid; // 预留配置为0 };Ascend 950PR/Ascend 950DT产品中L0A上的排布格式为Nz搬运A矩阵时使用{0, 0, baseM / CUBE_BLOCK, baseK / CUBE_BLOCK, baseM / CUBE_BLOCK, baseM / CUBE_BLOCK, false, 0}一次完成A矩阵Nz到Nz搬运搬运B矩阵时使用{0, 0, baseK / CUBE_BLOCK, baseN / CUBE_BLOCK, baseK / CUBE_BLOCK, baseN / CUBE_BLOCK, true, 0}一次完成B矩阵Nz到Zn搬运。AscendC::MmadParams—Mmad接口使用描述矩阵乘参数struct MmadParams { uint16_t m; // 左矩阵HeightM维[0, 4095] uint16_t n; // 右矩阵WidthN维[0, 4095] uint16_t k; // 左矩阵Width/右矩阵HeightK维[0, 4095] uint16_t unitFlag; // Mmad与Fixpipe细粒度并行控制默认0 bool cmatrixSource; // C矩阵初始值来源falseCO1trueC2默认false bool cmatrixInitVal; // C矩阵初始值是否为0默认true };例如{baseM, baseN, baseK, 0, false, true}计算baseM×baseN输出块并在K方向累加baseK长度。AscendC::FixpipeParamsV220—Fixpipe接口使用描述L0C到GM的数据搬运和精度转换参数struct FixpipeParamsV220 { int32_t nSize; // 源Nz矩阵N方向大小[1, 4095] uint16_t mSize; // 源Nz矩阵M方向大小Nz2ND时[1, 8192] uint16_t srcStride; // 源Nz相邻Z排布起始偏移单位C0_SIZE[0, 65535] int32_t dstStride; // Nz2ND时目的ND矩阵每行元素数单位element bool reluEn; // 是否使能ReLU QuantMode_t quantPre; // 量化模式F322F16表示float→half uint64_t deqScalar; // scalar量化参数单个scale值 int32_t ndNum; // 源Nz矩阵数目[1, 65535] int32_t srcNdStride; // 不同Nz矩阵起始地址间隔单位16×C0_SIZE[1, 512] int32_t dstNdStride; // 目的相邻ND矩阵偏移单位element[1, 65535] int32_t unitFlag; // Mmad与Fixpipe并行控制 };例如{baseN, baseM, baseM, N, false, F322F16, 0, 1, 0, 0, 0}将L0C中的baseM×baseN float32结果转为half并写回GM。编译运行在本样例根目录下执行如下步骤编译并执行样例。配置环境变量请根据当前环境上CANN开发套件包的安装方式选择对应配置环境变量的命令。默认路径root用户安装CANN软件包source /usr/local/Ascend/cann/set_env.sh默认路径非root用户安装CANN软件包source $HOME/Ascend/cann/set_env.sh指定路径install_path安装CANN软件包source ${install_path}/cann/set_env.sh样例执行mkdir -p build cd build; # 创建并进入build目录 cmake -DCMAKE_ASC_ARCHITECTURESdav-2201 ..;make -j; # 编译工程默认npu模式 python3 ../scripts/gen_data.py # 生成测试输入数据 ./demo # 执行编译生成的可执行程序执行样例 python3 ../scripts/verify_result.py output/output.bin output/golden.bin # 验证输出结果是否正确确认算法逻辑正确使用 CPU调试 或 NPU仿真 模式时添加-DCMAKE_ASC_RUN_MODEcpu或-DCMAKE_ASC_RUN_MODEsim参数即可。示例如下cmake -DCMAKE_ASC_RUN_MODEcpu -DCMAKE_ASC_ARCHITECTURESdav-2201 ..;make -j; # cpu调试模式 cmake -DCMAKE_ASC_RUN_MODEsim -DCMAKE_ASC_ARCHITECTURESdav-2201 ..;make -j; # NPU仿真模式注意切换编译模式前需清理 cmake 缓存可在 build 目录下执行rm CMakeCache.txt后重新 cmake。编译选项说明选项可选值说明CMAKE_ASC_RUN_MODEnpu默认、cpu、sim运行模式NPU 运行、CPU调试、NPU仿真CMAKE_ASC_ARCHITECTURESdav-2201默认、dav-3510NPU 架构Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品执行结果执行结果如下说明精度对比成功。test pass!创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

FanControl风扇控制软件终极指南:5分钟掌握Windows智能散热

FanControl风扇控制软件终极指南:5分钟掌握Windows智能散热

FanControl风扇控制软件终极指南:5分钟掌握Windows智能散热 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…

2026/7/15 15:14:17阅读更多 →
数字化转型下的知识演进:文档管理 → 智能知识库 → AI Agent

数字化转型下的知识演进:文档管理 → 智能知识库 → AI Agent

任何事物的发展脱离不了熵增定律,随着企业规模、团队人数、业务复杂的不断提升,如何有效管理和利用数据资产,如何让员工高效协同,成为当下数字化转型的企业急需解决的问题。 基础能力 数据资产,包括结构化&#xff08…

2026/7/15 15:14:17阅读更多 →
麦克风静音控制:3秒解决会议中的尴尬时刻

麦克风静音控制:3秒解决会议中的尴尬时刻

麦克风静音控制:3秒解决会议中的尴尬时刻 【免费下载链接】MicMute Mute default mic clicking tray icon or shortcut 项目地址: https://gitcode.com/gh_mirrors/mi/MicMute 你是否经历过这样的场景?正参加重要视频会议,突然有家人或…

2026/7/15 15:09:16阅读更多 →
JS_Fun_Practice中的柯里化技巧:如何写出更优雅的JavaScript代码

JS_Fun_Practice中的柯里化技巧:如何写出更优雅的JavaScript代码

JS_Fun_Practice中的柯里化技巧:如何写出更优雅的JavaScript代码 【免费下载链接】JS_Fun_Practice A list of small & fun functional programming exercises in JavaScript 项目地址: https://gitcode.com/gh_mirrors/js/JS_Fun_Practice 在JavaScript…

2026/7/15 16:24:35阅读更多 →
【电脑批量自动处理工具】 OpenClaw 2.7.9 下载、解压、启动全流程(含安装包)

【电脑批量自动处理工具】 OpenClaw 2.7.9 下载、解压、启动全流程(含安装包)

OpenClaw 2.7.9 本地桌面 AI 部署全流程|Windows 零基础安装实操指南✨ 开篇介绍📋 日常工作中大量重复性操作会占用不少工作时间,市面上绝大多数对话类 AI 仅能完成文字问答,没办法直接操作本地文件、表格、浏览器软件。OpenCl…

2026/7/15 16:24:35阅读更多 →
用ChatGPT写简历到底靠不靠谱?92%的求职者踩了这5个致命陷阱(附合规性白皮书)

用ChatGPT写简历到底靠不靠谱?92%的求职者踩了这5个致命陷阱(附合规性白皮书)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT写简历的底层逻辑与风险全景图 ChatGPT生成简历并非“智能创作”,而是基于海量公开简历语料的统计模式复现。其核心机制是概率化文本续写:给定提示词(如“请为…

2026/7/15 16:24:35阅读更多 →
RimWorld终极角色定制指南:如何用EdB Prepare Carefully打造完美开局

RimWorld终极角色定制指南:如何用EdB Prepare Carefully打造完美开局

RimWorld终极角色定制指南:如何用EdB Prepare Carefully打造完美开局 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 厌倦了RimWorld中随机生成的殖民者无法…

2026/7/15 16:24:35阅读更多 →
Obsidian Excel to Markdown Table插件:3个常见问题与解决方案

Obsidian Excel to Markdown Table插件:3个常见问题与解决方案

Obsidian Excel to Markdown Table插件:3个常见问题与解决方案 【免费下载链接】obsidian-excel-to-markdown-table An Obsidian plugin to paste data from Microsoft Excel, Google Sheets, Apple Numbers and LibreOffice Calc as Markdown tables in Obsidian e…

2026/7/15 16:24:35阅读更多 →
3大问题解决方案:为什么你的无人机飞行体验不够流畅?BLHeli固件配置全攻略

3大问题解决方案:为什么你的无人机飞行体验不够流畅?BLHeli固件配置全攻略

3大问题解决方案:为什么你的无人机飞行体验不够流畅?BLHeli固件配置全攻略 【免费下载链接】BLHeli BLHeli for brushless ESC firmware 项目地址: https://gitcode.com/gh_mirrors/bl/BLHeli 你是否遇到过无人机飞行时电机响应迟钝、动力不足或稳…

2026/7/15 16:19:35阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →