PipeBarrier(ISASI)
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 200I/500 A2 推理产品:支持
- Atlas 推理系列产品AI Core:支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:支持
- Kirin X90:支持
- Kirin 9030:支持
功能说明
头文件路径为:"basic_api/kernel_operator_block_sync_intf.h"。
如下图1所示,完成同一流水线内的同步控制,用于在同一流水线内部约束执行顺序。其作用是,保证前序指令中所有数据的读写工作全部完成,后序指令才能执行。
图1 PipeBarrier接口功能示意图
函数原型
template <pipe_t pipe>
__aicore__ inline void PipeBarrier()
参数说明
表1 模板参数说明
| 参数名 | 描述 |
|---|---|
| pipe | 模板参数,表示阻塞的流水类别。 支持的流水参考硬件流水类型,其中不支持PIPE_S。 如果不关注流水类别,希望阻塞所有流水,可以传入PIPE_ALL。 |
返回值说明
无
约束说明
Scalar流水之间的同步由硬件自动保证,PipeBarrier接口不支持PIPE_S单流水的同步。
PipeBarrier<PIPE_ALL>()会等待所有流水线中所有先前提交的接口完成,这会对性能产生影响。若仅阻塞单条流水线即可解决问题,应避免随意调用PipeBarrier<PIPE_ALL>()。PIPE_MTE2/PIPE_MTE3在搬运地址有重叠的情况下需要开发者插入同步。例如,当需要执行多个DataCopy指令,且DataCopy的目的地址存在重叠时,需要通过调用来插入PipeBarrier同步指令,保证多个DataCopy指令的串行化,防止出现异常数据。如下图左侧示意图,执行两个DataCopy指令,搬运的目的GM地址存在重叠,两条搬运指令之间需要通过调用
PipeBarrier<PIPE_MTE3>()添加MTE3搬出流水的同步;如下图右侧示意图所示,搬运的目的地址UB存在重叠,两条搬运指令之间需要调用PipeBarrier<PIPE_MTE2>()添加MTE2搬入流水的同步。

调用示例
如下示例,Mul指令的输入dst0Local是Add指令的输出,两个矢量运算指令产生依赖,需要插入PipeBarrier保证两条指令的执行顺序。
注:仅作为示例参考,开启自动同步(Kernel直调算子工程和自定义算子开发工程已默认开启)的情况下,编译器自动插入PIPE_V同步,无需开发者手动插入。
图2 Mul指令和Add指令是串行关系,必须等待Add指令执行完成后,才能执行Mul指令。
AscendC::LocalTensor<half> src0Local;
AscendC::LocalTensor<half> src1Local;
AscendC::LocalTensor<half> src2Local;
AscendC::LocalTensor<half> dst0Local;
AscendC::LocalTensor<half> dst1Local;
AscendC::Add(dst0Local, src0Local, src1Local, 512);
AscendC::PipeBarrier<PIPE_V>();
AscendC::Mul(dst1Local, dst0Local, src2Local, 512);