使能Iterate异步接口避免AIC/AIV同步依赖
【优先级】:高
【描述】在AIC和AIV混合编程中,调用Matmul Iterate或者IterateAll时,AIV发送消息到AIC启动Matmul计算。若Iterator<sync=true>同步方式,如图1,每次调用都会触发一次消息发送,而通过Iterator<sync=false>异步方式,仅第一次需要发送消息,后续无需发送消息,从而减少Cube与Vector核间交互,减少核间通信开销。
因此,mix场景推荐使用Iterator<false>或者IterateAll<false>异步接口。
图1 同步方式消息发送示意图

图2 异步方式消息发送示意图

【反例】
TQueBind<TPosition::VECOUT, TPosition::A1> qCubeInA1; TQueBind<TPosition::CO2, TPosition::VECIN> qVecIn; auto a1InUB = qCubeInA1.AllocTensor<half>(); mm.SetTensorA(a1InUB); qCubeInA1.FreeTensor(a1InUB); while( qCubeInA1.template Iterator()){ auto cInUB = qVecIn.AllocTensor<float>(); qCubeInA1.GetTensorC(cInUB); qVecIn.EnQue(cInUB); cInUB = qVecIn.Deque<float>(); vector_op(cInUB); ... qVecIn.FreeTensor(cInUB) }
【正例】
TQueBind<TPosition::VECOUT, TPosition::A1> qCubeInA1; TQueBind<TPosition::CO2, TPosition::VECIN> qVecIn; auto a1InUB = qCubeInA1.AllocTensor<half>(); mm.SetTensorA(a1InUB); qCubeInA1.FreeTensor(a1InUB); while( qCubeInA1.template Iterator<false>() ){ auto cInUB = qVecIn.AllocTensor<float>(); qCubeInA1.GetTensorC(cInUB); qVecIn.EnQue(cInUB); cInUB = qVecIn.Deque<float>(); vector_op(cInUB); ... qVecIn.FreeTensor(cInUB) }
父主题: 流水优化