CANN/asc-devkit矩阵乘法分块结构体

发布时间:2026/7/5 19:19:45
CANN/asc-devkit矩阵乘法分块结构体 TCubeTiling结构体【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitTCubeTiling结构体包含Matmul Tiling切分算法的相关参数被传递给Matmul Kernel侧用于Matmul的切块、搬运和计算过程等。TCubeTiling结构体的参数说明见表1。表1TCubeTiling结构说明| 参数名称 | 数据类型 | 说明 | | --- | --- | --- | | usedCoreNum | int | 使用的AI处理器核数请根据实际情况设置。取值范围为[1, AI处理器最大核数]。该参数与shape相关参数的关系为usedCoreNum (M / singleCoreM) * (N / singleCoreN)。 | | M, N, Ka, Kb | int | A、B、C矩阵原始输入的shape大小以元素为单位。M, Ka为A矩阵原始输入的ShapeKb, N为B矩阵原始输入的Shape。大小约束除Ascend 950PR/Ascend 950DT外 下述场景需要开启MatmulConfig中的intrinsicsCheck参数以完成Matmul计算。若A矩阵为ND格式不进行转置Ka大于65535时需要开启intrinsicsCheck参数M无大小限制进行转置M大于65535时需要开启intrinsicsCheck参数Ka无大小限制。若B矩阵为ND格式不进行转置N大于65535时需要开启intrinsicsCheck参数Kb无大小限制进行转置Kb大于65535时需要开启intrinsicsCheck参数N无大小限制。对齐约束若A矩阵以NZ格式输入则M需要以16个元素对齐Ka需要以C0_size对齐若B矩阵以NZ格式输入Kb需要以C0_size对齐N需要以16个元素对齐。若A、B矩阵为ND格式无对齐约束。注意NZ格式的输入float数据类型的C0_size为8half/bfloat16_t数据类型的C0_size为16int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64。 | | singleCoreM, singleCoreN, singleCoreK| int | A、B、C矩阵单核内shape大小以元素为单位。该参数取值必须大于0。singleCoreK K多核处理时不对K进行切分singleCoreM MsingleCoreN N。注意若A矩阵以NZ格式输入则singleCoreM需要以16个元素对齐singleCoreK需要以C0_size对齐若B矩阵以NZ格式输入则singleCoreK需要以C0_size对齐singleCoreN需要以16个元素对齐。 | | baseM, baseN, baseK| int | A、B、C矩阵参与一次矩阵乘指令的shape大小以元素为单位。A、B、C矩阵参与一次矩阵乘的shape大小需要按分形对齐其含义请参考Mmad中的数据格式说明。注意该参数取值必须大于0。MxMatmul场景baseK必须为64的倍数。 | |depthA1, depthB1 | int | A1、B1中全载基本块的份数depthA1为A1中全载baseM * baseK的份数depthB1为B1中全载baseN * baseK的份数。注意该参数取值必须大于0。 | | stepM stepNstepKastepKb| int | stepM为左矩阵在A1中缓存的buffer M方向上baseM的倍数。stepN为右矩阵在B1中缓存的buffer N方向上baseN的倍数。stepKa为左矩阵在A1中缓存的buffer Ka方向上baseK的倍数。stepKb为右矩阵在B1中缓存的buffer Kb方向上baseK的倍数。注意该参数取值必须大于0。 | | isBias| int | 是否启用Bias参数取值如下0不启用Bias默认值。1启用Bias。注意该参数不支持除上述外的其他取值设置为其他值时参数行为未定义。 | | transLength| int | max(A1Length, B1Length, C1Length, BiasLength)。其中A1Length, B1Length, C1Length, BiasLength分别表示A/B/C/Bias矩阵在计算过程中需要临时占用的UB空间大小。 | | iterateOrder | int | 一次Iterate计算出[baseM, baseN]大小的C矩阵分片Iterate完成后Matmul会自动偏移下一次Iterate输出的C矩阵位置iterOrder表示自动偏移的顺序。参数取值如下0先往M轴方向偏移再往N轴方向偏移。1先往N轴方向偏移再往M轴方向偏移。注意该参数不支持除上述外的其他取值设置为其他值时参数行为未定义。 | | dbL0A, dbL0B,dbL0C | int | MTE1是否开启double buffer。dbL0A左矩阵MTE1是否开启double bufferdbL0B右矩阵MTE1是否开启double bufferdbL0CMMAD是否开启double buffer。参数取值如下1不开启double buffer。2开启double buffer。注意该参数不支持除上述外的其他取值设置为其他值时参数行为未定义。 | | shareMode | int | 该参数预留开发者无需关注。 | | shareL1Size | int | 该参数预留开发者无需关注。 | | shareL0CSize | int | 该参数预留开发者无需关注。 | | shareUbSize | int | 该参数预留开发者无需关注。 | | batchM | int | 该参数预留开发者无需关注。 | | batchN | int | 该参数预留开发者无需关注。 | | singleBatchM | int | 该参数预留开发者无需关注。 | | singleBatchN | int | 该参数预留开发者无需关注。 | | mxTypePara | int | 组合参数在MxMatmul场景使用表示scaleA/scaleB载入L1的大小与A/B矩阵载入L1大小的倍数具体如下0~6bit表示scaleA与A矩阵在K方向载入数据量的比例系数scaleFactorKa即scaleFactorKascaleA在K方向载入数据量/A矩阵在K方向载入数据量数据范围为[1, 127]8~14bit表示scaleB与B矩阵在K方向载入数据量的比例系数scaleFactorKb即scaleFactorKbscaleB在K方向载入数据量/B矩阵在K方向载入数据量数据范围为[1, 127]16~22bit表示scaleA与A矩阵在M方向载入数据量的比例系数scaleFactorM即scaleFactorMscaleA在M方向载入数据量/A矩阵在M方向载入数据量数据范围为[1, 127]24~30bit表示scaleB与B矩阵在N方向载入数据量的比例系数scaleFactorN即scaleFactorNscaleB在N方向载入数据量/B矩阵在N方向载入数据量数据范围为[1, 127]注意对于scaleA矩阵仅当Ka方向全载时支持开启M方向的多倍载入。即baseK * stepKa * scaleFactorKa singleCoreK时才能设置scaleFactorM为大于1的取值。对于scaleB矩阵仅当Kb方向全载时支持开启N方向的多倍载入。即baseK * stepKb * scaleFactorKb singleCoreK时才能设置scaleFactorN为大于1的取值。scaleA、scaleB在M、N、K方向的载入数据量不能超过实际大小。该参数仅在MDL模板生效。 |多数情况下用户通过调用GetTiling接口获取TCubeTiling结构体具体流程请参考使用说明。如果用户自定义TCubeTiling参数各个参数的取值需要满足表1和表2中的对应参数的约束条件。如果用户通过调用GetTiling接口获取TCubeTiling结构体后需要修改调整Tiling请参考如下TCubeTiling参数约束和性能调优推荐取值进行参数的设置。TCubeTiling参数约束一组合法的TCubeTiling参数需要同时满足表2中的所有约束条件。若Matmul对象的MatmulConfig模板为MDL模板除表2外还同时需要满足表3 MDL模板补充约束条件。表2TCubeTiling约束条件| 约束条件 | 说明 | | --- | --- | | usedCoreNum aiCoreCnt | 使用核数小于等于当前AI处理器的最大核数 | | baseM * baseK * sizeof(A_type) * dbL0A l0a_size | A矩阵base块不超过l0a buffer大小 | | baseN * baseK * sizeof(B_type) * dbL0B l0b_size | B矩阵base块不超过l0b buffer大小 | | baseM * baseN * sizeof(l0c_type) * dbL0C l0c_size其中l0c_type为int32_t或者float数据类型。 | C矩阵base块不超过l0c buffer大小 | | baseN * sizeof(Bias_type) biasT_size | Bias的base块不超过BiasTable buffer大小 | | stepM * stepKa * db depthA1db这里表示为左矩阵MTE2是否开启double buffer即L1是否开启double buffer取值1不开启double buffer或2开启double buffer | depthA1的取值与stepM * stepKa * db相同 | | stepN * stepKb * db depthB1db这里表示为右矩阵MTE2是否开启double buffer即L1是否开启double buffer取值1不开启double buffer或2开启double buffer | depthB1的取值与stepN * stepKb * db相同 | | 对于A矩阵在L1上的缓存块大小AL1Size、B矩阵在L1上的缓存块大小BL1Size必须满足无bias场景AL1Size BL1Size L1_size有bias场景AL1Size BL1Size baseN * sizeof(Bias_type) L1_size其中AL1Size、BL1Size的计算方式如下转置场景AL1Size CeilDiv(baseM, C0_size) * baseK * depthA1 * sizeof(A_type)BL1Size baseN * baseK * depthB1 * sizeof(B_type)非转置场景AL1Size baseM * baseK * depthA1 * sizeof(A_type)BL1Size CeilDiv(baseN, C0_size)* baseK * depthB1 * sizeof(B_type) | A矩阵、B矩阵和Bias在L1缓存块满足L1 buffer大小限制注意float数据类型的C0_size为8half/bfloat16_t数据类型的C0_size为16int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64。 | | baseM * baseK, baseK * baseN和baseM * baseN按照NZ格式的分形对齐 | A矩阵、B矩阵、C矩阵的base块需要满足对齐约束baseM和baseN需要以16个元素对齐A矩阵非转置且B矩阵转置场景baseK需要以C0_size对齐其余场景A矩阵转置或B矩阵非转置场景baseK以16个元素对齐注意float/int32_t数据类型的C0_size为8half/bfloat16_t数据类型的C0_size为16int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64。 | | MxMatmul场景如果A与B矩阵的位置同时为GM对singleCoreK没有特殊限制在这种情况下若scaleA和scaleB的K方向大小即Ceil(singleCoreK, 32)为奇数用户需自行在scaleA和scaleB的K方向补0至偶数对于其它A、B矩阵逻辑位置的组合情况即A与B矩阵的位置不同时为GMsingleCoreK以32个元素向上对齐后的数值必须是32的偶数倍输入数据类型为fp4x2_e2m1_t/fp4x2_e1m2_t时内轴必须为偶数。 | scaleA/scaleB的数据类型是fp8_e8m0_tK方向必须2字节连续scaleA/scaleB的K方向是A/B矩阵K的1/32A与B矩阵的位置不同时为GM时singleCoreK以32个元素向上对齐后的数值必须是32的偶数倍。在MxMatmul场景输入数据类型为fp4x2_e2m1_t/fp4x2_e1m2_t计算时的最小单元为8字节需要将2个4字节的元素拼成一个8字节进行计算内轴必须为偶数。 |表3MDL模板补充约束条件| 约束条件 | 说明 | | --- | --- | | Ka不全载时即Ka / baseK stepKastepM 1 | K方向非全载时M方向只能逐块搬运 | | Kb不全载时即Kb / baseK stepKbstepN 1 | K方向非全载时N方向只能逐块搬运 | | kaStepIter_ % kbStepIter_ 0或者kbStepIter_ % kaStepIter_ 0kaStepIter_ CeilDiv(tiling_-singleCoreK_, tiling_-baseK * tiling_-stepKa)kbStepIter_ CeilDiv(tiling_-singleCoreK_, tiling_-baseK * tiling_-stepKb) | MDL模板K方向循环搬运要求Ka和Kb方向迭代次数为倍数关系kaStepIter_Ka方向循环搬运迭代次数kbStepIter_Kb方向循环搬运迭代次数 |性能调优推荐取值根据Tiling调优经验部分TCubeTiling参数值或取值方式推荐如下base块推荐(baseM, baseN, baseK)(128, 256, 64)dbL0A / dbL0B 2depthA1 / (stepM * stepKa) 2depthB1 / (stepN * stepKb) 2优先设置参数stepKa/stepKb使得K方向全载再考虑M方向或N方向全载【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考