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

CANN/asc-devkit核间同步接口

CrossCoreSetFlag(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 训练系列产品:不支持

功能说明

头文件路径为:"basic_api/kernel_operator_block_sync_intf.h"

在核间同步场景中,CrossCoreSetFlag接口和CrossCoreWaitFlag.md)接口配对工作,使用时需传入核间同步的标记ID(flagId),每个ID对应一个用于控制同步的计数器。

  • CrossCoreSetFlag:AI Core中的AIC/AIV在完成本核前置位的pipe流水任务后,调用该接口,向调度模块上报本核任务已完成。调度模块收集所有参与核的上报信息,作为全局完成标志。
  • CrossCoreWaitFlag:用于阻塞本核后续指令的下发(已下发指令可正常执行),直至调度模块确认所有应调用CrossCoreSetFlag的核均已上报完成,随即解除阻塞,允许该核继续下发指令。

如图1所示(图中block代表AIC,sub_block代表AIV),同步控制分为以下几种模式:

  • 模式0:AI Core核间的同步控制。对于AIC场景,同步所有的AIC核,直到所有的AIC核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行;对于AIV场景,同步所有的AIV核,直到所有的AIV核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行。
  • 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了CrossCoreSetFlag,CrossCoreWaitFlag后续的指令才会执行。
  • 模式2:AI Core内部,AIC与所有AIV之间的同步控制。在AIC核执行CrossCoreSetFlag之后,两个AIV上CrossCoreWaitFlag后续的指令才会继续执行;两个AIV都执行CrossCoreSetFlag后,AIC上CrossCoreWaitFlag后续的指令才能执行。
  • 模式4:AI Core内部,AIC与单个AIV之间的同步控制。当在AIC核执行CrossCoreSetFlag之后,AIV0或者AIV1上CrossCoreWaitFlag后续的指令才会继续执行;AIV0或者AIV1执行CrossCoreSetFlag后,AIC上CrossCoreWaitFlag后续的指令才能执行。

[!NOTE]说明

  • 不同型号支持的模式不同,具体支持情况请参考modeId支持的取值说明。
  • 每个模式的具体执行逻辑与细节可以参考关键特性说明。

图1同步控制模式示意图
![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/block_subblock_relationship_3510.png "同步控制模式示意图"?utm_source=gitcode_repo_files)

函数原型

template <uint8_t modeId, pipe_t pipe> __aicore__ inline void CrossCoreSetFlag(uint16_t flagId)

参数说明

模板参数及输入参数说明

表1模板参数说明

参数名描述
modeId核间同步的模式,不同产品对同步模式的支持情况请参见modeId支持的取值说明。
各个模式支持的对应Kernel类型请参照表3。
pipe设置这条指令所在的流水类型。支持的流水类型为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX,不支持PIPE_S和PIPE_ALL。不同产品对流水类型的支持情况请参见pipe支持的流水类型说明。

表2参数说明

参数名输入/输出描述
flagId输入核间同步的标记。不同产品对flagId的取值范围说明请参见flagId取值范围说明。

modeId支持的取值说明

不同产品对同步模式的支持情况如下:

  • 针对Ascend 950PR/Ascend 950DT,支持的同步模式为:模式0、模式1、模式2、模式4。
  • 针对如下产品,支持的同步模式为:模式0、模式1、模式2。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品

pipe支持的流水类型说明

  • 核间同步的模式为模式0、1、2时,
    • 支持的流水类型为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX。
    • 不支持的流水类型为PIPE_ALL、PIPE_S。
  • 针对Ascend 950PR/Ascend 950DT,核间同步的模式为模式4时,
    • 支持的流水类型为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX、PIPE_S。
    • 不支持的流水类型为PIPE_ALL。

flagId取值范围说明

  • 核间同步的模式为模式0、1、2时,支持的取值范围为0-15。
  • 针对Ascend 950PR/Ascend 950DT,核间同步的模式为模式4时,支持的取值范围情况如下:
    • AIV0发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 0-10的操作。
    • AIV1发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 16-26的操作。
    • AIC发起的flagId 0-10的CrossCoreSetFlag操作对应AIV0 CrossCoreWaitFlag中flagId 0-10的操作。
    • AIC发起的flagId 16-26的CrossCoreSetFlag操作对应AIV1 CrossCoreWaitFlag中flagId 0-10的操作。

返回值说明

约束说明

  • 由于当Kernel类型为KERNEL_TYPE_AIC_ONLY或KERNEL_TYPE_AIV_ONLY时,硬件不会开启调度模块,也就无法正常进行核间同步,因此不同的同步模式配置Kernel类型或函数修饰符的情况如下:

    • 在纯Vector/Cube场景下(模式0或模式1),建议设置Kernel类型为KERNEL_TYPE_MIX_AIV_1_0或KERNEL_TYPE_MIX_AIC_1_0,其它支持的Kernel类型请参考表3。

    • 对于Vector和Cube混合场景(模式2和模式4),需根据AI Core中AIC和AIV的比例灵活配置Kernel类型,不同模式支持的函数修饰符和Kernel类型请参照表3。

      表3模式与支持的Kernel类型配置

      模式支持的函数修饰符支持的Kernel类型配置
      0__mix__(0, 1)、__mix__(1, 0)、__mix__(1, 1)、__mix__(1, 2)KERNEL_TYPE_MIX_AIV_1_0、KERNEL_TYPE_MIX_AIC_1_0、KERNEL_TYPE_MIX_AIC_1_1、KERNEL_TYPE_MIX_AIC_1_2
      1__mix__(1, 1)、__mix__(1, 2)KERNEL_TYPE_MIX_AIC_1_1、KERNEL_TYPE_MIX_AIC_1_2
      2__mix__(1, 1)、__mix__(1, 2)KERNEL_TYPE_MIX_AIC_1_1、KERNEL_TYPE_MIX_AIC_1_2
      4__mix__(1, 2)KERNEL_TYPE_MIX_AIC_1_2
  • 接口使用模式0、1、2,需要避免flagId使用冲突:

    • Matmul高阶API内部实现中使用了CrossCoreSetFlag进行核间同步控制,所以不建议开发者同时使用CrossCoreSetFlag和Matmul高阶API,否则会有flagId冲突的风险。Matmul高阶API内部占用的flagId范围与定义的Matmul对象数目相关,假设定义了N个Matmul对象,Matmul高阶API内部占用的flagId范围为[0, 2 * N - 1]。Matmul最多支持定义4个对象,此时flagId占用范围为[0,7]。
    • SyncAll硬件同步接口内部实现中使用了CrossCoreSetFlag进行核间同步控制,所以不建议开发者同时使用CrossCoreSetFlag和SyncAll硬件同步接口,否则会有flagId冲突的风险。SyncAll硬件同步接口flagId占用范围为[11-14]。
  • 用户需要确保配套使用CrossCoreSetFlag和CrossCoreWaitFlag,否则会出现未定义行为。

  • 核间同步的模式为模式0、1、2时,模板参数pipe不支持设置为PIPE_ALL,PIPE_S。

  • 针对Ascend 950PR/Ascend 950DT,核间同步的模式为模式4时,模板参数pipe不支持配置为PIPE_ALL。
  • 一个核连续发出的CrossCoreSetFlag,硬件不保证执行顺序。例如AIV依次发射CrossCoreSetFlag<0,PIPE_V>(0),CrossCoreSetFlag<0,PIPE_V>(1),实际的执行顺序可能是flagId=1的先执行。

  • flagId相关的约束:

    • 对于模式0、1、2,每个AIC和每个AIV都各自有16个flagId,支持的取值范围为0-15。如果flagId的值超出该范围,则会取截取最低位4bit为准。
    • 每个flagId都对应一个计数器,当调用CrossCoreWaitFlag.md)时,若计数器值为0则会阻塞后续指令下发,已下发指令可正常执行;当调度模块感知到所有参与同步的核(具体包含哪些核与设置的核间同步模式有关)完成(调用了CrossCoreSetFlag)同步后,会将与设置的flagId对应的计数器的值增加1。此时,计数器值为非0,阻塞解除,并且将对应计数器的值减去1进行还原。具体执行逻辑与细节可以参考关键特性说明。每一个计数器计数范围为0-15。如果调用CrossCoreWaitFlag的次数过多,计数器的值超出该范围,则会异常报错,中断流程。
  • 核间同步的模式为模式0、1、2时,同一个flagId用于不同核间同步模式的约束:

    • 同一核上,若同一个flagId需用于不同核间同步模式,须在模式切换前完成前一个模式的所有同步操作——即确保该flagId关联的所有CrossCoreSetFlag与配套CrossCoreWaitFlag调用均已执行完毕。
    • 对于不同的核,可以直接将同一flagId用于不同的核间同步模式,具体包括以下2种场景:
      • 多个AI Core之间,使用flagId=0同步所有的AIC(模式0);单个AI Core内,使用flagId=0同步所有AIV(模式1)。
      • 单个AI Core内,使用flagId=0同步所有AIV(模式1);另一个AI Core内,使用flagId=0同步AIC与所有AIV(模式2)。
  • 使用该接口模式0时,建议开启batchmode模式,使算子独占全部所需核资源,否则可能因满足以下条件导致死锁:

    • 多流并发场景(≥2条执行流)。
    • ≥2个算子并发执行。
    • 所有并发算子的核数总和超过物理核数。
    • ≥2个并发算子使用了核间同步功能。

    具体而言,在多流场景下,某条流的核间同步算子虽分配到n个物理核,但可能仅有n-m个核先被调度执行,而其余m个核因被其他流的核间同步算子抢占而尚未启动。先启动的n-m个核执行到核间同步时等待剩余m核完成,而剩余m核因被其他流的核间同步算子占用而无法释放,形成死锁。 Kernel直调场景下通过__schedmode__(mode)限定符来设置batchmode模式;工程化算子开发场景下,通过TilingContext的SetScheduleMode接口来设置batchmode模式,具体请参考《基础数据结构和接口》。

调用示例

表4样例描述

SCENARIO_NUM取值业务场景使用的同步模式
0纯Vector计算场景(16个AIV)mode0(AIV全核同步)
1纯Vector计算场景(2个AIV)mode1
2Cube与Vector融合计算场景mode2(AIC等AIV)、mode2(AIV等AIC)、mode0(AIC全核同步)

如上表所示,当SCENARIO_NUM取不同值时,会分别演示纯Vector计算场景和Cube与Vector融合计算场景下三种同步模式的具体使用方法,下面展示了纯Vector计算场景的部分调用代码:

AscendC::Muls(xLocal, xLocal, float(AscendC::GetBlockIdx()), this->blockLength); AscendC::SetFlag<AscendC::HardEvent::V_MTE3>(EVENT_ID0); AscendC::WaitFlag<AscendC::HardEvent::V_MTE3>(EVENT_ID0); // UB到GM搬运启用原子累加。 AscendC::SetAtomicAdd<float>(); // DataCopy属于PIPE_MTE3流水操作。 AscendC::DataCopy(atomicResultGm, xLocal, this->blockLength); // 当本AIV完成前置PIPE_MTE3(DataCopy)流水操作后,通知其他AIV核,本AIV已经完成。 AscendC::CrossCoreSetFlag<0, PIPE_MTE3>(0); // 阻塞本AIV继续往下执行指令,直到其他AIV全部都完成PIPE_MTE3流水操作,才解除阻塞往下执行。 AscendC::CrossCoreWaitFlag(0); // 关闭原子累加。 AscendC::DisableDmaAtomic(); if (AscendC::GetBlockIdx() == 0) { AscendC::DataCopy(yLocal, atomicResultGm, this->blockLength); AscendC::SetFlag<AscendC::HardEvent::MTE2_MTE3>(EVENT_ID0); AscendC::WaitFlag<AscendC::HardEvent::MTE2_MTE3>(EVENT_ID0); AscendC::DataCopy(atomicResultGm, yLocal, this->blockLength); return; }

完整样例请参考CrossCoreSetFlag和CrossCoreWaitFlag核间同步样例。

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

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

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

相关文章:

  • 2026优质博士论文辅导机构汇总,博生毕业必备避坑攻略! - 小艾学姐
  • Mac外接显示器关闭内屏的3种实用方案
  • 血型遗传查询 API 实战:从业务需求到代码集成
  • GEO源头厂家主体爱搜索GEO:企业如何低成本布局AI搜索优化? - 品牌报告
  • log4shell-detector社区贡献指南:如何提交漏洞样本与改进建议
  • Chatterbox-TTS-Server Web UI使用教程:轻松生成高质量语音
  • CANN/AscendC HCCL通信接口
  • 2026重庆涪陵返乡护送长途救护车出租,跨省重症转院安全护送 - 速递信息
  • JUnit 5核心功能实战:从生命周期到参数化测试的进阶指南
  • Playwright浏览器高级配置实战:从反检测到性能优化
  • LangChain 实战指南:用项目结果反推能力
  • Agent沙箱数据库三位一体架构解析
  • 2026年家装公司哪家在当地口碑好? - 装企自媒体训练营辉哥
  • OpenAI Codex实战指南:AI编程助手核心能力与开发技巧
  • UMI数据语义升级:让具身VLA模型真正理解动作意图
  • AWS企业级Claude部署的五条路径深度对比与选型指南
  • 2026天津黄金回收内行交易指南 看懂规则不被宰 - 奢侈品回收机构参考
  • 鸿蒙应用开发实战【95】— 实战应用状态批量管理操作
  • Lazygit终端Git工具:行级暂存与交互式变基实战指南
  • Ubuntu 26.04 LTS 安装后优化与开发环境配置指南
  • Linux包管理利器Yum:从基础命令到企业级实践
  • Hy-Embodied-VLM-1.0社区生态:从开源模型到商业应用的发展路线
  • SpringBoot配置加密实战:Jasypt原理、性能优化与高级应用
  • async-stream实战教程:构建高效TCP服务器与WebSocket流
  • 2026年7月有实力的平皮带源头厂家哪家强,输送带/同步带/平皮带/工业皮带/PU同步带,平皮带供应商哪家靠谱 - 品牌推荐师
  • 2026无锡制造业AI搜索优化服务商综合排行参考 - 奔跑123
  • 婚约财产纠纷律所:彩礼返还比例的地方司法裁量差异解读 - 品牌深度评测
  • 8款AI写小说工具实测,新手轻松上手【7月最新测评】
  • 易语言开发实战:从计算器到模块化工具的技术边界解析
  • 鸿蒙应用开发实战【96】— HarmonyOS权限申请实战