TCubeTiling结构体
TCubeTiling结构体包含Matmul Tiling切分算法的相关参数,被传递给Matmul Kernel侧,用于Matmul的切块、搬运和计算过程等。TCubeTiling结构体的参数说明见表1。
|
参数名称 |
数据类型 |
说明 |
|---|---|---|
|
usedCoreNum |
int |
使用的AI处理器核数,请根据实际情况设置。取值范围为:[1, AI处理器最大核数]。该参数与shape相关参数的关系为:usedCoreNum = (M / singleCoreM) * (N / singleCoreN)。 |
|
M, N, Ka, Kb |
int |
A、B、C矩阵原始输入的shape大小,以元素为单位。M, Ka为A矩阵原始输入的Shape,Kb, N为B矩阵原始输入的Shape。
|
|
int |
A、B、C矩阵单核内shape大小,以元素为单位。该参数取值必须大于0。 singleCoreK = K,多核处理时不对K进行切分;singleCoreM <= M;singleCoreN <= N。 注意:若A矩阵以NZ格式输入,则singleCoreM需要以16个元素对齐,singleCoreK需要以C0_size * fractal_num对齐;若B矩阵以NZ格式输入,则singleCoreK需要以C0_size * fractal_num对齐,singleCoreN需要以16个元素对齐。 NZ格式的输入,half/bfloat16_t数据类型的C0_size为16,fractal_num为1,float数据类型的C0_size为8,fractal_num为2,int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32,fractal_num为1,int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64,fractal_num为1。其中,fractal_num表示为满足计算中的对齐要求需要的C0_size个数。 |
|
|
int |
A、B、C矩阵参与一次矩阵乘指令的shape大小,以元素为单位。 A、B、C矩阵参与一次矩阵乘的shape大小需要按分形对齐,其含义请参考Mmad中的数据格式说明。 |
|
|
int |
A1、B1中全载基本块的份数,depthA1为A1中全载baseM * baseK的份数,depthB1为B1中全载baseN * baseK的份数。 注意:该参数取值必须大于0。 |
|
|
int |
stepM为左矩阵在A1中缓存的buffer M方向上baseM的倍数。 stepN为右矩阵在B1中缓存的buffer N方向上baseN的倍数。 stepKa为左矩阵在A1中缓存的buffer Ka方向上baseK的倍数。 stepKb为右矩阵在B1中缓存的buffer Kb方向上baseK的倍数。 注意:该参数取值必须大于0。 |
|
|
int |
是否使能Bias,参数取值如下:
注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
|
|
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表示自动偏移的顺序。参数取值如下:
注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
|
dbL0A, dbL0B, dbL0C |
int |
MTE1是否开启double buffer。 dbL0A:左矩阵MTE1是否开启double buffer;dbL0B:右矩阵MTE1是否开启double buffer;dbL0C:MMAD是否开启double buffer。参数取值如下:
注意:该参数不支持除上述外的其他取值,设置为其他值时参数行为未定义。 |
|
shareMode |
int |
该参数预留,开发者无需关注。 |
|
shareL1Size |
int |
该参数预留,开发者无需关注。 |
|
shareL0CSize |
int |
该参数预留,开发者无需关注。 |
|
shareUbSize |
int |
该参数预留,开发者无需关注。 |
|
batchM |
int |
该参数预留,开发者无需关注。 |
|
batchN |
int |
该参数预留,开发者无需关注。 |
|
singleBatchM |
int |
该参数预留,开发者无需关注。 |
|
singleBatchN |
int |
该参数预留,开发者无需关注。 |
|
mxTypePara |
int |
该参数仅支持Atlas 350 加速卡。 组合参数,在MxMatmul场景使用 ,表示scaleA/scaleB载入L1的大小与A/B矩阵载入L1大小的倍数,具体如下:
注意:
|
多数情况下,用户通过调用GetTiling接口获取TCubeTiling结构体,具体流程请参考使用说明。如果用户自定义TCubeTiling参数,各个参数的取值需要满足表1和表2中的对应参数的约束条件。如果用户通过调用GetTiling接口获取TCubeTiling结构体后,需要修改调整Tiling,请参考如下TCubeTiling参数约束和性能调优推荐取值,进行参数的设置。
- TCubeTiling参数约束
一组合法的TCubeTiling参数需要同时满足表2中的所有约束条件。若Matmul对象的MatmulConfig模板为MDL模板,除表2外,还同时需要满足表3 MDL模板补充约束条件。
表3 MDL模板补充约束条件 约束条件
说明
Ka不全载时,即Ka / baseK > stepKa,stepM = 1
K方向非全载时,M方向只能逐块搬运
Kb不全载时,即Kb / baseK > stepKb,stepN = 1
K方向非全载时,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方向全载