Skip to content

TCubeTiling结构体

TCubeTiling结构体包含Matmul Tiling切分算法的相关参数,被传递给Matmul Kernel侧,用于Matmul的切块、搬运和计算过程等。TCubeTiling结构体的参数说明见表1

表1 TCubeTiling结构说明

参数名称数据类型说明
usedCoreNumint使用的AI处理器核数,请根据实际情况设置。取值范围为:[1, AI处理器最大核数]。该参数与shape相关参数的关系为:usedCoreNum = (M / singleCoreM) * (N / singleCoreN)。
M, N, Ka, KbintA、B、C矩阵原始输入的shape大小,以元素为单位。M, Ka为A矩阵原始输入的Shape,Kb, 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为8,half/bfloat16_t数据类型的C0_size为16,int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32,int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64。
singleCoreM, singleCoreN, singleCoreKintA、B、C矩阵单核内shape大小,以元素为单位。该参数取值必须大于0。

singleCoreK = K,多核处理时不对K进行切分;singleCoreM <= M;singleCoreN <= N。

注意:若A矩阵以NZ格式输入,则singleCoreM需要以16个元素对齐,singleCoreK需要以C0_size对齐;若B矩阵以NZ格式输入,则singleCoreK需要以C0_size对齐,singleCoreN需要以16个元素对齐。
baseM, baseN, baseKintA、B、C矩阵参与一次矩阵乘指令的shape大小,以元素为单位。

A、B、C矩阵参与一次矩阵乘的shape大小需要按分形对齐,其含义请参考Mmad中的数据格式说明。

注意:该参数取值必须大于0。MxMatmul场景,baseK必须为64的倍数。
depthA1, depthB1intdepthA1、depthB1分别表示L1 Buffer(A1)、L1 Buffer(B1)中全载基本块的份数,depthA1为L1 Buffer(A1)中全载baseM * baseK的份数,depthB1为L1 Buffer(B1)中全载baseN * baseK的份数。

注意:该参数取值必须大于0。
stepM, stepN,stepKa,stepKbintstepM为左矩阵在L1 Buffer(A1)中缓存的buffer M方向上baseM的倍数。

stepN为右矩阵在L1 Buffer(B1)中缓存的buffer N方向上baseN的倍数。

stepKa为左矩阵在L1 Buffer(A1)中缓存的buffer Ka方向上baseK的倍数。

stepKb为右矩阵在L1 Buffer(B1)中缓存的buffer Kb方向上baseK的倍数。

注意:该参数取值必须大于0。
isBiasint是否启用Bias,参数取值如下:
0:不启用Bias(默认值)。1:启用Bias。

注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。
transLengthintmax(A1Length, B1Length, C1Length, BiasLength)。其中,A1Length, B1Length, C1Length, BiasLength分别表示A/B/C/Bias矩阵在计算过程中需要临时占用的UB空间大小。
iterateOrderint一次Iterate计算出[baseM, baseN]大小的C矩阵分片,Iterate完成后,Matmul会自动偏移下一次Iterate输出的C矩阵位置,iterOrder表示自动偏移的顺序。参数取值如下:
0:先往M轴方向偏移再往N轴方向偏移。1:先往N轴方向偏移再往M轴方向偏移。

注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。
dbL0A, dbL0B,

dbL0C
intMTE1是否开启double buffer。

dbL0A:左矩阵MTE1是否开启double buffer;dbL0B:右矩阵MTE1是否开启double buffer;dbL0C:MMAD是否开启double buffer。参数取值如下:
1:不开启double buffer。2:开启double buffer。

注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。
shareModeint该参数预留,开发者无需关注。
shareL1Sizeint该参数预留,开发者无需关注。
shareL0CSizeint该参数预留,开发者无需关注。
shareUbSizeint该参数预留,开发者无需关注。
batchMint该参数预留,开发者无需关注。
batchNint该参数预留,开发者无需关注。
singleBatchMint该参数预留,开发者无需关注。
singleBatchNint该参数预留,开发者无需关注。
mxTypeParaint组合参数,在MxMatmul场景使用,表示scaleA/scaleB载入L1的大小与A/B矩阵载入L1大小的倍数,具体如下:
0~6bit表示scaleA与A矩阵在K方向载入数据量的比例系数,scaleFactorKa,即scaleFactorKa=scaleA在K方向载入数据量/A矩阵在K方向载入数据量,数据范围为[1, 127];
8~14bit表示scaleB与B矩阵在K方向载入数据量的比例系数,scaleFactorKb,即scaleFactorKb=scaleB在K方向载入数据量/B矩阵在K方向载入数据量,数据范围为[1, 127];
16~22bit表示scaleA与A矩阵在M方向载入数据量的比例系数,scaleFactorM,即scaleFactorM=scaleA在M方向载入数据量/A矩阵在M方向载入数据量,数据范围为[1, 127];
24~30bit表示scaleB与B矩阵在N方向载入数据量的比例系数,scaleFactorN,即scaleFactorN=scaleB在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模板补充约束条件

    表2 TCubeTiling约束条件

    约束条件说明
    usedCoreNum <= aiCoreCnt使用核数小于等于当前AI处理器的最大核数
    baseM * baseK * sizeof(A_type) * dbL0A< l0a_sizeA矩阵base块不超过l0a buffer大小
    baseN * baseK * sizeof(B_type) * dbL0B < l0b_sizeB矩阵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_sizeBias的base块不超过BiasTable buffer大小
    stepM * stepKa * db = depthA1

    db这里表示为左矩阵MTE2是否开启double buffer,即L1是否开启double buffer,取值1(不开启double buffer)或2(开启double buffer)
    depthA1的取值与stepM * stepKa * db相同
    stepN * stepKb * db = depthB1

    db这里表示为右矩阵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为8,half/bfloat16_t数据类型的C0_size为16,int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32,int4b_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为8,half/bfloat16_t数据类型的C0_size为16,int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32,int4b_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矩阵的位置不同时为GM,singleCoreK以32个元素向上对齐后的数值必须是32的偶数倍;

    输入数据类型为fp4x2_e2m1_t/fp4x2_e1m2_t时,内轴必须为偶数。
    scaleA/scaleB的数据类型是fp8_e8m0_t,K方向必须2字节连续,scaleA/scaleB的K方向是A/B矩阵K的1/32;A与B矩阵的位置不同时为GM时,singleCoreK以32个元素向上对齐后的数值,必须是32的偶数倍。

    在MxMatmul场景,输入数据类型为fp4x2_e2m1_t/fp4x2_e1m2_t,计算时的最小单元为8字节,需要将2个4字节的元素拼成一个8字节进行计算,内轴必须为偶数。

    表3 MDL模板补充约束条件

    约束条件说明
    Ka不全载时,即Ka / baseK > stepKa,stepM = 1K方向非全载时,M方向只能逐块搬运
    Kb不全载时,即Kb / baseK > stepKb,stepN = 1K方向非全载时,N方向只能逐块搬运
    kaStepIter_ % kbStepIter_ = 0或者kbStepIter_ % kaStepIter_ = 0

    kaStepIter_ = 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 = 2
    • depthA1 / (stepM * stepKa) = 2
    • depthB1 / (stepN * stepKb) = 2
    • 优先设置参数stepKa/stepKb,使得K方向全载,再考虑M方向或N方向全载

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区