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框架编程范式下框架能够自动插入部分同步以解决写后读WARWrite‑After‑Read和读后写RAWRead‑After‑Write两类数据依赖具体原理参考TPipe-TQue框架数据依赖与同步机制。表1在TPipe-TQue框架编程范式下AIV中不同流水线的同步情况源流水\目的流水PIPE_SPIPE_VPIPE_MTE2PIPE_MTE3PIPE_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_FIXPIPE_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-syncon开启编译器自动同步功能Kernel直调算子工程、自定义算子开发工程以及异构编译 直调已默认开启该编译选项。如需关闭开发者可手动设置--cce-auto-syncoff。[!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.hLocalTensorT 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); }开启自动同步后同步指令的插入位置如下LocalTensorT dstLocal; T ave_tmp 0; Vector_OP1(dstLocal, params); SetFlagHardEvent::V_S(EVENT_ID0); WaitFlagHardEvent::V_S(EVENT_ID0); ave_tmp dstLocal.GetValue(0); PipeBarrierPIPE_V(); SetFlagHardEvent::S_V(EVENT_ID0); WaitFlagHardEvent::S_V(EVENT_ID0); Vector_OP2(dstLocal, params); SetFlagHardEvent::V_S(EVENT_ID0); WaitFlagHardEvent::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 : SetFlagHardEvent::V_S(EVENT_ID0); Position: absolute-path/sync_log_test.h:4 : line before insert sync : WaitFlagHardEvent::V_S(EVENT_ID0); Position: absolute-path/sync_log_test.h:5 : line before insert sync : PipeBarrierPIPE_V(); Position: absolute-path/sync_log_test.h:5 : line before insert sync : SetFlagHardEvent::S_V(EVENT_ID0); Position: absolute-path/sync_log_test.h:5 : line before insert sync : WaitFlagHardEvent::S_V(EVENT_ID0); Position: absolute-path/sync_log_test.h:6 : line before insert sync : SetFlagHardEvent::V_S(EVENT_ID0); Position: absolute-path/sync_log_test.h:6 : line before insert sync : WaitFlagHardEvent::V_S(EVENT_ID0);其中line before表示紧接着当前行前面插入的同步指令。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考