asc_sync_block_arrive
产品支持情况
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 200I/500 A2 推理产品:不支持
- Atlas 推理系列产品AI Core:不支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:不支持
功能说明
在分离模式下,AIC(Cube Core)与AIV(Vector Core)按group划分,一个group由1个block(主核)和N个subblock(从核)组成,比例1:N。组内block和subblock间同步指同一group内block(AIC)与subblock(AIV)之间的同步。
和asc_sync_block_wait配合使用(通过flag_id关联),用于组内block和subblock间的信号同步。通过向核间同步寄存器发送同步信号,标识当前pipeline已到达flag_id对应的同步点。每个flag_id对应一个初始值为0的计数器,执行asc_sync_block_arrive后flag_id对应的计数器增加1;执行asc_sync_block_wait时如果对应的计数器数值为0则阻塞不执行;如果对应的计数器大于0,则计数器减一,同时后续指令开始执行。
函数原型
__aicore__ inline void asc_sync_block_arrive(pipe_t pipe, int64_t flag_id)
参数说明
表1 参数说明
| 参数名 | 输入/输出 | 描述 |
|---|---|---|
| pipe | 输入 | 设置这条指令所在的流水类型。 |
| flag_id | 输入 | 事件标号,用于标识同一组同步信号。取值范围为[0,15]。 |
返回值说明
无
流水类型
PIPE_S
约束说明
- 使用该同步接口时,需要按照如下规则设置Kernel类型:
- 在纯Vector/Cube场景下,需设置Kernel类型为KERNEL_TYPE_MIX_AIV_1_0或KERNEL_TYPE_MIX_AIC_1_0。
- 对于Vector和Cube混合场景,需根据实际情况灵活配置Kernel类型。
- 不建议开发者同时使用该接口和Matmul高阶API,否则会有flag_id冲突的风险。
- 同一flag_id的计数器最多设置15次。
- pipe支持的流水类型为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX,不支持PIPE_ALL和PIPE_S。
- flag_id的值超出取值范围时,会截取最低4位为准。
- 一个核连续发出的asc_sync_block_arrive,硬件不保证执行顺序。
调用示例
// Host侧调用接口aclrtGetHardwareSyncAddr获取核间同步基地址ffts_addr
uint64_t config = *(__gm__ uint64_t*)ffts_addr;
asc_set_ffts_base_addr(config);
int64_t flag_id = 1;
asc_sync_block_arrive(PIPE_V, flag_id);
asc_sync_block_wait(PIPE_V, flag_id);
// 在Ascend 950PR/Ascend 950DT产品上,无需进行核间同步基地址ffts_addr的设置
int64_t flag_id = 1;
asc_sync_block_arrive(PIPE_V, flag_id);
asc_sync_block_wait(PIPE_V, flag_id);