HOME> 飞镖世界杯> 使能Iterate异步接口避免AIC/AIV同步依赖

使能Iterate异步接口避免AIC/AIV同步依赖

飞镖世界杯 2025-09-22 20:44:44

【优先级】:高

【描述】在AIC(AI Cube核)和AIV(AI Vector核)混合编程中,调用Matmul Iterate或者IterateAll时,AIV发送消息到AIC启动Matmul计算。若通过Iterate同步方式,如图1 同步方式消息发送示意图,每次调用都会触发一次消息发送,而通过Iterate异步方式,如图2,仅第一次需要发送消息,后续无需发送消息,从而减少Cube与Vector核间交互,减少核间通信开销。因此,mix场景推荐使用Iterate或者IterateAll异步接口。

图1 同步方式消息发送示意图

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

【反例】

TQueBind qVecIn;

TQueBind qVecOut;

mm.SetTensorA(gmA);

mm.SetTensorB(gmB);

int16_t scalar = 2;

while(mm.template Iterate()){

auto cInUB = qVecIn.AllocTensor();

mm.GetTensorC(cInUB);

qVecIn.EnQue(cInUB);

cInUB = qVecIn.Deque();

auto cOutUB = qVecOut.AllocTensor();

Muls(cOutUB, cInUB, scalar, baseM*baseN);

qVecIn.FreeTensor(cInUB);

...

}

【正例】

TQueBind qVecIn;

TQueBind 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()){

auto cInUB = qVecIn.AllocTensor();

mm.GetTensorC(cInUB);

qVecIn.EnQue(cInUB);

cInUB = qVecIn.Deque();

auto cOutUB = qVecOut.AllocTensor();

Muls(cOutUB, cInUB, scalar, baseM*baseN);

qVecIn.FreeTensor(cInUB);

...

}

为什么你的4G无线路由器流量消耗太快?这些设置帮你省下一半流量!
淘宝一颗钻多少笔交易?一钻的淘宝店铺值多少钱?