【优先级】高
【描述】在MIX场景,即AIC(AI Cube核)和AIV(AI Vector核)混合编程中,调用Matmul Iterate或者IterateAll时,AIV发送消息到AIC启动Matmul计算。若通过Iterate<sync=true>同步方式,如图1 同步方式消息发送示意图,每次调用都会触发一次消息发送,而通过Iterate<sync=false>异步方式,如图2 异步方式消息发送示意图,仅第一次需要发送消息,后续无需发送消息,从而减少Cube与Vector核间交互,减少核间通信开销。因此,MIX场景推荐使用Iterate<false>或者IterateAll<false>异步接口(注意:使用异步接口时需要设置Workspace)。
【反例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | TQueBind<TPosition::CO2, TPosition::VECIN> qVecIn; TQueBind<TPosition::VECIN, TPosition::VECOUT> qVecOut; mm.SetTensorA(gmA); mm.SetTensorB(gmB); int16_t scalar = 2; while(mm.template Iterate()){ auto cInUB = qVecIn.AllocTensor<float>(); mm.GetTensorC(cInUB); qVecIn.EnQue(cInUB); cInUB = qVecIn.Deque<float>(); auto cOutUB = qVecOut.AllocTensor<float>(); Muls(cOutUB, cInUB, scalar, baseM*baseN); qVecIn.FreeTensor(cInUB); ... } |
【正例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | TQueBind<TPosition::CO2, TPosition::VECIN> qVecIn; TQueBind<TPosition::VECIN, TPosition::VECOUT> qVecOut; mm.SetTensorA(gmA); mm.SetTensorB(gmB); mm.SetWorkspace(workspace, size);//其中,workspace为临时空间的物理地址,size为singleCoreM*singleCoreN大小的矩阵C占用的内存大小:singleCoreM*singleCoreN*sizeof(float) int16_t scalar = 2; while(mm.template Iterate<false>()){ auto cInUB = qVecIn.AllocTensor<float>(); mm.GetTensorC(cInUB); qVecIn.EnQue(cInUB); cInUB = qVecIn.Deque<float>(); auto cOutUB = qVecOut.AllocTensor<float>(); Muls(cOutUB, cInUB, scalar, baseM*baseN); qVecIn.FreeTensor(cInUB); ... } |