ARTICLE DETAIL

资讯详情

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

Tensor API Copy 接口与 Matmul 带 Bias 动态 Shape 矩阵乘法实现指南

Tensor API Copy 接口与 Matmul 带 Bias 动态 Shape 矩阵乘法实现指南 Tensor API Copy 接口与 Matmul 带 Bias 动态 Shape 矩阵乘法实现指南【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit本文章介绍 asc-devkit 开源项目中的copy_in_tensor_api样例该样例基于 Tensor API 编程方式通过 Copy 接口GM 到 L1、L1 到 L0 的数据搬运与 Mmad 接口矩阵乘加实现带 Bias 的动态 Shape 多核 Matmul 计算并覆盖 AB 矩阵转置与非转置四种场景。快速编译运行获取样例并配置环境样例位于项目仓库的examples/01_simd_cpp_api/03_basic_api/00_data_movement/copy_in_tensor_api目录下。若本地尚无仓库可先克隆git clone https://gitcode.com/cann/asc-devkit随后按照当前环境中 CANN 开发套件的安装方式配置环境变量加载环境脚本source ${install_path}/cann/set_env.sh说明${install_path}为 CANN 包安装目录未指定安装目录时默认安装至/usr/local/Ascend下。该样例依赖尚未正式发布的 CANN 特性当前仅支持使用 CANN master 包。样例支持的产品及 CANN 软件版本产品CANN 软件版本Ascend 950PR / Ascend 950DT CANN 9.1.0编译与执行步骤以场景 0AB 不转置half 类型为例在样例根目录下依次执行SCENARIO_NUM0 mkdir -p build cd build; # 创建并进入 build 目录 cmake -DSCENARIO_NUM${SCENARIO_NUM} -DCMAKE_ASC_ARCHITECTURESdav-3510 ..;make -j; # 编译工程默认 NPU 模式 python3 ../scripts/gen_data.py ${SCENARIO_NUM}; # 生成场景 0 的测试输入数据 ./demo; # 执行编译生成的可执行程序 python3 ../scripts/verify_result.py output/output.bin output/golden.bin # 真值对比确认算法逻辑正确数据生成脚本gen_data.py会在当前目录创建input/与output/子目录input/存放矩阵 A、矩阵 B 与 Bias 的二进制文件input_x.bin、input_y.bin、bias.binoutput/存放 Python 侧按C A B bias预计算的真值文件golden.bin。需要 NPU 仿真模式时在 cmake 阶段追加-DCMAKE_ASC_RUN_MODEsim参数cmake -DSCENARIO_NUM${SCENARIO_NUM} -DCMAKE_ASC_RUN_MODEsim -DCMAKE_ASC_ARCHITECTURESdav-3510 ..;make -j;注意切换编译模式前需清理 cmake 缓存可在 build 目录下执行rm CMakeCache.txt后重新执行 cmake。切换场景只需修改SCENARIO_NUM变量取值 03并同步将其作为参数传给gen_data.py保证生成的输入布局与 kernel 侧布局选择一致。编译选项说明选项可选值说明CMAKE_ASC_RUN_MODEnpu默认、sim运行模式NPU 运行、NPU 仿真CMAKE_ASC_ARCHITECTURESdav-3510NPU 架构dav-3510 对应 Ascend 950PR / Ascend 950DTSCENARIO_NUM0默认、1、2、3场景编号0AB 不转置 half1AB 不转置 float2AB 转置 half3AB 转置 floatMatmul 带 Bias 算子功能与接口动态 Shape 多核 Matmul样例将分块参数划分为两类编译期模板参数baseM、baseN、baseK与stepM、stepN、stepK作为 kernel 函数模板参数在编译时确定决定 L0/L1 各级 buffer 的分配大小与 L1 缓存的步进深度。运行时动态参数M、N、K 及单核分块尺寸singleCoreM、singleCoreN、singleCoreK封装在MatmulTiling结构体中host 端通过aclrtMemcpy拷入设备侧 GM 内存kernel 启动后逐字段读回。每个核block通过GetBlockIdx()计算自己在 M/N 两个方向上的迭代索引并裁出边界不完整时的实际处理尺寸actualSingleCoreM、actualSingleCoreN从而支持任意能被单核尺寸整除或存在尾块的动态 Shape。默认配置下共使用 32 个核M 方向 1024/2564 个分块N 方向 1024/1288 个分块。Bias 加偏流程Bias 为 float 类型的一维向量长度为 N。处理流程为外层 N 分块循环中先将当前 N 分块对应的 Bias 从 GM 搬到 L1再从 L1 搬到 BTBias 寄存器区内层 K 循环的首次迭代kIter 0调用Mmad时将 Bias 一并参与计算其后各次迭代仅执行累加。MatmulTiling 结构体定义struct MatmulTiling { int32_t m; // 矩阵A的行数 int32_t n; // 矩阵B的列数 int32_t k; // 矩阵A的列数/矩阵B的行数 int32_t singleCoreM; // 单核处理的M维度大小 int32_t singleCoreN; // 单核处理的N维度大小 int32_t singleCoreK; // 单核处理的K维度大小 };数据流与内存搬运kernel 中所有搬运均由 Tensor API 的Copy接口完成计算由Mmad接口完成整体数据流如下GM - L1使用CopyGM2L1atom。内层 K 循环每走满stepK步才将 A、B 对应块从 GM 预取到 L1形成 L1 级多缓冲流水K 方向默认步进 4。L1 - L0使用CopyL12L0AA 矩阵与CopyL12L0BB 矩阵atom每次搬运一个baseM x baseK/baseK x baseN的基础块。Mmad 计算l0CTensor作为累加目的依次接收各 K 块的乘加结果首块叠加 Bias。L0C - GM内层 M/N 分块计算完成后使用CopyL0C2GMatom 将 C 分块写回 GM 对应位置。Bias 路径GM - L1CopyGM2L1- BTCopyL12BT在每个 N 分块上各搬运一次。各数据通道的并发访问通过AscendC::Mutex::Lock/Unlock按管道PIPE_MTE2、PIPE_MTE1、PIPE_M、PIPE_FIX加锁保护避免同管线上多个 Copy/Mmad 任务相互覆盖。不同场景下 GM 侧布局到 L1 侧布局的映射示意下图分别对应不转置场景的 ND-NZ 与转置场景的 DN-NZ 搬运摘自同目录下的 data_copy_gm2l1 样例图示场景与参数规格场景矩阵SCENARIO_NUM同时决定转置模式与 A/B 矩阵的数据类型SCENARIO_NUM转置模式A/B 数据类型GM 布局L1 布局说明0AB 不转置halfNDNZAB 矩阵均不转置数据类型为 half1AB 不转置floatNDNZAB 矩阵均不转置数据类型为 float2AB 转置halfDNZNAB 矩阵均转置存储数据类型为 half3AB 转置floatDNZNAB 矩阵均转置存储数据类型为 float不转置模式场景 0/1矩阵 A 与矩阵 B 在 GM 和 L1 中均为 ND/NZ 布局数据按行优先存储。转置模式场景 2/3矩阵 A 与矩阵 B 在 GM 和 L1 中均为 DN/ZN 布局数据转置后存储。说明C 矩阵与 Bias 在所有场景下数据类型均为 float。各场景输入输出规格样例默认 Shape 为 M 1024、N 1024、K 256核函数名为copy_in_tensor_api算子类型为 Matmul with Bias。场景 0 / 场景 1AB 不转置A/B 数据类型分别为 half / float名称Shape数据类型格式a矩阵 A输入[M, K]half场景 0/ float场景 1NDb矩阵 B输入[K, N]half场景 0/ float场景 1NDbias输入[N]floatNDtiling输入MatmulTiling 结构体int32_tNDc矩阵 C输出[M, N]floatND场景 2 / 场景 3AB 转置A/B 数据类型分别为 half / float名称Shape数据类型格式a矩阵 A转置存储输入[K, M]half场景 2/ float场景 3DNb矩阵 B转置存储输入[N, K]half场景 2/ float场景 3DNbias输入[N]floatNDtiling输入MatmulTiling 结构体int32_tNDc矩阵 C输出[M, N]floatND参数默认值说明编译期模板参数默认值参数默认值说明BASE_M128M 维度基础分块大小BASE_N128N 维度基础分块大小BASE_K64K 维度基础分块大小STEP_M1M 维度 L1 缓存步进STEP_N1N 维度 L1 缓存步进STEP_K4K 维度 L1 缓存步进运行时动态参数默认值参数默认值说明m1024矩阵 A 的行数n1024矩阵 B 的列数k256矩阵 A 的列数 / 矩阵 B 的行数singleCoreM256单核 M 维度大小singleCoreN128单核 N 维度大小singleCoreK256单核 K 维度大小工程文件说明├── copy_in_tensor_api │ ├── scripts │ │ ├── gen_data.py // 输入数据与真值数据生成脚本 │ │ └── verify_result.py // 真值对比验证脚本 │ ├── CMakeLists.txt // CMake 编译工程文件 │ ├── data_utils.h // 数据读入写出工具函数 │ ├── copy_in_tensor_api.asc // Ascend C 核函数实现与 host 调用入口 │ ├── README.md // 样例说明文档 │ └── README_en.md // 样例说明文档英文copy_in_tensor_api.asc文件上半部分为__cube__ __global__核函数含 GM/L1/L0 tensor 构造、Copy 与 Mmad 调用、多核迭代逻辑下半部分为main函数完成 ACL 初始化、内存分配、输入文件读入经data_utils.h提供的ReadFile、tiling 结构体上板、kernel 直调与输出写出。scripts/gen_data.py按SCENARIO_NUM生成 [-2, 2] 区间的随机 A、B、Bias 输入及 float 精度真值转置场景下对 A、B 先做transpose()再落盘。scripts/verify_result.py以相对误差 1e-3、绝对误差 1e-3 逐元素对比output.bin与golden.bin错误比例不超过 1e-4 即判定通过。验证结果执行verify_result.py对比输出若打印如下内容说明精度对比成功算法逻辑正确test pass!【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表