asc.language.basic.cross_core_set_flag

asc.language.basic.cross_core_set_flag(flag_id: int, mode_id: int, pipe: PipeID) None

面向分离架构的核间同步控制接口。 该接口和cross_core_wait_flag接口配合使用。使用时需传入核间同步的标记ID(flagId),每个ID对应一个初始值为0的计数器。执行cross_core_set_flag后ID对应的计数器增加1;执行cross_core_wait_flag时如果对应的计数器数值为0则阻塞不执行;如果对应的计数器大于0,则计数器减一,同时后续指令开始执行。 同步控制分为以下几种模式: - 模式0:AI Core核间的同步控制。对于AIC场景,同步所有的AIC核,直到所有的AIC核都执行到cross_core_set_flag时,cross_core_wait_flag后续的指令才会执行;对于AIV场景,同步所有的AIV核,直到所有的AIV核都执行到cross_core_set_flag时,cross_core_wait_flag后续的指令才会执行。 - 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了cross_core_set_flag,cross_core_wait_flag后续的指令才会执行。 - 模式2:AI Core内部,AIC与AIV之间的同步控制。在AIC核执行cross_core_set_flag之后,两个AIV上cross_core_wait_flag后续的指令才会继续执行;两个AIV都执行cross_core_set_flag后,AIC上cross_core_wait_flag后续的指令才能执行。

对应的Ascend C函数原型

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

参数说明

  • modeId: 核间同步的模式,取值如下: - 模式0:AI Core核间的同步控制。 - 模式1:AI Core内部,Vector核(AIV)之间的同步控制。 - 模式2:AI Core内部,Cube核(AIC)与Vector核(AIV)之间的同步控制。

  • pipe: 设置这条指令所在的流水类型。

  • flagId: 核间同步的标记,取值范围是0-10。

约束说明

  • 使用该同步接口时,需要按照如下规则设置Kernel类型: - 在纯Vector/Cube场景下,需设置Kernel类型为KERNEL_TYPE_MIX_AIV_1_0或KERNEL_TYPE_MIX_AIC_1_0。 - 对于Vector和Cube混合场景,需根据实际情况灵活配置Kernel类型。

  • 因为Matmul高阶API内部实现中使用了本接口进行核间同步控制,所以不建议开发者同时使用该接口和Matmul高阶API,否则会有flagID冲突的风险。

  • 同一flagId的计数器最多设置15次。

调用示例

asc.cross_core_set_flag(flag_id=0, mode_id=0, pipe=asc.PipeID.PIPE_V)