CANN/asc-devkit核间同步IBSetAPI

📅 2026/7/16 16:19:57 👁️ 阅读次数 📝 编程学习
CANN/asc-devkit核间同步IBSetAPI

IBSet

【免费下载链接】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"

当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。

调用IBSet设置某一个核的标志位,与IBWait成对使用,表示核之间的同步等待指令:被等待核中调用IBSet,通过将值1写入全局内存中某块地址来通知等待核;而等待核中调用IBWait,持续读取全局内存中相应地址块的值,直到其值变为1,从而实现核间同步。

函数原型

template <bool isAIVOnly = true> __aicore__ inline void IBSet(const GlobalTensor<int32_t>& gmWorkspace, const LocalTensor<int32_t>& ubWorkspace, int32_t blockIdx, int32_t eventID)

参数说明

表1模板参数说明

参数名描述
isAIVOnly控制是否为AIVOnly模式,默认为true。

表2接口参数说明

参数名输入/输出描述
gmWorkspace输入外部存储核状态的公共缓存,类型为GlobalTensor。GlobalTensor数据结构的定义请参考GlobalTensor。
ubWorkspace输入存储当前核状态的公共缓存。
类型为LocalTensor,支持的TPosition为VECIN/VECCALC/VECOUT。
blockIdx输入表示等待核的idx号,取值范围:[0,核数-1]。
eventID输入用来控制当前核的set、wait事件。

返回值说明

约束说明

  • gmWorkspace申请的空间最少要求为:核数32ByteseventID_max+blockIdx_max*32Bytes+32Bytes(eventID_max和blockIdx_max分别指eventID、blockIdx的最大值)。需要注意的是,如果是AIVOnly模式,核数=GetBlockNum();如果是MIX模式,核数=GetBlockNum()*2。
  • ubWorkspace申请的空间最少要求为:32Bytes。
  • 使用该接口进行多核控制时,算子调用时指定的逻辑AI Core核数numBlocks必须保证不大于实际运行该算子的AI处理器核数,否则框架进行多轮调度时会插入异常同步,导致Kernel“卡死”现象。
  • IBSet和IBWait配对使用时,除了ubWorkspace其余所有参数都必须相同,否则程序会在IBWait处卡死。
  • 分离模式下,使用该接口进行两个核间的同步时,仅对AIV核生效。
  • IBSet接口的gmWorkspace缓存的值需要初始化为0。

调用示例

本示例实现功能为使用2个核进行数据处理,每个核均是处理256个half类型数据。核0实现x+y的操作,并将结果放入z的前半部分,核1将核0的计算结果放入x,之后与y相加,结果存入z的后半部分,因此多个核之间需要进行数据同步。

// sync_gm为外部存储核状态的公共缓存,类型为GlobalTensor;sync_buf为存储当前核状态的公共缓存,类型为LocalTensor。 int32_t blockIdx = AscendC::GetBlockIdx(); // 获取当前核。 if (blockIdx == 1) { // 在核1设置IBWait,将阻塞指令执行直到核0操作完成。 AscendC::IBWait(sync_gm, sync_buf, 0, 0); } ... if (blockIdx == 0) { // 在核0设置IBSet,当核0的操作完成后再执行核1的指令。 AscendC::IBSet(sync_gm, sync_buf, 0, 0); }

完整样例请参考IBSet与IBWait核间同步样例。

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

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