Skip to content
版本

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

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

block内同步场景可细分为两类:

  • AIC执行asc_sync_intra_arrive,对应的AIV执行asc_sync_intra_wait。当AIC执行完asc_sync_intra_arrive时,AIV对应sync_id的计数器增加1。若AIV该sync_id的计数器为非0,则解除AIV的阻塞,asc_sync_intra_wait后的指令继续执行,该sync_id的计数器减1。总计AIC 1次调用asc_sync_intra_arrive,单个AIV完成1次asc_sync_intra_wait才算配对使用。

  • 1个AIV执行asc_sync_intra_arrive,对应的AIC执行asc_sync_intra_wait。当AIV执行完asc_sync_intra_arrive时,AIC对应sync_id的计数器增加1。若AIC该sync_id的计数器为非0,则解除AIC的阻塞,asc_sync_intra_wait后的指令继续执行,该sync_id的计数器减1。总计单个AIV 1次asc_sync_intra_arrive,对应AIC 1次调用asc_sync_intra_wait才算配对使用。

以图1为例,演示1个AI Core中AIV1与AIC进行同步(AIV1-2发起asc_sync_intra_arrive)。

AIC 1中在执行asc_sync_intra_wait后,此时AIC 1 sync_id=0的计数器为0,后续所有指令全部被阻塞,需要等到1个AIV执行完asc_sync_intra_arrive。

  • AIV 1-1不需要执行asc_sync_intra_arrive。
  • AIV 1-2的PIPE_MTE3指令全部执行完毕后,asc_sync_intra_arrive生效。此时调度模块感知1个AIV已执行完asc_sync_intra_arrive,因此将AIC 1 sync_id=0的计数器值增加为1。AIC 1检测到对应的sync_id=0的计数器变为1,则AIC 1核解除阻塞,继续执行后续PIPE_FIX的指令,并且将计数器值减去1。

图1 block内同步时序图(AIV进行asc_sync_intra_arrive)

函数原型

C++
__aicore__ inline void asc_sync_intra_arrive(pipe_t pipe, uint8_t sync_id)
__aicore__ inline void asc_sync_intra_arrive(pipe_t pipe, uint64_t sync_id)

参数说明

表1 参数说明

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

返回值说明

流水类型

PIPE_S

约束说明

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

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

  • 每个ID对应一个计数器,特定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。

  • 一个核连续发出的asc_sync_intra_arrive,硬件不保证执行顺序。

调用示例

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

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

// ---- AIC核代码 ----
asc_sync_intra_wait(PIPE_FIX, sync_id);   // AIC执行wait,计数器>0则解除阻塞并-1

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区