CANN/asc-devkit:矩阵乘输出的Channel拆分

CANN/asc-devkit:矩阵乘输出的Channel拆分
矩阵乘输出的Channel拆分【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit功能介绍矩阵乘输出的Channel拆分又称ChannelSplit。指当Matmul计算结果C矩阵的格式为NZ时C矩阵采用分形存储关于NZ格式的详细内容请参考数据格式。当C矩阵的物理排布格式为NZ、数据类型为float时默认情况下每个分形内部包含16*16个元素即分形的大小为16*16。ChannelSplit的功能为将此场景下C矩阵的每个16*16的分形切分为16*8的分形使得C矩阵按照16*8的分形进行存储。由于1个float类型数据的大小为4字节16*8的分形在内轴满足32字节对齐内轴上的数据量与一条NPU矢量计算指令处理的数据单元一致这便于后续的其它计算。ChannelSplit功能默认不启用用户需通过设置MatmulConfig中的isEnableChannelSplit参数为true来开启此功能。图1ChannelSplit功能示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/ded540824a702f5cab69a36879315c31ce8ff9b7/docs/zh/guide/figures/ChannelSplit功能示意图.png ChannelSplit功能示意图?utm_sourcegitcode_repo_files)使用场景对于NZ格式、float类型的C矩阵需要按16*8的分形存储时使用该功能。约束说明开启ChannelSplit功能需满足C矩阵的数据排布格式为CubeFormat::NZ。C矩阵的数据类型为float。C矩阵的内存逻辑位置为Global Memory。矩阵乘结果CO1数据类型为float。调用示例完整的算子样例请参考matmul_channelsplit算子样例。// 指定获取和修改的MatmulConfig模板 constexpr static MatmulConfigMode configMode MatmulConfigMode::CONFIG_NORM; // 修改模板参数isEnableChannelSplittrue开启该MatmulConfig模板的ChannelSplit功能 constexpr static MatmulFuncParams funcParamsChannelSplit{ false, false, false, false, 0, IterateOrder::ORDER_M, ScheduleType::INNER_PRODUCT, true, false, false, false, true/*isEnableChannelSplit*/ }; constexpr static MatmulConfig MM_CFG GetMMConfigconfigMode(funcParamsChannelSplit); MatmulA_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, MM_CFG mm; // 常规Matmul计算最后输出分形为16*8 REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm); mm.SetTensorA(gm_a); mm.SetTensorB(gm_b); mm.SetBias(gm_bias); mm.IterateAll(gm_c);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考