资讯详情

Ascend C Matmul Tiling 之 SetShape 接口详解:Matmul 计算形状的设置与 -1 参数回退机制

📅 2026/10/16 2:33:13 | 华诺云谱 👁 阅读
Ascend C Matmul Tiling 之 SetShape 接口详解:Matmul 计算形状的设置与 -1 参数回退机制
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载导读SetShape是 Ascend C Matmul Tiling API 中用于设置 Matmul 计算形状m、n、k的核心接口也是使用 MatmulApiTiling / MultiCoreMatmulTiling / BatchMatmulTiling 获取 Tiling 参数时必须调用的关键步骤之一。本文以开源仓库 asc-devkit 中该接口的官方文档为骨架结合 Tiling 源码实现 与 单元测试用例深入讲解 SetShape 的两种参数传入方式、与 SetOrgShape 的配合关系、-1 回退机制的底层原理并给出单核、多核、BatchMatmul 三种场景的完整可运行示例。读完本文你将能够正确配置 Matmul Tiling 的形状参数并理解含脏数据的原始矩阵应如何通过 SetShape SetOrgShape 组合完成 Tiling 计算。功能说明SetShape 设置什么SetShape用于设置 Matmul 计算的形状 m、n、k单位为元素个数。该形状既可以是原始完整矩阵的形状也可以是原始矩阵的局部矩阵形状例如只计算某个子块该形状的矩阵乘可以由单核完成也可以由多核切分后共同完成。从 MatmulApiTilingBase 源码 可以看到SetShape本质上写入的是singleM、singleN、singleK三个成员变量int32_t MatmulApiTilingBase::SetShape(int32_t m, int32_t n, int32_t k) { TILING_LOG_DEBUG(Set Single M: %d, m); TILING_LOG_DEBUG(Set Single N: %d, n); TILING_LOG_DEBUG(Set Single K: %d, k); this-singleM m; this-singleN n; this-singleK k; if (this-orgM -1 this-orgN -1 this-orgKa -1 this-orgKb -1) { this-orgM m; this-orgN n; this-orgKa k; this-orgKb k; } return 0; }注意上述源码中的一个重要细节如果此前尚未调用SetOrgShapeSetShape会自动把 orgM、orgN、orgKa、orgKb 一并设置为 m、n、k。也就是说在完整矩阵、无脏数据的最简单场景下只调用SetShape即可同时完成计算形状与原始形状的设置。参数传入的两种方式使用本接口时存在两种参数传入方式这也是 SetShape 使用中最关键的区别点方式一直接传入具体的 m、n、k传入 Matmul 计算的完整形状 m、n、k调用 GetTiling 接口时Tiling 算法将直接按照 m、n、k 计算并返回 Tiling 参数。tiling.SetShape(1024, 1024, 1024); // 设置Matmul计算的形状 tiling.SetOrgShape(1024, 1024, 1024);方式二m、n、k 中任意一个或多个位置传入 -1当 m、n、k 中任意一个或多个参数位置传入 -1 时调用 GetTiling 接口时该位置将回退取用 SetOrgShape 接口中设置的原始形状 M、N、K或 Ka/Kb然后由接口内部计算最优 Tiling 参数。这一回退逻辑在 Tiling 算法源码中体现得非常直接见 matmul_tiling_algorithm.cppint32_t MatmulTilingAlgorithm::GetSingleM() const { return tilingIns_-singleM ! -1 ? tilingIns_-singleM : tilingIns_-orgM; } int32_t MatmulTilingAlgorithm::GetSingleN() const { return tilingIns_-singleN ! -1 ? tilingIns_-singleN : tilingIns_-orgN; } int32_t MatmulTilingAlgorithm::GetSingleK() const { return tilingIns_-singleK ! -1 ? tilingIns_-singleK : tilingIns_-orgKa; }即singleM不为 -1 时以 SetShape 传入值为准为 -1 时自动使用 orgMK 方向回退到 orgKa。最终 TilingData 中的 M、N、Ka、Kb 也直接来源于原始形状tilingIns_-tiling_.set_M(tilingIns_-orgM); tilingIns_-tiling_.set_N(tilingIns_-orgN); tilingIns_-tiling_.set_Ka(tilingIns_-orgKa); tilingIns_-tiling_.set_Kb(tilingIns_-orgKb);典型场景K 方向含脏数据的原始矩阵-1 回退最典型的应用场景是原始 A 矩阵的 K 方向最后一列为不参与 Matmul 计算的脏数据。此时在 SetOrgShape 接口中设置包含该列数据的原始形状在SetShape接口中设置 Matmul实际计算的 K 方向大小同时将参数 m、n 设置为 -1表示 M、N 方向按照原始形状 M、N 计算 Tiling。这样Tiling 计算在 M、N 方向使用原始完整形状在 K 方向使用剔除脏数据后的实际计算大小从而保证搬运与计算偏移的正确性。源码中的回退逻辑singleM ! -1 ? singleM : orgM正是为这种部分方向指定、部分方向回退的组合而设计。函数原型int32_t SetShape(int32_t m, int32_t n, int32_t k)该接口为MatmulApiTilingBase基类的虚函数由MatmulApiTiling、MultiCoreMatmulTiling、BatchMatmulTiling三个类继承/重写。多核类 MultiCoreMatmulTiling::SetShape 的实现比基类更谨慎当参数为 -1 时不会用 -1 覆盖原始形状的对应维度int32_t MultiCoreMatmulTiling::SetShape(int32_t m, int32_t n, int32_t k) { this-singleM m; this-singleN n; this-singleK k; if (this-orgM -1 this-orgN -1 this-orgKa -1 this-orgKb -1) { this-orgM m ! -1 ? m : this-orgM; this-orgN n ! -1 ? n : this-orgN; this-orgKa k ! -1 ? k : this-orgKa; this-orgKb k ! -1 ? k : this-orgKb; } return 0; }也就是说在多核场景下即使 m/n/k 传入 -1原始形状也能保持由SetOrgShape设置的取值不被破坏。参数说明表1参数说明参数名输入/输出描述m输入设置 Matmul 计算的 M 方向大小单位为元素。n输入设置 Matmul 计算的 N 方向大小单位为元素。k输入设置 Matmul 计算的 K 方向大小单位为元素。三个参数均为int32_t类型。取值含义区分两种情形正值作为该方向的实际计算大小参与 Tiling 计算-1不指定该方向Tiling 计算时回退使用 SetOrgShape 中设置的原始形状对应维度M→orgMN→orgNK→orgKa。返回值说明-1设置失败0设置成功。需要注意的是SetShape自身的返回值只代表形状参数是否被成功记录真正的 Tiling 计算成功与否取决于随后调用 GetTiling 的返回值-1表示计算失败。约束说明无。SetShape本身没有额外的参数约束但 Tiling 计算的整体合法性如singleM/singleN/singleK不能为 0、base 块不能超过 L0A/L0B/L0C 容量等由 GetTiling 内部的CheckSetParam()统一校验见 matmul_tiling_base.cpp。与 SetOrgShape 的配合关系SetShape与SetOrgShape是成对使用的两个接口理解二者差异是正确使用的前提SetShape设置Matmul 实际计算的形状 singleM、singleN、singleKSetOrgShape设置原始完整的形状 orgM、orgN、orgKa、orgKb主要用于辅助 Matmul API 搬运时的偏移计算。典型组合一形状一致无脏数据auto ascendcPlatform platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); matmul_tiling::MatmulApiTiling tiling(ascendcPlatform); tiling.SetShape(1024, 1024, 1024); // 设置Matmul计算的形状 tiling.SetOrgShape(1024, 1024, 1024);典型组合二K 方向剔除脏数据SetShape 指定 Km/n 传 -1假设原始 A 矩阵形状为 (1024, 1024)但 K 方向最后一列为脏数据实际参与计算的 K 为 1023matmul_tiling::MatmulApiTiling tiling(ascendcPlatform); tiling.SetOrgShape(1024, 1024, 1024); // 原始完整形状包含脏数据列 tiling.SetShape(-1, -1, 1023); // M、N 回退到原始形状K 指定实际计算大小典型组合三Ka、Kb 不等长矩阵乘变形场景当原始矩阵 Ka 与 Kb 不相等时例如分形或转置变形场景需要使用 SetOrgShape 的四参数重载分别设置 orgKa 与 orgKbtiling.SetShape(1024, 1024, 1024); tiling.SetOrgShape(1024, 1024, 1024, 1280); // orgKa1024orgKb1280参数 orgKaIn 和 orgKbIn 可以不相等二者并不是实际 Matmul 计算时的 K仅用于辅助 Matmul API 搬运时的偏移计算。三种 Tiling 对象下的完整调用示例根据 Matmul Tiling 类使用说明使用流程为先创建 Tiling 对象再设置 A/B/C/Bias 类型与形状信息最后调用 GetTiling 获取结果。SetShape在流程中位于设置形状信息步骤。单核 TilingMatmulApiTilingauto ascendcPlatform platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); matmul_tiling::MatmulApiTiling tiling(ascendcPlatform); // 设置A、B、C、Bias矩阵Position、Format、DType信息 tiling.SetAType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tiling.SetBType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tiling.SetCType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); tiling.SetBiasType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); tiling.SetShape(1024, 1024, 1024); // 设置单核计算的M、N、K大小 tiling.SetOrgShape(1024, 1024, 1024); // 设置原始输入M、N、K大小单核Tiling与SetShape一致 tiling.EnableBias(true); // 设置matmul计算包含bias tiling.SetBufferSpace(-1, -1, -1); // 设定允许使用的空间缺省使用该AI处理器所有空间 optiling::TCubeTiling tilingData; int64_t ret tiling.GetTiling(tilingData); // if ret -1, get tiling failed多核 TilingMultiCoreMatmulTilingauto ascendcPlatform platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); matmul_tiling::MultiCoreMatmulTiling tiling(ascendcPlatform); tiling.SetDim(1); // 设置参与计算的核数为1 tiling.SetAType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tiling.SetBType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tiling.SetCType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); tiling.SetBiasType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); tiling.SetShape(1024, 1024, 1024); // 设置整体计算的M、N、K大小 tiling.SetSingleShape(1024, 1024, 1024);// 设置单核计算的形状 tiling.SetOrgShape(1024, 1024, 1024); tiling.EnableBias(true); tiling.SetBufferSpace(-1, -1, -1); optiling::TCubeTiling tilingData; int64_t ret tiling.GetTiling(tilingData); // if ret -1, get tiling failedBatchMatmul TilingBatchMatmulTilingauto ascendcPlatform platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); matmul_tiling::BatchMatmulTiling bmmTiling(ascendcPlatform); bmmTiling.SetAType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); bmmTiling.SetBType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); bmmTiling.SetCType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); bmmTiling.SetBiasType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT); bmmTiling.EnableBias(true); bmmTiling.SetShape(64, 48, 32); bmmTiling.SetSingleShape(64, 48, 32); bmmTiling.SetOrgShape(64, 48, 32); // Layout类型为NORMAL时,通过SetBatchInfoForNormal设置A、B、C矩阵的Layout轴信息 bmmTiling.SetBatchInfoForNormal(2, 2, 64, 48, 32); bmmTiling.SetBatchNum(2); bmmTiling.SetBufferSpace(-1, -1, -1); optiling::TCubeTiling tilingData; int64_t ret bmmTiling.GetTiling(tilingData); // if ret -1, get tiling failed上述示例中SetShape设置的形状与SetOrgShape完全一致均为完整矩阵在多核与 BatchMatmul 场景还需要通过 SetSingleShape 显式指定单核形状默认 -1 时由 Tiling 函数自行计算。头文件与依赖Matmul 单核 Tiling#include lib/matmul/matmul_tiling.h对应仓库 include/adv_api/matmul/matmul_tiling.hMatmul 多核 Tiling / BatchMatmul Tiling#include lib/matmul/bmm_tiling.h对应仓库 include/adv_api/matmul/bmm_tiling.h。Tiling 对象创建时推荐使用带参构造函数MatmulApiTiling(const platform_ascendc::PlatformAscendC)由硬件平台信息AI Core 各存储单元大小等驱动更优的 Tiling 计算详细说明见 Matmul Tiling 类构造函数。源码级验证-1 参数在测试与实现中的实际行为仓库 tests/api/adv_api/tiling/test_matmul_api_tiling.cpp 中的测试用例大量使用SetOrgShape SetShape(-1, -1, -1)组合验证了-1 回退到原始形状的机制例如TEST_F(TestMatmulAPITiling, TestMatmulApiTilingMultiCoreBTSCM) { optiling::TCubeTiling tilingData; matmul_tiling::MultiCoreMatmulTiling tilingApi; tilingApi.SetDim(24); tilingApi.SetAType( matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tilingApi.SetBType( matmul_tiling::TPosition::TSCM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tilingApi.SetCType(matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::NZ, matmul_tiling::DataType::DT_FLOAT); tilingApi.SetBiasType( matmul_tiling::TPosition::GM, matmul_tiling::CubeFormat::ND, matmul_tiling::DataType::DT_FLOAT16); tilingApi.SetOrgShape(65536, 64, 64); tilingApi.SetShape(-1, -1, -1); // 三个方向全部回退到原始形状 tilingApi.EnableBias(false); tilingApi.SetBufferSpace(-1, -1, -1); int64_t res tilingApi.GetTiling(tilingData); EXPECT_EQ(res, 0); // Tiling计算成功 }这类用例证明即使SetShape全传 -1只要SetOrgShape提供了原始形状GetTiling依然能够基于原始形状完成 Tiling 计算。此外测试中还覆盖了SetShape(736, 7168, 4096)与SetOrgShape(736, 7168, 4096)完全一致的常规路径并校验了多核切分后 singleCoreM / singleCoreN 的 16 元素对齐约束对应 TCubeTiling 结构体 中对齐要求。常见问题与使用建议先 SetShape 还是先 SetOrgShape从基类实现看若先调用SetShape则 org 形状会被自动填充为 m/n/k若随后调用SetOrgShapeorg 会被覆盖为显式设置值。因此当形状不一致如剔除脏数据时务必先 SetOrgShape、再 SetShape(-1, -1, 实际K)确保回退使用的原始形状正确。-1 只能用于回退到原始形状的语义不要混用 0 或负数作为不设置的标记0 会被CheckSetParam()判定为非法singleM/N/K can not be zero导致 GetTiling 返回 -1。Tiling 计算失败的排查当 GetTiling 返回 -1 时将日志级别设置为 WARNING 并搜索关键字 MatmulApi Tiling 可定位失败原因计算成功时可将日志级别设置为 INFO 并搜索 MatmulTiling 查看 TilingData 各参数值。多核场景的维度多核 Tiling 中SetShape描述的是整体计算形状单核切分形状由SetSingleShape控制默认 -1 由算法自行推导切分后的实际单核形状可通过GetSingleShape查询。通过合理运用SetShape的两种传参方式及其与SetOrgShape的回退配合机制开发者可以在完整矩阵、局部矩阵、含脏数据矩阵、Ka/Kb 不等长等多样化的 Matmul 场景下稳定获取正确且性能最优的 Tiling 参数。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐深入解析 pyasc 中 asc.lib.host.MatmulApiTiling.set_shape设置 Matmul 矩阵乘计算形状的 Host 侧 Tiling 接口深入解析 pyasc 中 asc.lib.host.MatmulApiTiling.set_shape设置 Matmul 矩阵乘计算形状的 Host 侧 Ti编程语言编译器人工智能CANNAscendasc-devkit Matmul Tiling 之 SetBias 接口详解控制 Bias 参与矩阵乘运算的开关asc devkit Matmul Tiling 之 SetBias 接口详解控制 Bias 参与矩阵乘运算的开关 Matmul 是昇腾 AI 处理器上最核心人工智能深度学习算子库CANNAscendasc-devkit 中 Matmul Tiling 的 SetSparse 接口详解Sparse Matmul 稀疏场景设置指南asc devkit 中 Matmul Tiling 的 SetSparse 接口详解Sparse Matmul 稀疏场景设置指南 Sparse Matmul人工智能深度学习算子库CANNAscend上一篇Zola静态网站生成器的架构设计与性能优化实现方案下一篇practical-aspnetcore 实战用 IHttpClientFactory 与 AddHttpClient 集中管理 HttpClient四种注册方式全解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑