当前位置: 首页 > news >正文

CANN/asc-devkit核内同步能力概述

核内同步能力概述

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

为什么需要核内同步

AI Core内部的执行单元(如MTE2搬运单元、Vector计算单元等)以异步并行的方式运行,在读写同一存储资源时可能存在数据依赖关系。为确保数据一致性及计算正确性,需通过同步控制协调操作时序。

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

图 1架构图
![](https://raw.gitcode.com/cann/asc-devkit/raw/fca368efb52629b09a323752901d0e77214b266d/docs/zh/api/figures/atlas_a2_a3_architecture.png "Atlas_A2_A3_硬件架构图"?utm_source=gitcode_repo_files)

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

图 2架构图
![](https://raw.gitcode.com/cann/asc-devkit/raw/fca368efb52629b09a323752901d0e77214b266d/docs/zh/api/figures/ascend_950pr_950dt_architecture.png "Ascend_950PR_950DT_硬件架构图"?utm_source=gitcode_repo_files)

下图示例描述了一个常见的Vector计算数据流:

  1. 先通过DMA执行单元将数据从Global Memory搬入到Local Memory;
  2. 进行计算;
  3. 然后再通过DMA执行单元将计算结果从Local Memory搬出到Global Memory。

![](https://raw.gitcode.com/cann/asc-devkit/raw/fca368efb52629b09a323752901d0e77214b266d/docs/zh/api/figures/vector_compute_data_flow.png "Vector_计算_数据流示意图"?utm_source=gitcode_repo_files)

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

![](https://raw.gitcode.com/cann/asc-devkit/raw/fca368efb52629b09a323752901d0e77214b266d/docs/zh/api/figures/intra_core_parallel_pipeline_execution_timing.png "intra_core_parallel_pipeline_execution_timing"?utm_source=gitcode_repo_files)

硬件流水类型

AI Core内部并行的指令流水类型和解释如下所示:

[!NOTE]说明 不同的硬件架构,每一种硬件流水类型包含的具体流水会有所差异,详细介绍请参考硬件实现章节。

表1指令流水类型和相关说明

流水类型含义
PIPE_S标量流水线,使用GlobalTensor/LocalTensor的GetValue函数时为此流水
PIPE_V矢量计算流水及部分硬件架构下的L0C Buffer->UB数据搬运流水
PIPE_M矩阵计算流水
PIPE_MTE1L1 Buffer ->L0A Buffer、L1 Buffer->L0B Buffer数据搬运流水
PIPE_MTE2GM->L1 Buffer、GM->UB等数据搬运流水
PIPE_MTE3UB->GM等数据搬运流水
PIPE_FIXL0C 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_SPIPE_MPIPE_MTE1PIPE_MTE2PIPE_MTE3PIPE_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_SPIPE_VPIPE_MTE2PIPE_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_VSetFlag<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_MTE2SetFlag<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_MTE3SetFlag<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),仅供参考

http://www.jsqmd.com/news/1202674/

相关文章:

  • 上海上门快的中央空调维修维修电话推荐 - 信誉隆金银铂奢回收
  • GPT-5.6 Sol技术解析:AI辅助开发的新突破与实践指南
  • DNABERT-2终极指南:3分钟掌握基因组深度学习的完整解决方案
  • 计算机组成原理实验:微程序控制器时序与微指令编码实战解析
  • 度假村维修工老油条难管:北京华恒智信破解成功案例
  • C语言从零基础到精通:清华教学体系+100集实战教程
  • 嵌入式开发中的状态机:从原理到三段式实践
  • 2026十大AI数字人直播系统排行榜|晟诺科讯达登顶全链路性价比标杆
  • 【单片机毕业设计】基于 STM32 的红外测温与蓝牙监测系统设计与实现,基于 STM32 单片机的智能红外测温预警终端及 Android APP 开发(014702)
  • React Komposer 测试与调试:使用 react-stubber 进行组件测试的终极指南
  • 2026年7月最新亨得利官方服务项目及价格查询|维修地址与客服热线权威信息公示 - 亨得利官方
  • 解决Ghost使用难题:常见错误与解决方案大全 [特殊字符]
  • 从零到一:nvm 安装、配置与多版本 Node.js 管理实战
  • UE5高斯泼溅渲染:从零开始构建实时3D场景的完整工作流
  • Word如何(通过样式与分页符)实现章节标题自动换页
  • 【ChatGPT思维导图实战指南】:20年架构师亲授3步生成高结构化、可落地的知识图谱
  • 终极指南:如何在Mac上像控制原生苹果显示器一样调节外接显示器
  • 电源防护电路
  • 大麦抢票终极指南:三步实现演唱会门票自动化购买
  • 房地产国企考核目标过高完不成:北京华恒智信成功案例
  • PCB设计中ESD保护电路的关键技术与实践
  • 上海周边柜机空调维修维修电话推荐 - 信誉隆金银铂奢回收
  • STM32-CAN总线扩展串口能力实战:F407多节点串口设备接入方案
  • 告别YAML配置困扰:Red Hat官方插件让你的开发效率提升3倍
  • 如何彻底解决ExoPlayer跨设备兼容性问题:5大高效策略指南
  • 从嵌入式到云端:wolfSSL现代TLS/SSL安全通信架构深度解析
  • MetricFlow 0.207.2版本发布:5大技术架构革新如何重塑你的指标工作流?
  • PDF补丁丁完整指南:免费解决PDF编辑难题的终极工具
  • 【Bug已解决】RuntimeError: CUDA error: unknown error 通用未知错误(上下文丢失:多进程冲突) 解决方案
  • 【数据结构·考研】左孩子右兄弟:解锁树与二叉树转换的算法密码