IBWait
产品支持情况
功能说明
头文件路径为:"basic_api/kernel_operator_block_sync_intf.h"。
当不同核之间操作同一块全局内存且可能存在读后写、写后读以及写后写等数据依赖问题时,通过调用该函数来插入同步语句来避免上述数据依赖时可能出现的数据读写错误问题。
调用IBSet设置某一个核的标志位,与IBWait成对使用,表示核之间的同步等待指令:被等待核中调用IBSet,通过将值1写入全局内存中某块地址来通知等待核;而等待核中调用IBWait,持续读取全局内存中相应地址块的值,直到其值变为1,从而实现核间同步。
函数原型
template <bool isAIVOnly = true>
__aicore__ inline void IBWait(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。
调用示例
完整样例请参考调用示例。