单次矩阵乘局部输出

功能介绍

单次矩阵乘局部输出,又称Partial Output。如基础知识中所述,一次Iterate计算过程中,会按K方向进行一次或多次基本块计算,其中的一次基本块计算为baseM*baseK和baseK*baseN大小的输入数据进行计算得到baseM*baseN大小的结果;每次基本块计算的结果进行累加后,便得到baseM*singleCoreK和singleCoreK*baseN大小的输入数据计算得到的结果baseM*baseN,并将其作为一次Iterate的最终结果输出。

开启Partial Output功能后,调用Iterate接口不会进行K轴累加,只进行单次基本块计算。用户可以通过GetTensorC接口获取对应的单片数据,最后自行进行K轴上的累加。

图1 未开启Partial Output功能计算示意图
图2 开启Partial Output功能计算示意图

使用场景

矩阵乘计算结果不需要累加,只需要输出baseM*baseK和baseK*baseN的计算结果baseM*baseN。例如需要先获取单次基本块计算的数据进行反量化,再累加得到最终结果。

约束说明

调用示例

完整的算子样例请参考开启Partial Output功能的算子样例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 配置MDL模板,使能Partial Output
constexpr static MatmulConfigMode configMode = MatmulConfigMode::CONFIG_MDL;
constexpr static MatmulFuncParams funcParams = {
  false, false, false, false, 0, IterateOrder::UNDEF, ScheduleType::INNER_PRODUCT, true, true,
  true /* isPartialOutput */
};
constexpr static MatmulConfig CFG_PARTIAL = GetMMConfig<configMode>(funcParams);
Matmul<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, CFG_PARTIAL> mm;
REGIST_MATMUL_OBJ(&pipe, GetSysWorkSpacePtr(), mm);
mm.Init(&tiling);
mm.SetTensorA(gmA, isTransposeA);
mm.SetTensorB(gmB, isTransposeB);
while (mm.Iterate()) {
    mm.GetTensorC(tmpGmC[dstOffset], false, true);
    dstOffset += baseM * baseN;
    // 其他操作
}