Matmul的Iterate和IterateAll接口在MIX场景(包含矩阵计算和矢量计算)下提供了同步和异步两种模式,纯Cube场景(只有矩阵计算)下,只支持同步模式。
同步模式指的是程序执行时,需要等待某个操作完成后才能继续执行下一步操作。 异步模式指的是程序执行时,不需要等待某个操作完成就可以继续执行下一步操作。
如下图所示,C矩阵中,矩阵块1搬走后,才能计算矩阵块2,矩阵块2搬运完成后,才能计算矩阵块3。
同步模式的样例代码如下
1 2 3 |
while (mm.Iterate()) { mm.GetTensorC(gm_c); } |
1 2 3 4 5 6 7 8 9 |
mm.SetWorkspace(workspace, size); // 其中,workspace为临时空间的物理地址,size为singleCoreM * singleCoreN的矩阵C大小 // 异步模式 mm.template Iterate<false>(); // …… 执行其他操作 auto mIter = Ceil(singleCoreM, baseM); auto nIter = Ceil(singleCoreN, baseN); for (int i = 0; i < mIter * nIter ; ++i) { mm.GetTensorC<false> (gm_c); } |
1 2 3 4 5 6 |
mm.SetTensorA(gm_a); // 设置左矩阵A mm.SetTensorB(gm_b); // 设置右矩阵B mm.SetBias(gm_bias); // 设置Bias mm.IterateAll(gm_c); // 后续操作 ... |
1 2 3 4 5 6 7 8 9 |
AscendC::Matmul<aType, bType, cType, biasType> mm; mm.SetTensorA(queryGm[tensorACoreOffset]); mm.SetTensorB(keyGm[tensorBCoreOffset + sInnerStart * singleProcessSInnerSize * tilingData->attentionScoreOffestStrideParams.matmulHead], true); mm.SetTail(singleProcessSOuterSize, mmNNum); mm.template IterateAll<false>(workspaceGm[tmp_block_idx * mmResUbSize * sInnerLoopTimes],0, false,true); // 执行其他操作 mm.WaitIterateAll(); // 等待IterateAll完成 DataCopy(dstUB, GM); // 进行GM到UB的拷贝 |