Matmul的Iterate和IterateAll接口提供了同步和异步两种模式。
同步模式指的是程序执行时,需要等待某个操作完成后才能继续执行下一步操作。 异步模式指的是程序执行时,不需要等待某个操作完成就可以继续执行下一步操作。
如下图所示,C矩阵中,矩阵块1搬走后,才能计算矩阵块2,阵块2搬运完成后,才能计算矩阵块3。
同步模式的样例代码如下
while (mm. Iterate ()) { mm. GetTensorC (gm_c); }
mm.SetWorkspace(workspace, size); // 其中,workspace 为临时空间的物理地址,size为singleCoreM * singleCoreN大小的矩阵C占用的内存大小: singleCoreM * singleCoreN * sizeof(cDataType) // 异步模式 mm.template Iterate<false>(); …… // 执行其他操作 for (int i = 0; i < singleCoreM/baseM*singleCoreN/baseN; ++i) { mm.GetTensorC<false> (gm_c); }
mm.SetTensorA(gm_a); // 设置左矩阵A mm.SetTensorB(gm_b); // 设置右矩阵B mm.SetBias(gm_bias); // 设置Bias mm.IterateAll(gm_c); // 后续操作 ...
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],false,true); // do some others compute mm.WaitIterateAll(); // 等待IterateAll完成 DataCopy(dstUB, GM); // 进行GM到UB的拷贝