CANN AscendC核间同步API文档

📅 2026/7/16 20:15:01
CANN AscendC核间同步API文档
SyncAll【免费下载链接】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支持硬同步不支持config指定流水原型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支持硬同步支持config指定流水原型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。SyncAll是核间同步控制接口根据不同的函数原型介绍其功能硬件同步接口 用于多个核之间的同步控制支持以下同步场景纯Vector算子的全核同步可参考CrossCoreSetFlag的模式0。融合算子的全核同步一次性实现三个核间同步能力参考CrossCoreSetFlag的关键特性说明首先完成单个AI Core内AIC与所有AIV同步AIC等AIV接着完成多个AI Core间所有AIC的同步最后完成单个AI Core内所有AIV与AIC同步AIV等AIC。软件同步接口 仅支持纯Vector算子的多核参与同步的核数可通过入参指定同步。每一个AIV都向全局内存对应位置写入信号值1接着每一个AIV都持续轮询全局内存中所有AIV对应的信号值直到所有AIV核对应的信号值都变为1。在纯Vector算子场景中若所有AIV核默认参与同步推荐采用性能更优的硬件同步接口若需指定部分AIV核参与同步则应使用软件同步接口并通过入参usedCores完成配置。函数原型软同步template bool isAIVOnly true __aicore__ inline void SyncAll(const GlobalTensorint32_t gmWorkspace, const LocalTensorint32_t ubWorkspace, const int32_t usedCores 0)硬同步不支持config指定流水template bool isAIVOnly true __aicore__ inline void SyncAll()支持config指定流水template bool isAIVOnly true, const SyncAllConfig config DEFAULT_SYNC_ALL_CONFIG __aicore__ inline void SyncAll()参数说明表1模板参数说明参数名描述isAIVOnly控制SyncAll作用于纯Vector算子或Mix包含Cube和Vector计算算子。可选值•true默认值纯Vector算子的全核同步仅执行Vector核的全核同步。•falseMix包含Cube和Vector计算算子的全核同步先分别完成Vector核和Cube核的全核同步再执行两者之间的同步软同步接口不支持此功能。config该配置仅当isAIVOnlyTrue时有效。struct SyncAllConfig { pipe_t triggerPipe; pipe_t waitPipe; }; // 默认使用全部流水来进行触发和等待行为。constexpr SyncAllConfig DEFAULT_SYNC_ALL_CONFIG {PIPE_ALL, PIPE_ALL};控制SyncAll函数的行为在多个AI Core之间进行流水同步时指定哪些流水pipe用于触发和等待。•triggerPipe指定哪个流水用于“发送触发信号”。仅支持MTE2、MTE3、PIPE_ALL。•waitPipe指定哪个流水用于“接收等待信号”。仅支持MTE2、MTE3、PIPE_ALL。// 多个AIV进行计算 Compute(); // 多个AIV将计算结果搬出到GM CopyToGM(); // 等待所有数据拷贝到GM后进行累加 constexpr AscendC::SyncAllConfig CustomConfig {PIPE_MTE3, PIPE_ALL}; AscendC::SyncAlltrue, CustomConfig(); for (int i 0; i blockNum; i) { if (i ! blockIdx) { CopyFromGm(); Accumulate(); } } // 累加后的数据写回 CopyToGm();表2参数说明参数名称输入/输出含义gmWorkspace输入gmWorkspace为用户定义的全局空间作为所有核共用的缓存用于保存每个核的状态标记类型为GlobalTensor支持的数据类型为int32_t。GlobalTensor数据结构的定义请参考GlobalTensor。所需空间大小和使用注意项参见约束说明。硬同步接口不支持该参数。ubWorkspace输入ubWorkspace为用户定义的局部空间每个核单独自用用于标记当前核的状态。类型为LocalTensor支持的TPosition为VECIN、VECCALC、VECOUT支持的数据类型为int32_t。所需空间大小参见约束说明。硬同步接口不支持该参数。usedCores输入指定多少个核之间的同步传入数值不能超过算子调用时指定的逻辑numBlocks。此参数为默认参数不传此参数表示全核软同步。仅在软同步接口中支持硬同步接口不支持该参数。返回值说明无约束说明SyncAll硬件同步和软件同步接口的内部实现不同约束条件也有所区别。软件同步接口约束gmWorkspace缓存申请的空间大小要求大于等于GetBlockNum()*32Bytes并且缓存的值需要初始化为0。目前常见的有两种初始化方式通过在host侧进行初始化操作确保传入该接口时gmWorkspace缓存已经初始化为0在kernel侧初始化的时候对gmWorkspace缓存初始化需要注意的是每个核上都需要初始化全部的gmWorkspace缓存空间。ubWorkspace申请的空间大小要求大于等于GetBlockNum()*32Bytes。在纯Vector算子场景中若所有AIV核默认参与同步推荐采用性能更优的硬件同步接口若需指定部分AIV核参与同步则应使用软件同步接口并通过入参usedCores完成配置。usedCores传入数值不能超过算子调用时指定的逻辑AI Core中AIV的数量GetBlockNum()*GetTaskRatio()不传此参数表示全核软同步。硬件同步接口约束使用硬同步接口时需根据场景使用合适的核函数修饰符在纯Vector算子需使用__mix__(0, 1)修饰核函数而不是使用__vector__具体原因请参考CrossCoreSetFlag约束说明.md#约束说明)中的Kernel类型配置说明。对于Mix包含Cube和Vector计算算子需使用__mix__(1, 1)或__mix__(1, 2)修饰核函数。对于纯Vector算子模板参数isAIVOnly必须设置为true否则会导致程序卡死。对于Mix包含Cube和Vector计算算子模板参数isAIVOnly设置为true会导致接口实际只能完成Vector全核同步与预期同步行为不符。使用该接口时建议开启batchmode模式使算子独占全部所需核资源否则可能因满足以下条件导致死锁多流并发场景≥2条执行流。≥2个算子并发执行。所有并发算子的核数总和超过物理核数。≥2个并发算子使用了核间同步功能。具体而言在多流场景下某条流的核间同步算子虽分配到n个物理核但可能仅有n-m个核先被调度执行而其余m个核因被其他流的核间同步算子抢占而尚未启动。先启动的n-m个核执行到核间同步时等待剩余m核完成而剩余m核因被其他流的核间同步算子占用而无法释放形成死锁。 Kernel直调场景下通过__schedmode__(mode)限定符来设置batchmode模式工程化算子开发场景下通过TilingContext的SetScheduleMode接口来设置batchmode模式具体请参考《基础数据结构和接口》。SyncAll硬件同步接口内部实现中使用了CrossCoreSetFlag.md)进行核间同步控制所以不建议开发者同时使用CrossCoreSetFlag和SyncAll硬件同步接口否则会有flagID冲突的风险。SyncAll硬件同步接口flagId占用范围为[11-14]。硬件同步接口和软件同步接口公共约束使用该接口进行多核控制时算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数否则框架进行多轮调度时会插入异常同步导致Kernel“卡死”现象。调用示例本示例实现功能为使用8个核进行数据处理每个核均是处理32个float类型数据对该数据乘2后再与其他核上进行同样乘2的数据进行相加中间结果保存到workGm因此多个核之间需要进行数据同步。此样例中使用软同步入口函数传入的syncGm里的值都已经在host侧初始化为0。若以下用例改成使用硬同步则不需要传入syncGm并且不需要使用workQueue。// syncGlobal为用户定义的全局空间作为所有核共用的缓存类型为GlobalTensorworkLocal为用户定义的局部空间每个核单独自用类型为LocalTensor。 int srcDataSize 256; // 参与计算的元素个数。 int32_t blockNum AscendC::GetBlockNum(); // 获取核总数。 int32_t blockIdx AscendC::GetBlockIdx(); // 获取当前工作的核ID。 uint32_t perBlockSize srcDataSize / blockNum; // 每个核平分处理相同个数。 // 当前工作核计算后的数据先保存到外部工作空间workGlobal为GlobalTensordstLocal为LocalTensor。 AscendC::DataCopy(workGlobal[blockIdx * perBlockSize], dstLocal, perBlockSize); // 等待所有核都完成计算。 AscendC::SyncAll(syncGlobal, workLocal);完整样例请参考SyncAll样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考