当同一个CubeResGroupHandle中的两个AIV任务之间存在依赖关系时,可以使用GroupBarrier控制同步。假设一组AIV A做完任务x以后,另外一组AIV B才可以开始后续业务,称AIV A组为Arrive组,AIV B组为Wait组。
基于GroupBarrier的组同步使用步骤:
- 创建GroupBarrier。
- 调用Arrive。
- 调用Wait。
- 创建GroupBarrier。
| // 用户自行管理并对这部分workspace清零
AscendC::GroupBarrier<AscendC::PipeMode::MTE3_MODE> barA(workspace, 3, 6); //创建GroupBarrier
|
- 调用Arrive。
| // 用户自行管理并清零这部分workspace, 3个AIV需要进行Arrive, 6个AIV需要Wait。
AscendC::GroupBarrier<AscendC::PipeMode::MTE3_MODE> barA(workspace, 3, 6); //创建GroupBarrier
if (AscendC::GetBlockIdx() < 3) {
//各种Vector计算逻辑,用户自行实现
barA.Arrive(AscendC::GetBlockIdx());
}
|
- 调用Wait。
| AscendC::GroupBarrier<AscendC::PipeMode::MTE3_MODE> barA(workspace, 3, 6); //创建GroupBarrier
auto id = AscendC::GetBlockIdx();
if (id < 3) {
//各种Vector计算逻辑,用户自行实现
barA.Arrive(id);
} else(id >= 3 && id < 6){
barA.Wait(id - 3);
// 各种Vector计算逻辑,用户自行实现
}
|