CANNAscendC SetFlag/WaitFlag同步控制API文档
SetFlag/WaitFlag(ISASI)【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品支持Kirin X90支持Kirin 9030支持功能说明头文件路径为basic_api/kernel_operator_block_sync_intf.h。如图1所示SetFlag/WaitFlag接口用于核内多流水间的同步[!NOTE]说明 该接口标注为ISASI类别不能保证跨硬件版本兼容。如需保证跨硬件版本兼容的同步控制接口请参见TQueSync SetFlag/WaitFlag。二者的区别在于TQueSync类接口可以保证跨硬件版本兼容。SetFlag当源流水的前序指令的所有读写操作都完成之后当前指令开始执行并将硬件中的对应标志位设置为1。SetFlag只是设置硬件中的对应标志位并不会阻塞源流水中的下一个指令。WaitFlag当目的流水执行到该指令时如果发现硬件中对应标志位为0目的流水的后续指令将一直被阻塞如果发现硬件中对应标志位为1则将硬件中对应标志位设置为0同时目的流水的后续指令开始执行。图1SetFlag/WaitFlag接口功能示意图函数原型template HardEvent event __aicore__ inline void SetFlag(int32_t eventID) template HardEvent event __aicore__ inline void WaitFlag(int32_t eventID)参数说明表1参数说明参数名输入/输出描述event输入模板参数。同步事件数据类型为HardEvent。同一核内的不同流水之间在存在数据访问依赖时需要根据数据访问的先后顺序插入对应的同步事件。HardEvent用来表示对应的同步事件。HardEvent命名规则为源流水_目标流水其中源流水的指令先执行、目标流水中的指令后执行。例如MTE2_V代表PIPE_MTE2为源流水PIPE_V为目标流水标识从PIPE_MTE2到PIPE_V的同步PIPE_V等待PIPE_MTE2。由于硬件架构版本代际间的差异不同硬件架构上的事件存在差异。eventID输入事件ID。数据类型为int32_t类型。eventID的取值范围与产品型号有关具体请参考约束说明。返回值说明无约束说明SetFlag只是设置硬件标志位不会阻塞源流水中的下一个指令。SetFlag和WaitFlag必须成对使用且SetFlag和WaitFlag的参数必须完全一致包括模板参数event和输入参数eventID。如果不匹配会引发timeout问题。例如SetFlagHardEvent::S_MTE3(1)和WaitFlagHardEvent::MTE3_MTE1(1)并不匹配因为其模板参数event不同。在采用TPipe-TQue框架编程范式时eventID需要通过AllocEventID或者FetchEventID来获取。在采用静态Tensor编程范式时事件的类型和事件ID由开发者自行管理建议使用事件ID0-5事件ID6用于系统内部规划当前未使用事件ID7用于TPipe编程中的自动同步功能目前暂不建议直接使用事件ID6-7。eventID的取值范围如下- Ascend 950PR/Ascend 950DT数据范围为0-7。- Atlas A3 训练系列产品/Atlas A3 推理系列产品数据范围为0-7。- Atlas A2 训练系列产品/Atlas A2 推理系列产品数据范围为0-7。- Atlas 推理系列产品AI Core数据范围为0-7。- Atlas 训练系列产品数据范围为0-3。相同流水、相同eventID下连续使用SetFlag会引发未定义行为此时再执行PipeBarrierPIPE_ALL会出现卡死现象SetFlagM_MTE1(0); // 第一次SetFlag SetFlagM_MTE1(0); // 第二次SetFlag相同流水、相同eventID连续使用引发未定义行为 ... PipeBarrierPIPE_ALL(); // 触发卡死 ... WaitFlagM_MTE1(0); WaitFlagM_MTE1(0);调用示例AscendC::DataCopy(src1Local, src1Global[i * tileLength], tileLength); AscendC::DataCopy(src0Local, src0Global[i * tileLength], tileLength); // 循环内依赖先“DataCopy(PIPE_MTE2)写src0Local”后“Maxs和MinsPIPE_V读src0Local”。 // 由于PIPE_V需要等待PIPE_MTE2所以需要插入以下同步。 AscendC::SetFlagAscendC::HardEvent::MTE2_V(EVENT_ID0); AscendC::WaitFlagAscendC::HardEvent::MTE2_V(EVENT_ID0); AscendC::Maxs(tmpTensor1, src0Local, inputVal, tileLength); AscendC::Mins(tmpTensor2, src0Local, inputVal, tileLength);【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考