CANN/asc-devkit核内同步能力概述
核内同步能力概述
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
为什么需要核内同步
AI Core内部的执行单元(如MTE2搬运单元、Vector计算单元等)以异步并行的方式运行,在读写同一存储资源时可能存在数据依赖关系。为确保数据一致性及计算正确性,需通过同步控制协调操作时序。
针对NPU架构2201,硬件架构图如下,高亮部分展示了并行执行的计算单元和搬运单元。
图 1架构图

针对NPU架构3510,硬件架构图如下,高亮部分展示了并行执行的计算单元和搬运单元。
图 2架构图

下图示例描述了一个常见的Vector计算数据流:
- 先通过DMA执行单元将数据从Global Memory搬入到Local Memory;
- 进行计算;
- 然后再通过DMA执行单元将计算结果从Local Memory搬出到Global Memory。

四个执行单元Scalar、Vector、DMA(MTE2)、DMA(MTE3)并行执行,若访问同一片Local Memory,需要同步机制来控制它们的访问时序:保证先搬入Local Memory后再计算,计算完成后再搬出。

硬件流水类型
AI Core内部并行的指令流水类型和解释如下所示:
[!NOTE]说明 不同的硬件架构,每一种硬件流水类型包含的具体流水会有所差异,详细介绍请参考硬件实现章节。
表1指令流水类型和相关说明
| 流水类型 | 含义 |
|---|---|
| PIPE_S | 标量流水线,使用GlobalTensor/LocalTensor的GetValue函数时为此流水 |
| PIPE_V | 矢量计算流水及部分硬件架构下的L0C Buffer->UB数据搬运流水 |
| PIPE_M | 矩阵计算流水 |
| PIPE_MTE1 | L1 Buffer ->L0A Buffer、L1 Buffer->L0B Buffer数据搬运流水 |
| PIPE_MTE2 | GM->L1 Buffer、GM->UB等数据搬运流水 |
| PIPE_MTE3 | UB->GM等数据搬运流水 |
| PIPE_FIX | L0C Buffer->GM、L0C Buffer ->L1等数据搬运流水 |
核内同步分类
对上述核内并行流水的同步控制分为两种:
多流水同步:同一核内具有数据依赖的不同类型流水指令之间的同步。 TQueSync类接口和SetFlag/WaitFlag(ISASI).md)中提供的同步控制接口的区别在于,SetFlag/WaitFlag(ISASI).md)中的接口标注为ISASI类别,不能保证跨硬件版本兼容;TQueSync类接口可以保证跨硬件版本兼容。 通过SetFlag/WaitFlag接口进行不同流水线间的同步控制。在SetFlag/WaitFlag的指令中,可以指定一对指令流水(源流水与目的流水)先后执行的关系,表示两个指令流水之间完成一组“锁”机制,其作用原理为:
- SetFlag:当源流水的前序指令的所有读写操作都完成之后,当前指令开始执行,并将硬件中的对应标志位设置为1。
- WaitFlag:当目的流水执行到该指令时,如果发现硬件中对应标志位为0,目的流水的后续指令将一直被阻塞;如果发现硬件中对应标志位为1,则将硬件中对应标志位设置为0,同时目的流水的后续指令开始执行。
Ascend 950PR/Ascend 950DT新增通过Lock/Lock.md)/Unlock/Unlock.md)接口进行不同流水线间的同步控制。通过Lock锁定指定流水(阻塞后续指令),再通过Unlock释放流水,来完成流水间的同步依赖。
- Lock:根据MutexID获取Mutex,若Mutex已被锁定,将阻塞后续指定流水指令队列,直到前序指令中对应MutexID的Mutex被Unlock。
- Unlock:当前流水的前置指令退出后,根据MutexID释放对应Mutex。
单流水同步:同一核内具有数据依赖的相同类型流水指令之间的同步。
- 通过PipeBarrier.md)接口进行相同流水线间的同步控制。同一流水中虽然指令是顺序执行,但并不意味着后一条指令开始执行时前一条指令执行结束。PipeBarrier指令可以保证前序指令中所有数据读写全部完成,后序指令才开始执行。注意该接口不支持PIPE_S单流水的同步。
以NPU架构2201为例,该硬件架构下所有合法的核内同步组合如表2和表3所示。其中,"不涉及"表示硬件层面不存在此种同步组合,"暂无应用场景"表示存在此种同步组合,但在实际开发场景中暂不需要使用。
表2AIC中所有合法的核内同步组合
| 源流水 | PIPE_S | PIPE_M | PIPE_MTE1 | PIPE_MTE2 | PIPE_MTE3 | PIPE_FIX |
|---|---|---|---|---|---|---|
| PIPE_S | 不涉及 | 不涉及 | 不涉及 | 不涉及 | 不涉及 | 不涉及 |
| PIPE_M | 不涉及 | PipeBarrier<PIPE_M>() | SetFlag<M_MTE1>(0) WaitFlag<M_MTE1>(0) | SetFlag<M_MTE2>(0) WaitFlag<M_MTE2>(0) | 不涉及 | SetFlag<M_FIX>(0) WaitFlag<M_FIX>(0) |
| PIPE_MTE1 | 不涉及 | SetFlag<MTE1_M>(0) WaitFlag<MTE1_M>(0) | PipeBarrier<PIPE_MTE1>() | SetFlag<MTE1_MTE2>(0) WaitFlag<MTE1_MTE2>(0) | SetFlag<MTE1_MTE3>(0) WaitFlag<MTE1_MTE3>(0) | SetFlag<MTE1_FIX>(0) WaitFlag<MTE1_FIX>(0) |
| PIPE_MTE2 | 不涉及 | SetFlag<MTE2_M>(0) WaitFlag<MTE2_M>(0) | SetFlag<MTE2_MTE1>(0) WaitFlag<MTE2_MTE1>(0) | PipeBarrier<PIPE_MTE2>() | SetFlag<MTE2_MTE3>(0) WaitFlag<MTE2_MTE3>(0) | 暂无应用场景 |
| PIPE_MTE3 | 不涉及 | 不涉及 | SetFlag<MTE3_MTE1>(0) WaitFlag<MTE3_MTE1>(0) | SetFlag<MTE3_MTE2>(0) WaitFlag<MTE3_MTE2>(0) | PipeBarrier<PIPE_MTE3>() | 暂无应用场景 |
| PIPE_FIX | 不涉及 | SetFlag<FIX_M>(0) WaitFlag<FIX_M>(0) | SetFlag<FIX_MTE1>(0) WaitFlag<FIX_MTE1>(0) | 暂无应用场景 | 暂无应用场景 | PipeBarrier<PIPE_FIX>() |
表3AIV中所有合法的核内同步组合
| 源流水 | PIPE_S | PIPE_V | PIPE_MTE2 | PIPE_MTE3 |
|---|---|---|---|---|
| PIPE_S | 不涉及 | SetFlag<S_V>(0) WaitFlag<S_V>(0) | SetFlag<S_MTE2>(0) WaitFlag<S_MTE2>(0) | SetFlag<S_MTE3>(0) WaitFlag<S_MTE3>(0) |
| PIPE_V | SetFlag<V_S>(0) WaitFlag<V_S>(0) | PipeBarrier<PIPE_V>() | SetFlag<V_MTE2>(0) WaitFlag<V_MTE2>(0) | SetFlag<V_MTE3>(0) WaitFlag<V_MTE3>(0) |
| PIPE_MTE2 | SetFlag<MTE2_S>(0) WaitFlag<MTE2_S>(0) | SetFlag<MTE2_V>(0) WaitFlag<MTE2_V>(0) | PipeBarrier<PIPE_MTE2>() | SetFlag<MTE2_MTE3>(0) WaitFlag<MTE2_MTE3>(0) |
| PIPE_MTE3 | SetFlag<MTE3_S>(0) WaitFlag<MTE3_S>(0) | SetFlag<MTE3_V>(0) WaitFlag<MTE3_V>(0) | SetFlag<MTE3_MTE2>(0) WaitFlag<MTE3_MTE2>(0) | PipeBarrier<PIPE_MTE3>() |
什么时候需要开发者手动插入同步
TPipe-TQue框架编程范式和毕昇编译器均支持自动同步,可减少开发者手动插入同步的工作量,但部分场景下仍需开发者手动完成。详细说明请参考自动同步。
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
