asc_sync_intra_wait

产品支持情况

  • 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内同步指同一block内block(AIC)与单个subblock(AIV)之间的同步。

block内同步指令,与asc_sync_intra_arrive配合使用,是block内不同Core的流水线同步指令,用于向每个Core的同步寄存器发送同步信号。每个sync_id对应Vector Core与Cube Core中的一个初始值为0的计数器。asc_sync_intra_arrive指令后其他CORE对应的计数器增加1;执行asc_sync_intra_wait时如果对应的计数器数值为0则阻塞不执行;如果对应的计数器大于0,则计数器减一,同时后续指令开始执行。

函数原型

__aicore__ inline void asc_sync_intra_wait(pipe_t pipe, uint8_t sync_id)
__aicore__ inline void asc_sync_intra_wait(pipe_t pipe, uint64_t sync_id)

参数说明

表1 参数说明

参数名 输入/输出 描述
pipe 输入 该指令的执行流水线。
sync_id 输入 事件标号。AIC的取值范围为[0, 31],AIV的取值范围为[0, 15]。

返回值说明

流水类型

PIPE_S

约束说明

  • 需要保证每一个ID的4位计数器不会溢出,否则会出现异常。

  • 需要保证相同的ID只会被一个流水线控制。

  • 每个ID对应一个4位计数器,特定CORE的同步ID计数器可通过其他CORE发起的asc_sync_intra_arrive递增;也可通过本身发起的asc_sync_intra_wait递减。

  • 三个CORE的ID映射规则如下:

    • ID为0~15的Vector Core 0的asc_sync_intra_arrive指令会被映射到Cube Core的0~15的ID。
    • ID为0~15的Vector Core 1的asc_sync_intra_arrive指令会被映射到Cube Core的16~31的ID。
    • ID为0~15的Cube Core的asc_sync_intra_arrive指令会被映射到Vector Core 0的0~15的ID。
    • ID为16~31的Cube Core的asc_sync_intra_arrive指令会被映射到Vector Core 1的0~15的ID。
  • 必须保证配套使用asc_sync_intra_arrive和asc_sync_intra_wait,避免计算核一直处于阻塞阶段。

  • pipe支持的流水类型为PIPE_V、PIPE_M、PIPE_MTE1、PIPE_MTE2、PIPE_MTE3、PIPE_FIX、PIPE_S,不支持PIPE_ALL。

调用示例

// 场景:AIC执行asc_sync_intra_wait等待1个AIV,对应AIV执行asc_sync_intra_arrive通知。
// 注意:asc_sync_intra_wait与asc_sync_intra_arrive必须分别在不同Core上调用,同一Core连续调用无法实现跨核同步。

// ---- AIC核代码 ----
uint64_t sync_id = 1;
asc_sync_intra_wait(PIPE_FIX, sync_id);   // AIC执行wait,等待AIV的arrive使计数器+1后解除阻塞

// ---- AIV核代码 ----
asc_sync_intra_arrive(PIPE_V, sync_id);   // AIV执行arrive,AIC对应sync_id计数器+1