12. 执行控制

本章节描述 CANN Runtime 的执行控制接口,包括回调函数启动、Host 函数订阅、超时设置及异步 Reduce 操作。

aclrtLaunchCallback

aclError aclrtLaunchCallback(aclrtCallback fn, void *userData, aclrtCallbackBlockType blockType, aclrtStream stream)

产品支持情况

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

功能说明

在Stream的任务队列中下发一个Host回调任务,系统内部在执行到该回调任务时,会在Stream上注册的线程(该线程由用户自行创建,并通过aclrtSubscribeReport接口注册)中执行回调函数。异步接口。

本接口需与以下其它接口配合使用,以便实现异步场景下的callback功能:

  1. 定义并实现回调函数,函数原型为:typedef void (*aclrtCallback)(void *userData);
  2. 新建线程,在线程函数内,调用aclrtProcessReport接口设置超时时间(需循环调用),等待回调任务执行;
  3. 调用aclrtSubscribeReport接口建立第2步中的线程和Stream的绑定关系,该Stream下发的回调函数将在绑定的线程中执行;
  4. 在指定Stream上执行异步任务(例如异步推理任务);
  5. 调用aclrtLaunchCallback接口在Stream的任务队列中下发回调任务,触发第2步中注册的线程处理回调函数,每调用一次aclrtLaunchCallback接口,就会触发一次回调函数的执行;
  6. 异步任务全部执行完成后,取消线程注册(aclrtUnSubscribeReport接口)。

本接口可用于实现异步场景下的callback功能,与另一个实现异步场景下的callback功能接口aclrtLaunchHostFunc的差别在于:使用aclrtLaunchHostFunc接口时,会在Stream上注册的线程(该线程在本接口内部创建并注册)中执行回调函数,并且回调任务默认阻塞本Stream上后续任务的执行。

对于同一个Stream,两套实现异步场景下的callback功能的接口不能混用,否则可能出现异常。

参数说明

参数名 输入/输出 说明
fn 输入 指定要增加的回调函数。
回调函数的函数原型为:
typedef void (aclrtCallback)(voiduserData)
userData 输入 待传递给回调函数的用户数据的指针。
blockType 输入 指定回调任务是否阻塞本Stream上后续任务的执行。
typedef enum aclrtCallbackBlockType {
ACL_CALLBACK_NO_BLOCK, //非阻塞
ACL_CALLBACK_BLOCK, //阻塞
} aclrtCallbackBlockType;
stream 输入 指定Stream。类型定义请参见aclrtStream

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

回调函数涉及共享资源(例如锁),因此在使用回调函数需慎重,不应该调用资源申请、资源释放、Stream同步、Device同步、任务下发、任务终止等接口,否则可能导致错误或死锁。




aclrtSubscribeReport

aclError aclrtSubscribeReport(uint64_t threadId, aclrtStream stream)

产品支持情况

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

功能说明

注册处理Stream上回调函数的线程。

本接口需与以下其它接口配合使用,以便实现异步场景下的callback功能:

  1. 定义并实现回调函数,函数原型为:typedef void (*aclrtCallback)(void *userData);
  2. 新建线程,在线程函数内,调用aclrtProcessReport接口设置超时时间(需循环调用),等待回调任务执行;
  3. 调用aclrtSubscribeReport接口建立第2步中的线程和Stream的绑定关系,该Stream下发的回调函数将在绑定的线程中执行;
  4. 在指定Stream上执行异步任务(例如异步推理任务);
  5. 调用aclrtLaunchCallback接口在Stream的任务队列中下发回调任务,触发第2步中注册的线程处理回调函数,每调用一次aclrtLaunchCallback接口,就会触发一次回调函数的执行;
  6. 异步任务全部执行完成后,取消线程注册(aclrtUnSubscribeReport接口)。

参数说明

参数名 输入/输出 说明
threadId 输入 指定线程的ID。
stream 输入 指定Stream。类型定义请参见aclrtStream

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

支持多次调用aclrtSubscribeReport接口给多个Stream(仅支持同一Device内的多个Stream)注册同一个处理回调函数的线程;为确保Stream内的任务按调用顺序执行,不支持调用aclrtSubscribeReport接口给同一个Stream注册多个处理回调函数的线程;同一个进程内,在不同的Device上注册回调函数的线程时,不能指定同一个线程ID。

单进程内调用本接口注册的线程数量超过一定限制,则接口返回失败。考虑操作系统的线程切换性能开销,建议调用aclrtSubscribeReport接口注册的线程数量控制在32个以下(包括32)。当前支持的线程数量最大值为1024。




aclrtProcessReport

aclError aclrtProcessReport(int32_t timeout)

产品支持情况

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

功能说明

调用本接口设置超时时间,等待aclrtLaunchCallback接口下发的回调任务执行。

本接口需与以下其它接口配合使用,以便实现异步场景下的callback功能:

  1. 定义并实现回调函数,函数原型为:typedef void (*aclrtCallback)(void *userData);
  2. 新建线程,在线程函数内,调用aclrtProcessReport接口设置超时时间(需循环调用),等待回调任务执行;
  3. 调用aclrtSubscribeReport接口建立第2步中的线程和Stream的绑定关系,该Stream下发的回调函数将在绑定的线程中执行;
  4. 在指定Stream上执行异步任务(例如异步推理任务);
  5. 调用aclrtLaunchCallback接口在Stream的任务队列中下发回调任务,触发第2步中注册的线程处理回调函数,每调用一次aclrtLaunchCallback接口,就会触发一次回调函数的执行;
  6. 异步任务全部执行完成后,取消线程注册(aclrtUnSubscribeReport接口)。

参数说明

参数名 输入/输出 说明
timeout 输入 超时时间,单位为ms。
取值范围:

- -1:表示无限等待
- 大于0(不包含0):表示等待的时间

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtUnSubscribeReport

aclError aclrtUnSubscribeReport(uint64_t threadId, aclrtStream stream)

产品支持情况

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

功能说明

取消线程注册,Stream上的回调函数不再由指定线程处理。

本接口需与以下其它接口配合使用,以便实现异步场景下的callback功能:

  1. 定义并实现回调函数,函数原型为:typedef void (*aclrtCallback)(void *userData);
  2. 新建线程,在线程函数内,调用aclrtProcessReport接口设置超时时间(需循环调用),等待回调任务执行;
  3. 调用aclrtSubscribeReport接口建立第2步中的线程和Stream的绑定关系,该Stream下发的回调函数将在绑定的线程中执行;
  4. 在指定Stream上执行异步任务(例如异步推理任务);
  5. 调用aclrtLaunchCallback接口在Stream的任务队列中下发回调任务,触发第2步中注册的线程处理回调函数,每调用一次aclrtLaunchCallback接口,就会触发一次回调函数的执行;
  6. 异步任务全部执行完成后,取消线程注册(aclrtUnSubscribeReport接口)。

参数说明

参数名 输入/输出 说明
threadId 输入 指定线程的ID。
stream 输入 指定Stream。类型定义请参见aclrtStream

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtGetOpTimeOutInterval

aclError aclrtGetOpTimeOutInterval(uint64_t *interval)

产品支持情况

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

功能说明

获取硬件支持的算子超时配置的最短时间间隔interval,单位为微秒。

对于Atlas 200I/500 A2 推理产品、Atlas 推理系列产品、Atlas 训练系列产品,调用本接口只能获取AI Core算子的最短时间间隔。

参数说明

参数名 输入/输出 说明
interval 输出 最短时间间隔,单位为微秒。
用户可配置且生效的超时时间是interval N,N的取值为[1, 254]的整数,如果用户配置的超时时间不等于interval N,则向上对齐到interval N,假设interval = 100微秒,用户设置的超时时间为50微秒,则实际生效的超时时间为1001 = 100微秒;用户设置的超时时间为30000微秒,则实际生效的超时时间为100 *254 =25400微秒。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtSetOpExecuteTimeOut

aclError aclrtSetOpExecuteTimeOut(uint32_t timeout)

产品支持情况

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

功能说明

设置算子执行的超时时间,单位为秒。一个进程内多次调用本接口,则以最后一次设置的时间为准。

如果算子下发时携带了超时时间,则该超时时间优先级高于本接口设置的超时时间。

对于Ascend 950PR/Ascend 950DT、Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品,建议使用aclrtSetOpExecuteTimeOutV2接口,该接口会返回实际生效的超时时间。

参数说明

参数名 输入/输出 说明
timeout 输入 设置超时时间,单位为秒。
将该参数设置为0时,表示使用最大超时时间。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

  • 不调用本接口,不同产品型号的AI Core算子、AI CPU算子默认超时时间不同:

    • 对于Ascend 950PR/Ascend 950DT,AI Core算子的默认超时时间为1091秒,AI CPU算子的默认超时时间为28秒。
    • 对于Atlas A3 训练系列产品/Atlas A3 推理系列产品,AI Core算子的默认超时时间为1091秒,AI CPU算子的默认超时时间为60秒。
    • 对于Atlas A2 训练系列产品/Atlas A2 推理系列产品,AI Core算子的默认超时时间为1091秒,AI CPU算子的默认超时时间为28秒。
    • 对于Atlas 200I/500 A2 推理产品,AI Core算子的默认超时时间为1091秒,AI CPU算子的默认超时时间为28秒。
    • 对于Atlas 推理系列产品,AI Core算子的默认超时时间为547秒,AI CPU算子的默认超时时间为28秒。
    • 对于Atlas 训练系列产品,AI Core算子的默认超时时间为68秒,AI CPU算子的默认超时时间为28秒。
  • 由于不同产品型号的架构差异,AI Core算子、AI CPU算子的最大超时时间有所不同:

    • 对于Ascend 950PR/Ascend 950DT、Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品,AI Core算子、AI CPU算子最大超时时间为interval * 254,单位是微秒,interval可通过aclrtGetOpTimeoutInterval接口获取。
    • 对于Atlas 200I/500 A2 推理产品,AI Core算子、AI CPU算子最大超时时间为1091秒。
    • 对于Atlas 推理系列产品,AI Core算子的最大超时时间为547秒,AI CPU算子的最大超时时间不支持设置。
    • 对于Atlas 训练系列产品,AI Core算子、AI CPU算子最大超时时间为2176秒。



aclrtSetOpExecuteTimeOutV2

aclError aclrtSetOpExecuteTimeOutV2(uint64_t timeout,  uint64_t *actualTimeout)

产品支持情况

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

功能说明

设置算子执行的超时时间,单位为微秒。如果算子下发时携带了超时时间,则该超时时间优先级高于本接口设置的超时时间。

参数说明

参数名 输入/输出 说明
timeout 输入 设置超时时间,单位为微秒。
将该参数设置为0时,表示使用最大超时时间。
当调用aclrtGetOpTimeOutInterval接口获取的时间间隔小于100000微妙,并且timeout参数设置为0时,表示AI Core算子将永不超时。
actualTimeout 输出 返回实际生效的超时时间,单位为微秒。
如果AI Core算子永不超时,则该参数输出的值为uint64_t的最大值。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

对于Ascend 950PR/Ascend 950DT、Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品,当调用aclrtGetOpTimeoutInterval接口获取的时间间隔小于100000微秒,并且将timeout参数值设置为0时,表示AI Core算子将永不超时,此时,actualTimeout参数输出的值为uint64_t的最大值。

对于Atlas 200I/500 A2 推理产品、Atlas 推理系列产品、Atlas 训练系列产品,调用本接口只能设置AI Core算子执行的超时时间。




aclrtSetOpExecuteTimeOutWithMs

aclError aclrtSetOpExecuteTimeOutWithMs(uint32_t timeout)

产品支持情况

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

功能说明

设置算子执行的超时时间,单位为毫秒。

参数说明

参数名 输入/输出 说明
timeout 输入 设置超时时间,单位为毫秒。将该参数设置为0时,表示使用最大超时时间。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtGetOpExecuteTimeout

aclError aclrtGetOpExecuteTimeout(uint32_t *const timeoutMs)

产品支持情况

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

功能说明

获取AI Core算子执行的超时时间。

对于Ascend 950PR/Ascend 950DT、Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品,如果AI Core算子永不超时,则该参数输出的值为uint32_t的最大值。

参数说明

参数名 输入/输出 说明
timeoutMs 输出 超时时间,单位为毫秒。
若已调用set接口(例如aclrtSetOpExecuteTimeOut)设置过超时时间,则返回硬件的实际超时时间,否则,返回AI Core的默认超时时间。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtGetThreadLastTaskId

aclError aclrtGetThreadLastTaskId(uint32_t *taskId)

产品支持情况

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

功能说明

获取当前线程的最后一个下发的Task ID。

参数说明

参数名 输入/输出 说明
taskId 输出 当前线程的最后一个下发的Task ID。
此处的Task表示由用户显式创建的Stream上下发的Task。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtReduceAsync

aclError aclrtReduceAsync(void *dst, const void *src, uint64_t count, aclrtReduceKind kind, aclDataType type, aclrtStream stream, void *reserve)

产品支持情况

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

功能说明

执行Reduce操作,包括SUM、MIN、MAX等。异步接口。

参数说明

参数名 输入/输出 说明
dst 输入 目的内存地址指针。
src 输入 源内存地址指针。
count 输入 源内存大小,单位为Byte。
kind 输入 操作类型。类型定义请参见aclrtReduceKind
type 输入 数据类型。类型定义请参见aclDataType
stream 输入 指定执行Reduce操作任务的Stream。类型定义请参见aclrtStream
reserve 输入 预留参数。当前固定传NULL。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

dts、src必须跟stream所在的Device是同一个设备。

Ascend 950PR/Ascend 950DT支持如下数据类型:int8、int16、int32、uint32、fp16、fp32、bf16。

Atlas A3 训练系列产品/Atlas A3 推理系列产品支持如下数据类型:int8、int16、int32、fp16、fp32、bf16。

Atlas A2 训练系列产品/Atlas A2 推理系列产品支持如下数据类型:int8、int16、int32、fp16、fp32、bf16。

Atlas 200I/500 A2 推理产品支持如下数据类型:int8、int16、int32、fp16、fp32。

Atlas 推理系列产品支持如下数据类型:fp32 、fp16、int16。

Atlas 训练系列产品仅支持fp32类型。




aclrtLaunchHostFunc

aclError aclrtLaunchHostFunc(aclrtStream stream, aclrtHostFunc fn, void *args)

产品支持情况

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

功能说明

在Stream的任务队列中下发一个Host回调任务,系统内部在执行到该回调任务时,会在Stream上注册的线程(该线程在本接口内部创建并注册)中执行回调函数,并且回调任务默认阻塞本Stream上后续任务的执行。异步接口。

本接口可用于实现异步场景下的callback功能,与另一套实现异步场景下的callback功能接口(aclrtLaunchCallbackaclrtSubscribeReportaclrtProcessReportaclrtUnSubscribeReport)的差别在于:使用aclrtLaunchCallback等接口时,Stream上注册的线程需由用户自行创建并通过aclrtSubscribeReport接口注册,另外也可以指定回调任务是否阻塞本Stream上后续任务的执行。

对于同一个Stream,两套实现异步场景下的callback功能的接口不能混用,否则可能出现异常。

参数说明

参数名 输入/输出 说明
stream 输入 指定执行回调任务的Stream。类型定义请参见aclrtStream
fn 输入 指定要增加的回调函数。
回调函数的函数原型为:
typedef void (aclrtHostFunc)(voidargs)
args 输入 待传递给回调函数的用户数据。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

回调函数涉及共享资源(例如锁),因此在使用回调函数需慎重,不应该调用资源申请、资源释放、Stream同步、Device同步、任务下发、任务终止等接口,否则可能导致错误或死锁。




aclrtRandomNumAsync

aclError aclrtRandomNumAsync(const aclrtRandomNumTaskInfo *taskInfo, const aclrtStream stream, void *reserve)

产品支持情况

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

功能说明

下发并执行随机数生成任务。异步接口。

参数说明

参数名 输入/输出 说明
taskInfo 输入 随机数生成任务信息。类型定义请参见aclrtRandomNumTaskInfo
stream 输入 执行随机数生成任务的Stream。类型定义请参见aclrtStream
reserve 输入 预留参数。当前固定传NULL。

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError




aclrtTaskUpdateAsync

aclError aclrtTaskUpdateAsync(aclrtStream taskStream, uint32_t taskId, aclrtTaskUpdateInfo *info, aclrtStream execStream)

产品支持情况

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

功能说明

刷新目标任务的信息。异步接口。

参数说明

参数名 输入/输出 说明
taskStream 输入 目标任务所在的Stream。类型定义请参见aclrtStream
此处只支持与模型绑定过的Stream,绑定模型与Stream需调用aclmdlRIBindStream接口。
taskId 输入 目标任务ID。
可调用aclrtGetThreadLastTaskId接口获取任务ID。
info 输入 配置信息。类型定义请参见aclrtTaskUpdateInfo
execStream 输入 执行刷新任务的Stream。类型定义请参见aclrtStream

返回值说明

返回0表示成功,返回其他值表示失败,请参见aclError

约束说明

Ascend 950PR/Ascend 950DT产品不支持更新ACL_RT_UPDATE_RANDOM_TASK(随机数生成任务)。