关键特性说明
【免费下载链接】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_S | PIPE_V | PIPE_MTE2 | PIPE_MTE3 |
|---|---|---|---|---|
| PIPE_S | 不涉及 | 编译器自动同步 | 编译器自动同步 | 编译器自动同步 |
| PIPE_V | 编译器自动同步 | 编译器自动插入PipeBarrier | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 |
| PIPE_MTE2 | 编译器自动同步 | TPipe-TQue框架自动同步 | 手动插入PipeBarrier | TPipe-TQue框架自动同步 |
| PIPE_MTE3 | 编译器自动同步 | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 | 手动插入PipeBarrier |
表2在TPipe-TQue框架编程范式下,AIC中不同流水线的同步情况
| 源流水\目的流水 | PIPE_S | PIPE_M | PIPE_MTE1 | PIPE_MTE2 | PIPE_MTE3 | PIPE_FIX |
|---|---|---|---|---|---|---|
| PIPE_S | 不涉及 | 不涉及 | 不涉及 | 不涉及 | 不涉及 | 不涉及 |
| PIPE_M | 不涉及 | 手动插入PipeBarrier | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 | 不涉及 | TPipe-TQue框架自动同步 |
| PIPE_MTE1 | 不涉及 | TPipe-TQue框架自动同步 | 手动插入PipeBarrier | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 |
| PIPE_MTE2 | 不涉及 | TPipe-TQue框架自动同步 | TPipe-TQue框架自动同步 | 手动插入PipeBarrier | TPipe-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),仅供参考