使用说明
当同一个CubeResGroupHandle中的两个AIV任务之间存在依赖关系时,可以使用GroupBarrier控制同步。假设一组AIV A做完任务x以后,另外一组AIV B才可以开始后续业务,称AIV A组为Arrive组,AIV B组为Wait组。
基于GroupBarrier的组同步使用步骤:
- 创建GroupBarrier。
- 调用Arrive。
- 调用Wait。
- 创建GroupBarrier。
1 2
// 用户自行管理并对这部分workspace清零 AscendC::GroupBarrier<AscendC::PipeMode::MTE3_MODE> barA(workspace, 3, 6); //创建GroupBarrier
- 调用Arrive。
1 2 3 4 5 6
// 用户自行管理并清零这部分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。
1 2 3 4 5 6 7 8 9
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计算逻辑,用户自行实现 }
父主题: GroupBarrier