Skip to content
版本

asc_lock

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:不支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持

功能说明

该接口用于AI Core内部异步流水线之间的同步,可按需阻塞指定流水线的执行。

根据mutex_id获取Mutex,若Mutex已被锁定,将阻塞后续指定流水指令队列,直到当前流水的前序指令中对应mutex_id的Mutex被asc_unlock释放。

相对于asc_sync_notify/asc_sync_wait同步机制,使用asc_lock/asc_unlock接口有以下优势:

  • 内聚性更强,使用时与其它流水线解耦,可以简化反向同步。以PIPE_MTE2与PIPE_V之间同步为例,对比如下:

    C++
    // asc_sync_notify/asc_sync_wait机制
    For i=0:100
        if i > 0:
            asc_sync_wait(PIPE_V, PIPE_MTE2, EVENT_ID0)
        endif
        // MTE2指令
        asc_sync_notify(PIPE_MTE2, PIPE_V, EVENT_ID0)
        asc_sync_wait(PIPE_MTE2, PIPE_V, EVENT_ID0)
        // PIPE_V指令
        if i < 99:
            asc_sync_notify(PIPE_V, PIPE_MTE2, EVENT_ID0)
        endif
    endFor
    
    // asc_lock/asc_unlock机制
    For i=0:100
        asc_lock(PIPE_MTE2, 0)
        // MTE2指令
        asc_unlock(PIPE_MTE2, 0)
        asc_lock(PIPE_V, 0)
        // PIPE_V指令
        asc_unlock(PIPE_V, 0)
    endFor
    

    其中EVENT_ID0为同步ID,取值范围为[0, 7];mutex_id取值范围为[0, 31]。

  • 可以使用更多的同步信号量。

函数原型

C++
enum ascMutexExecuteMode {
    ASC_LOCK_BLOCK = 0,
    ASC_LOCK_NON_BLOCK = 1
};

__aicore__ inline void asc_lock(pipe_t pipe, uint8_t mutex_id)
__aicore__ inline void asc_lock(pipe_t pipe, uint8_t mutex_id, const ascMutexExecuteMode mode)

参数说明

表1 参数说明

参数名输入/输出描述
pipe输入指定当前接口所属的流水类型。
mutex_id输入mutex标号,取值范围为[0, 31]。
mode输入可选参数,用于指定是否阻塞流水线,默认值为ASC_LOCK_BLOCK。
• ASC_LOCK_BLOCK:阻塞pipe对应流水线的执行,直到代码中位于当前asc_lock之前且mutex_id相同的所有asc_unlock调用均已执行完成。
• ASC_LOCK_NON_BLOCK:不阻塞pipe对应流水线的执行。

返回值说明

流水类型

PIPE_S

约束说明

  • asc_lock与asc_unlock必须严格成对使用,并使用相同的mutex_id与mode。此外,对应的asc_unlock必须始终写在asc_lock之后,否则硬件行为无定义。
  • 对于mutex_id相同的asc_lock与asc_unlock组合,无论pipe和mode是否相同,都不得在代码中嵌套使用,否则硬件行为将不可预测。
  • 成对使用的asc_lock和asc_unlock必须配置相同的mode,否则硬件行为将不可预测。
  • 如果代码中连续出现多个pipe和mutex_id均相同的调用,则后一个asc_lock不会再阻塞流水线运行。若需要表达同一流水线内的依赖关系,必须使用接口asc_sync_pipe。

调用示例

C++
uint8_t mutex_id = 1;
asc_lock(PIPE_S, mutex_id);
asc_unlock(PIPE_S, mutex_id);

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