news 2026/7/16 19:19:20

CANN/asc-devkit SIMD核内同步特性说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/asc-devkit SIMD核内同步特性说明

关键特性说明

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

自动同步概述

TPipe-TQue框架编程范式和毕昇编译器均支持自动同步,可减少开发者手动插入同步的工作量,但部分场景下仍需开发者手动完成。本章节将介绍TPipe-TQue框架编程范式和毕昇编译器(后续简称编译器)各自支持的自动同步类型、自动同步使用约束及编译器自动同步debug日志功能。

TPipe-TQue框架编程范式和编译器自动同步支持情况

TPipe-TQue框架编程范式以及编译器对Vector计算单元和Cube计算单元的自动同步支持情况如下:

  • Vector计算单元

    • 单流水同步:PIPE_V由编译器自动完成同步插入,PIPE_MTE2/PIPE_MTE3在搬运地址有重叠的情况下需要开发者插入同步(具体示例请参考约束说明.md))。TPipe-TQue框架编程范式不支持插入单流水同步。
    • 多流水同步:PIPE_V、PIPE_MTE2、PIPE_MTE3、PIPE_S之间的多流水同步,都是双向的,如下图所示,黄色线条表示的同步由编译器自动插入,黑色线条代表的其余同步由TPipe-TQue框架编程范式通过EnQue/DeQue、AllocTensor/FreeTensor等接口自动插入。

      [!CAUTION]注意 例外情况:当标量原子操作接口(包括AtomicAdd、AtomicCas、AtomicExch、AtomicMax、AtomicMin),与搬运单元(MTE2/MTE3)在读写GM时存在数据依赖时,编译器无法自动插入同步,开发者需根据实际情况手动插入同步。

  • Cube计算单元 Cube侧编译器不支持自动插入任何类型的同步。

以NPU架构2201为例,该硬件架构下AIV和AIC中不同流水线的自动同步支持情况分别如表1和表2所示。在TPipe-TQue框架编程范式下,框架能够自动插入部分同步,以解决写后读(WAR,Write‑After‑Read)和读后写(RAW,Read‑After‑Write)两类数据依赖,具体原理参考TPipe-TQue框架数据依赖与同步机制。

表1在TPipe-TQue框架编程范式下,AIV中不同流水线的同步情况

源流水\目的流水PIPE_SPIPE_VPIPE_MTE2PIPE_MTE3
PIPE_S不涉及编译器自动同步编译器自动同步编译器自动同步
PIPE_V编译器自动同步编译器自动插入PipeBarrierTPipe-TQue框架自动同步TPipe-TQue框架自动同步
PIPE_MTE2编译器自动同步TPipe-TQue框架自动同步手动插入PipeBarrierTPipe-TQue框架自动同步
PIPE_MTE3编译器自动同步TPipe-TQue框架自动同步TPipe-TQue框架自动同步手动插入PipeBarrier

表2在TPipe-TQue框架编程范式下,AIC中不同流水线的同步情况

源流水\目的流水PIPE_SPIPE_MPIPE_MTE1PIPE_MTE2PIPE_MTE3PIPE_FIX
PIPE_S不涉及不涉及不涉及不涉及不涉及不涉及
PIPE_M不涉及手动插入PipeBarrierTPipe-TQue框架自动同步TPipe-TQue框架自动同步不涉及TPipe-TQue框架自动同步
PIPE_MTE1不涉及TPipe-TQue框架自动同步手动插入PipeBarrierTPipe-TQue框架自动同步TPipe-TQue框架自动同步TPipe-TQue框架自动同步
PIPE_MTE2不涉及TPipe-TQue框架自动同步TPipe-TQue框架自动同步手动插入PipeBarrierTPipe-TQue框架自动同步暂无应用场景
PIPE_MTE3不涉及不涉及TPipe-TQue框架自动同步TPipe-TQue框架自动同步手动插入PipeBarrier暂无应用场景
PIPE_FIX不涉及TPipe-TQue框架自动同步TPipe-TQue框架自动同步暂无应用场景暂无应用场景手动插入PipeBarrier

自动同步使用约束说明

  • 可通过编译选项"--cce-auto-sync"或"--cce-auto-sync=on"开启编译器自动同步功能,Kernel直调算子工程、自定义算子开发工程以及异构编译 <<<>>> 直调已默认开启该编译选项。如需关闭,开发者可手动设置"--cce-auto-sync=off"。

    [!CAUTION]注意 Ascend C提供了三层梯度化可编程接口,各层级接口对自动同步的支持情况如下:

    • 使用TPipe-TQue框架编程范式时,编译器可自动插入部分同步,具体情况请参考表1。此时,TPipe-TQue框架编程范式本身同样也能自动插入另一部分同步,具体情况参考表1和表2。
    • 使用静态Tensor编程范式时,编译器可自动插入部分同步,具体请参考表1。由于TPipe-TQue框架编程范式与静态Tensor编程范式无法同时使用,除编译器自动插入的同步之外,其余同步需开发者手动管理。
    • 使用基于指针的C语言编程时,无法同时使用TPipe-TQue框架编程范式,另外编译器也不能自动插入同步,因此所有同步都需要由开发者管理,具体情况请参考C API编程同步控制。
  • Kernel函数中调用的所有函数需为inline函数,编译器才能自动插入同步。

  • 正确使用TPipe-TQue框架编程范式才能保证其自动同步功能正常运作。若开发者使用静态Tensor编程范式,TPipe/TQue提供的自动同步功能将失效,需手动插入同步,但不影响编译器支持的自动同步功能。

  • TPipe-TQue框架编程范式不会自动插入单流水同步指令,在搬运地址有重叠的情况下需要开发者手动插入同步,参考PipeBarrier约束说明。

  • 在TPipe-TQue框架编程范式下,如果开发者手动插入了编译器或TPipe-TQue框架编程范式本已自动插入的同步指令,将导致同步指令被重复插入,可能导致程序逻辑异常或性能下降。

  • AIC和AIV之间不支持使用SetFlag/WaitFlag.md)进行同步,可能会出现硬件未定义情况。AIC和AIV之间的同步控制属于核间同步,需要调用CrossCoreSetFlag.md)和CrossCoreWaitFlag.md)进行同步。

  • 以下接口与其他指令之间的同步由硬件保证,无需自动插入同步或手动插入同步,该说明针对如下型号生效:
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品

[!CAUTION]注意 调用接口SetVectorMask、SetMaskCount、SetMaskNorm、ResetMask时不需要手动插入同步。 调用接口SetAtomicAdd、SetAtomicMax、SetAtomicMin、DisableDmaAtomic、SetAtomicType时不需要手动插入同步。 调用CTRL寄存器相关的指令不需要手动插入同步。

编译器自动同步Debug日志功能

毕昇编译器提供“--cce-auto-sync-log= ”编译选项可以输出同步插入信息到 文件中,帮助开发者显式地识别编译器在算子文件中插入的同步指令信息。需debug模式(添加-g编译选项)编译算子,用于获取算子代码文件行号。

  • 直接使用毕昇编译器的场景,可以直接在编译命令中添加该编译选项。
  • 使用Ascend C kernel直调算子工程,可以通过ascendc_compile_options添加该编译选项。
  • 使用Ascend C自定义算子开发工程,可以通过add_ops_compile_options添加该编译选项。

如下的代码文件sync_log_test.h:

LocalTensor<T> dstLocal; T ave_tmp = 0; Vector_OP1(dstLocal, params); ave_tmp = dstLocal.GetValue(0); Vector_OP2(dstLocal, params); for (int i = 0; i < ave_tmp; ++i) { dstLocal.SetValue(i,0); }

开启自动同步后,同步指令的插入位置如下:

LocalTensor<T> dstLocal; T ave_tmp = 0; Vector_OP1(dstLocal, params); SetFlag<HardEvent::V_S>(EVENT_ID0); WaitFlag<HardEvent::V_S>(EVENT_ID0); ave_tmp = dstLocal.GetValue(0); PipeBarrier<PIPE_V>(); SetFlag<HardEvent::S_V>(EVENT_ID0); WaitFlag<HardEvent::S_V>(EVENT_ID0); Vector_OP2(dstLocal, params); SetFlag<HardEvent::V_S>(EVENT_ID0); WaitFlag<HardEvent::V_S>(EVENT_ID0); for (int i = 0; i < ave_tmp; ++i) { dstLocal.SetValue(i,0); }

开启自动同步debug日志功能后,输出日志如下:

The BiSheng Auto Sync log of sync_log_test : Position: absolute-path/sync_log_test.h:4 : line before insert sync : SetFlag<HardEvent::V_S>(EVENT_ID0); Position: absolute-path/sync_log_test.h:4 : line before insert sync : WaitFlag<HardEvent::V_S>(EVENT_ID0); Position: absolute-path/sync_log_test.h:5 : line before insert sync : PipeBarrier<PIPE_V>(); Position: absolute-path/sync_log_test.h:5 : line before insert sync : SetFlag<HardEvent::S_V>(EVENT_ID0); Position: absolute-path/sync_log_test.h:5 : line before insert sync : WaitFlag<HardEvent::S_V>(EVENT_ID0); Position: absolute-path/sync_log_test.h:6 : line before insert sync : SetFlag<HardEvent::V_S>(EVENT_ID0); Position: absolute-path/sync_log_test.h:6 : line before insert sync : WaitFlag<HardEvent::V_S>(EVENT_ID0);

其中,line before表示紧接着当前行前面插入的同步指令。

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

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 19:17:11

2026新手大提琴选购避坑指南,2款高性价比大提琴推荐

大提琴大概是所有乐器中最贴近人声的存在——这句话&#xff0c;很多人在第一次听到大提琴的声音时就深信不疑。 但你有没有想过&#xff1a;为什么偏偏是大提琴&#xff0c;而不是小提琴、钢琴或长笛&#xff1f;这个问题的答案&#xff0c;藏在这件乐器数百年的演变史里。而…

作者头像 李华
网站建设 2026/7/16 19:15:16

5步掌握:如何快速搭建云安全实战环境,提升攻防能力

5步掌握&#xff1a;如何快速搭建云安全实战环境&#xff0c;提升攻防能力 【免费下载链接】awesome-cloud-security awesome cloud security 收集一些国内外不错的云安全资源&#xff0c;该项目主要面向国内的安全人员 项目地址: https://gitcode.com/gh_mirrors/awe/awesom…

作者头像 李华
网站建设 2026/7/16 19:14:56

GitHub Pages重定向技术实战:5分钟构建FOSSASIA照片分享网站

GitHub Pages重定向技术实战&#xff1a;5分钟构建FOSSASIA照片分享网站 【免费下载链接】photos.fossasia.org FOSSASIA Photo Site https://photos.github.io 项目地址: https://gitcode.com/gh_mirrors/ph/photos.fossasia.org 在当今快速发展的数字时代&#xff0c;…

作者头像 李华