CrossCoreSetFlag(ISASI)

产品支持情况

产品

是否支持

Ascend 950PR/Ascend 950DT

Atlas A3 训练系列产品/Atlas A3 推理系列产品

Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

面向分离模式的核间同步控制接口。

该接口和CrossCoreWaitFlag接口配合使用。使用时需传入核间同步的标记ID(flagId),每个ID对应一个用于控制同步的计数器。

同步控制分为以下几种模式,如图1所示:

  • 模式0:AI Core核间的同步控制。对于AIC场景,同步所有的AIC核,直到所有的AIC核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行;对于AIV场景,同步所有的AIV核,直到所有的AIV核都执行到CrossCoreSetFlag时,CrossCoreWaitFlag后续的指令才会执行。
  • 模式1:AI Core内部,AIV核之间的同步控制。如果两个AIV核都运行了CrossCoreSetFlag,CrossCoreWaitFlag后续的指令才会执行。
  • 模式2:AI Core内部,AIC与AIV之间的同步控制。在AIC核执行CrossCoreSetFlag之后, 两个AIV上CrossCoreWaitFlag后续的指令才会继续执行;两个AIV都执行CrossCoreSetFlag后,AIC上CrossCoreWaitFlag后续的指令才能执行。
  • 模式4:AI Core内部,AIC与AIV之间的同步控制。AIV0与AIV1可单独触发AIC等待。比如,在AIC核执行CrossCoreSetFlag之后, AIV0上CrossCoreWaitFlag后续的指令才会继续执行;AIV0执行CrossCoreSetFlag后,AIC上CrossCoreWaitFlag后续的指令才能执行。

其中,模式4仅支持Ascend 950PR/Ascend 950DT。

图 1 同步控制模式示意图

函数原型

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

参数说明

表 1 模板参数说明

参数名

描述

modeId

核间同步的模式,取值如下:

  • 模式0:AI Core核间的同步控制。
  • 模式1:AI Core内部,Vector核(AIV)之间的同步控制。
  • 模式2:AI Core内部,Cube核(AIC)与Vector核(AIV)之间的同步控制。
  • 模式4:AI Core内部,AIC与AIV之间的同步控制。AIV0与AIV1可单独触发AIC等待。

pipe

设置这条指令所在的流水类型,流水类型可参考硬件流水类型

特别地,PIPE_S流水类型仅Ascend 950PR/Ascend 950DT支持。

表 2 参数说明

参数名

输入/输出

描述

flagId

输入

核间同步的标记。

Atlas A2 训练系列产品/Atlas A2 推理系列产品,取值范围是0-10。

Atlas A3 训练系列产品/Atlas A3 推理系列产品,取值范围是0-10。

Ascend 950PR/Ascend 950DT,取值范围如下:

AIV0发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 0-10的操作。

AIV1发起的flagId 0-10的CrossCoreSetFlag操作对应AIC CrossCoreWaitFlag中flagId 16-26的操作。

AIC发起的flagId 0-10的CrossCoreSetFlag操作对应AIV0 CrossCoreWaitFlag中flagId 0-10的操作。

AIC发起的flagId 16-26的CrossCoreSetFlag操作对应AIV1 CrossCoreWaitFlag中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次。

  • 使用该接口模式0时,必须通过SetScheduleMode使能batchmode模式,使算子独占全部所需核资源,否则可能因满足以下条件导致死锁:

    • 多流并发场景(≥2条执行流)。

    • ≥2个算子并发执行。

    • 所有并发算子的核数总和超过物理核数。

    • ≥2个并发算子使用了核间同步功能。

      具体而言,在多流场景下,某条流的核间同步算子虽分配到n个物理核,但可能仅有n-m个核先被调度执行,而其余m个核因被其他流的核间同步算子抢占而尚未启动。先启动的n-m个核执行到核间同步时等待剩余m核完成,而剩余m核因被其他流的核间同步算子占用而无法释放,形成死锁。

调用示例

// 使用模式0的方式同步所有的AIV核
if (g_coreType == AscendC::AIV) {
    AscendC::CrossCoreSetFlag<0x0, PIPE_MTE3>(0x8);
    AscendC::CrossCoreWaitFlag(0x8);
}

// 使用模式1的方式同步当前AICore内的所有AIV子核
if (g_coreType == AscendC::AIV) {
    AscendC::CrossCoreSetFlag<0x1, PIPE_MTE3>(0x8);
    AscendC::CrossCoreWaitFlag(0x8);
}

// 注意:如果调用高阶API,无需开发者处理AIC和AIV的同步
// 以Matmul为例:AIC侧做完Matmul计算后通知AIV进行后处理
if (g_coreType == AscendC::AIC) {
    // Matmul处理
    AscendC::CrossCoreSetFlag<0x2, PIPE_FIX>(0x8);
}

// AIV侧等待AIC Set消息, 进行Vector后处理
if (g_coreType == AscendC::AIV) {
    AscendC::CrossCoreWaitFlag(0x8);
    // Vector后处理
}