- CANN
- Ascend
- 人工智能
- 任务调度
【免费下载链接】runtime
本项目提供CANN运行时组件和维测功能组件。
CANN(Compute Architecture for Neural Networks)Runtime 的 Stream(流)是设备侧任务执行的基本调度单元,同一 Stream 上的任务按下发顺序串行执行,不同 Stream 上的任务可并行。本文基于 CANN runtime 开源仓库,系统讲解 Stream 管理接口的完整能力:从基础的创建/销毁/同步,到优先级、flag 配置、溢出检测、遇错即停、属性配置及模型绑定等高级特性,帮助读者在 Atlas 系列产品上正确、高效地使用 Stream 管理任务执行。
1. Stream 概述与默认 Stream
在 CANN Runtime 中,Stream 是一系列按序执行的任务队列。任务(如算子下发、内存拷贝)提交到 Stream 后,由 Device 侧的调度器按 FIFO 顺序执行。同一 Stream 内的任务天然有序,无需额外同步;不同 Stream 之间的任务需要借助 Event(事件) 等机制建立依赖关系。
默认 Stream:若应用不显式调用 Stream 创建接口,则每个 Context 对应一个默认 Stream。该默认 Stream 由 aclrtSetDevice 或 aclrtCreateContext 接口隐式创建,其优先级为最高且不支持设置。默认 Stream 适合逻辑简单、无复杂交互的应用;但多线程编程中,多个线程共享默认 Stream 时,执行结果取决于线程调度的顺序。对于大型、复杂交互逻辑的应用,推荐显式创建 Stream,便于控制并发粒度、提高代码可读性与可维护性。
术语约定:本文中"创建 Stream"均指显式创建;下文接口中 stream 参数传入
NULL时,通常代表操作默认 Stream(部分产品型号支持,详见各接口约束)。
2. 接口总览
本文对应的接口清单如下(均在头文件 include/external/acl/acl_rt.h 中声明,实现在 src/acl/aclrt_impl/stream.cpp):
| 接口 | 功能 | 类别 |
|---|---|---|
aclrtCreateStream | 创建 Stream | 创建 |
aclrtCreateStreamWithConfig | 按优先级与 flag 创建 Stream | 创建 |
aclrtDestroyStream | 销毁 Stream(等待任务完成) | 销毁 |
aclrtDestroyStreamForce | 强制销毁 Stream(不等待任务) | 销毁 |
aclrtSetStreamOverflowSwitch | 打开/关闭溢出检测开关 | 诊断 |
aclrtGetStreamOverflowSwitch | 查询溢出检测开关状态 | 诊断 |
aclrtSetStreamFailureMode | 设置任务失败调度模式(遇错即停等) | 调度 |
aclrtStreamQuery | 查询 Stream 任务执行状态 | 查询 |
aclrtSynchronizeStream | 同步 Stream(阻塞至任务完成) | 同步 |
aclrtSynchronizeStreamWithTimeout | 带超时的同步 | 同步 |
aclrtNonBlockingLaunchBegin/End | 标记异步执行区间 | 调度 |
aclrtStreamAbort | 停止任务并丢弃未执行任务 | 调度 |
aclrtStreamGetId | 获取 Stream ID | 查询 |
aclrtGetStreamAvailableNum | 获取剩余可用 Stream 数 | 查询 |
aclrtSetStreamAttribute | 设置 Stream 属性 | 属性 |
aclrtGetStreamAttribute | 获取 Stream 属性 | 属性 |
aclrtActiveStream | 激活 Stream(异步) | 调度 |
aclrtSwitchStream | 按条件跳转 Stream(异步) | 调度 |
aclrtRegStreamStateCallback | 注册 Stream 状态回调 | 回调 |
aclrtStreamStop | 仅停止正在执行的任务 | 调度 |
aclrtPersistentTaskClean | 清理 PERSISTENT 类型任务 | 调度 |
aclrtStreamGetPriority | 查询 Stream 优先级 | 查询 |
aclrtStreamGetFlags | 查询创建时的 flag | 查询 |
3. 创建 Stream
3.1 aclrtCreateStream——基础创建
aclError aclrtCreateStream(aclrtStream *stream);功能:创建 Stream。该接口不提供优先级设置,创建的 Stream 优先级默认为最高;如需在创建时指定优先级,应使用aclrtCreateStreamWithConfig。
参数:
| 参数 | 输入/输出 | 说明 |
|---|---|---|
| stream | 输出 | Stream 的指针,类型定义见 aclrtStream |
返回值:返回 0 表示成功,其他值表示失败,错误码参见 aclError。
约束:不同型号硬件支持的最大 Stream 数不同。若已存在多个 Stream(含默认 Stream),只能显式创建 N 个,其中 N = Stream 最大数 − 已存在的 Stream 数。例如最大数为 1024、已存在 2 个 Stream 时,只能再显式创建 1022 个。各产品最大数如下:
| 产品型号 | Stream 最大数 |
|---|---|
| Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列 | 1984 |
| Atlas 200I/500 A2 推理产品 | 512 |
| Atlas 推理系列产品 | 1024 |
| Atlas 训练系列产品 | 2048 |
多进程场景下,若一次性创建的 Stream 数量总和接近 2048,可能出现创建失败。此时建议:(1) 清理冗余 Stream;(2) 分批创建 Stream,直至总数接近上限。
源码佐证:在 src/acl/aclrt_impl/stream.cpp#L38-L51 中,aclrtCreateStreamImpl直接以RT_STREAM_PRIORITY_DEFAULT调用底层rtStreamCreate,确认了"默认最高优先级"的语义;同时通过ACL_ADD_APPLY_TOTAL_COUNT/ACL_ADD_APPLY_SUCCESS_COUNT统计 Stream 的创建/销毁次数(对应资源统计中的ACL_STATISTICS_CREATE_DESTROY_STREAM)。
3.2 aclrtCreateStreamWithConfig——按优先级与 flag 创建
aclError aclrtCreateStreamWithConfig(aclrtStream *stream, uint32_t priority, uint32_t flag);功能:在当前进程或线程中创建 Stream。相比aclrtCreateStream,本接口可创建"快速下发任务"的 Stream(见 flag 说明),代价是增加内存或 CPU 消耗。
参数:
| 参数 | 输入/输出 | 说明 |
|---|---|---|
| stream | 输出 | Stream 的指针 |
| priority | 输入 | 优先级,数字越小优先级越高 |
| flag | 输入 | 宏定义值,支持单个宏或按位或组合;对不支持位或的宏返回报错。配置其他值时创建的 Stream 等同于aclrtCreateStream |
flag 取值说明(宏定义均位于 include/external/acl/acl_rt.h#L36-L41):
| flag 宏 | 值 | 语义 |
|---|---|---|
ACL_STREAM_FAST_LAUNCH | 0x00000001U | 创建 Stream 时预申请系统内部资源,下发任务更快。一次性创建、多次下发任务的场景总耗时更短,但内存消耗增加 |
ACL_STREAM_FAST_SYNC | 0x00000002U | 同步时主动查询任务状态而非被动等待通知,aclrtSynchronizeStream等待时间更短,但 CPU 消耗增加 |
ACL_STREAM_PERSISTENT | 0x00000004U | 任务不立即执行、执行完不立即销毁资源,销毁 Stream 时才释放。用于与模型绑定,配合 aclmdlRIBindStream |
ACL_STREAM_HUGE | 0x00000008U | Stream 可容纳的 Task 数量更大。当前版本设置该 flag 不生效 |
ACL_STREAM_CPU_SCHEDULE | 0x00000010U | 用于队列方式模型推理场景承载 AI CPU 调度任务,预留功能 |
ACL_STREAM_DEVICE_USE_ONLY | 0x00000020U | 表示该 Stream 仅在 Device 上调用。仅 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列、Atlas 推理系列产品支持 |
ACL_STREAM_FAST_LAUNCH与ACL_STREAM_FAST_SYNC的权衡本质是"资源/CPU 消耗换取延迟":FAST_LAUNCH 将资源申请从首次下发时点前置到创建时点;FAST_SYNC 将同步等待从被动阻塞改为主动轮询。
源码佐证:在 src/acl/aclrt_impl/stream.cpp#L53-L93 中,aclrtCreateStreamWithConfigImpl将各 ACL flag 逐一映射为底层 RT flag(如ACL_STREAM_FAST_LAUNCH → RT_STREAM_FAST_LAUNCH、ACL_STREAM_DEVICE_USE_ONLY → RT_STREAM_CP_PROCESS_USE),再通过rtsStreamCreate携带优先级与 flag 属性下发。由此可推断:priority与flag最终会被编码进rtStreamCreateAttr_t属性数组并传递给 Runtime 底层创建逻辑。
4. 销毁 Stream
4.1 aclrtDestroyStream——等待后销毁
aclError aclrtDestroyStream(aclrtStream stream);销毁通过aclrtCreateStream或aclrtCreateStreamWithConfig创建的 Stream;若 Stream 上存在未完成任务,会等待任务完成后再销毁。
约束:
- 调用前需先调用
aclrtSynchronizeStream确保任务全部完成; - 销毁时该 Stream 必须位于当前 Context 下;
- 销毁时需确保没有其他接口正在使用该 Stream。
4.2 aclrtDestroyStreamForce——强制销毁
aclError aclrtDestroyStreamForce(aclrtStream stream);不等待未完成任务,直接强制销毁 Stream。约束:销毁时 Stream 必须在当前 Context 下。
源码佐证:实现分别调用rtStreamDestroy与rtStreamDestroyForce(src/acl/aclrt_impl/stream.cpp#L95-L119),"等待/不等待"的差异完全由底层 Runtime 语义保证。在示例 example/1_basic_features/stream/0_simple_stream/main.cpp 的收尾阶段即使用aclrtDestroyStreamForce(stream)强制释放资源。
5. 同步与查询
5.1 aclrtSynchronizeStream——阻塞同步
aclError aclrtSynchronizeStream(aclrtStream stream);阻塞 Host 侧当前线程,直到指定 Stream 上所有任务执行完成。注意:通过aclrtCreateStreamWithConfig并以ACL_STREAM_PERSISTENT、ACL_STREAM_DEVICE_USE_ONLY或ACL_STREAM_CPU_SCHEDULE创建的 Stream,本接口不触发业务处理逻辑,直接返回成功。
源码佐证:src/acl/aclrt_impl/stream.cpp#L121-L135 定义了"可视为同步成功"的底层错误码集合succStmSyncErrCodes,包括ACL_ERROR_RT_END_OF_SEQUENCE(序列结束)、ACL_ERROR_RT_MODEL_ABORT_NORMAL(模型正常中止)、ACL_ERROR_RT_AICORE_OVER_FLOW/ACL_ERROR_RT_AIVEC_OVER_FLOW/ACL_ERROR_RT_OVER_FLOW(溢出)以及ACL_ERROR_RT_SOCKET_CLOSE(socket 关闭)。即:这些"业务级"返回码不会被视为同步失败,体现了同步语义对溢出检测、模型正常中止等场景的兼容。
5.2 aclrtSynchronizeStreamWithTimeout——带超时同步
aclError aclrtSynchronizeStreamWithTimeout(aclrtStream stream, int32_t timeout);在aclrtSynchronizeStream基础上支持超时退出,适用于应用程序异常时的自我保护。timeout 取值:
-1:永久等待,与aclrtSynchronizeStream等价;>0:超时时间,单位毫秒。
源码佐证:src/acl/aclrt_impl/stream.cpp#L137-L165 中对timeout < -1会报ACL_ERROR_RT_PARAM_INVALID并提示期望取值[-1, INT_MAX];当底层返回ACL_ERROR_RT_STREAM_SYNC_TIMEOUT时原样透传,调用方可据此识别"同步超时"。
5.3 aclrtStreamQuery——查询任务执行状态
aclError aclrtStreamQuery(aclrtStream stream, aclrtStreamStatus *status);查询指定 Stream 上所有任务的执行状态。status类型见 aclrtStreamStatus。通过aclrtCreateStreamWithConfig并以ACL_STREAM_PERSISTENT、ACL_STREAM_DEVICE_USE_ONLY或ACL_STREAM_CPU_SCHEDULE创建的 Stream,查询到的 status 无实际业务语义。
源码佐证:src/acl/aclrt_impl/stream.cpp#L187-L202 将底层RT_ERROR_NONE映射为ACL_STREAM_STATUS_COMPLETE、将ACL_ERROR_RT_STREAM_NOT_COMPLETE映射为ACL_STREAM_STATUS_NOT_READY,其余错误码透传返回。示例 example/1_basic_features/stream/0_simple_stream/main.cpp 在aclrtSynchronizeStream之后调用aclrtStreamQuery验证任务已全部完成。
6. 任务调度控制
6.1 aclrtSetStreamFailureMode——遇错即停/遇错继续
aclError aclrtSetStreamFailureMode(aclrtStream stream, uint64_t mode);当一个 Stream 上下发多个任务时,本接口控制某个任务失败后是否继续执行下一个任务:
| mode 取值 | 语义 |
|---|---|
ACL_CONTINUE_ON_FAILURE | 默认值。任务失败后继续执行下一个任务 |
ACL_STOP_ON_FAILURE | 任务失败后停止后续任务,即"遇错即停"。触发后不再支持下发新任务 |
约束:
- 针对指定 Stream 只能调用一次本接口;
- 当 Stream 设置了遇错即停,其所在 Context 下的其他 Stream 也是遇错即停;
- Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列支持传入
NULL(默认 Stream);Atlas 200I/500 A2 推理产品、Atlas 推理系列、Atlas 训练系列不支持传入NULL。
源码佐证:src/acl/aclrt_impl/stream.cpp#L278-L285 直接透传底层rtStreamSetMode;示例代码 中aclrtSetStreamFailureMode(stream, ACL_STOP_ON_FAILURE)将显式创建的 Stream 设置为遇错即停,可见该接口在真实工程中的典型用法。
6.2 aclrtNonBlockingLaunchBegin / aclrtNonBlockingLaunchEnd——异步执行区间标记
aclError aclrtNonBlockingLaunchBegin(aclrtStream stream, uint64_t flag); aclError aclrtNonBlockingLaunchEnd(aclrtStream stream, uint64_t flag);当环境变量ASCEND_RT_LAUNCH_BLOCKING配置为 1,或通过aclrtSetStreamAttribute将 Stream 设置为同步模式(ACL_STREAM_LAUNCH_BLOCKING_MODE)时,用 Begin/End 成对标记一个异步执行区间。区间内以下接口下发的任务保持异步模式:
aclrtLaunchKernel、aclrtLaunchKernelV2、aclrtLaunchKernelWithConfigaclrtLaunchKernelWithHostArgs、aclrtLaunchKernelWithArgsArrayaclrtLaunchSIMTKernelWithArgsArray、aclrtLaunchSIMTKernelWithHostArgsaclmdlRIExecuteAsync
参数:stream指定 Stream,传NULL表示默认 Stream;flag为预留参数,当前固定配置为 0。
行为细节:
aclrtNonBlockingLaunchEnd调用时,若已不存在尚未结束的 Begin 调用且当前 Stream 需要同步,会等待该 Stream 上已下发任务完成后再返回;若仍有未结束的 Begin,则继续采用异步模式;- 本接口设置的异步模式优先级高于
ASCEND_RT_LAUNCH_BLOCKING环境变量和ACL_STREAM_LAUNCH_BLOCKING_MODE属性; - Begin/End 必须成对使用且 Stream 相同;未先调用 Begin 就调用 End 会返回失败;
- 支持嵌套调用,每层 Begin 需对应一层 End:
aclrtNonBlockingLaunchBegin(stream, 0); // 外层开始 aclrtNonBlockingLaunchBegin(stream, 0); // 内层开始 aclrtNonBlockingLaunchEnd(stream, 0); // 内层结束 aclrtNonBlockingLaunchEnd(stream, 0); // 外层结束约束:不支持绑定模型运行实例(aclmdlRIBindStream)的 Stream;Stream 必须不处于捕获状态;不支持以ACL_STREAM_PERSISTENT、ACL_STREAM_CPU_SCHEDULE、ACL_STREAM_DEVICE_USE_ONLY创建的 Stream;产品支持范围限于 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列。
源码佐证:src/acl/aclrt_impl/stream.cpp#L167-L185 中 Begin/End 实现会先校验flag == 0(ACL_CHECK_RESERVED_PARAM_REPORT_RET,违反返回ACL_ERROR_INVALID_PARAM),再调用底层rtNonBlockingLaunchBegin/rtNonBlockingLaunchEnd。
6.3 aclrtStreamAbort——停止并丢弃任务
aclError aclrtStreamAbort(aclrtStream stream);停止指定 Stream 上正在执行的任务,并丢弃已下发未执行的任务。接口执行期间,该 Stream 上新下发的任务不再生效。
约束:
- 不支持绑定模型运行实例的 Stream;
- 若有其他 Stream 依赖该 Stream(如通过 aclrtRecordEvent、aclrtStreamWaitEvent 建立跨流同步),其他 Stream 可能卡住,此时需显式调用本接口清除依赖任务;
- 清除任务期间再调用同步等待接口(如
aclrtSynchronizeStream、aclrtSynchronizeEvent),同步接口会退出并返回ACL_ERROR_RT_STREAM_ABORT; - Ascend 950PR/950DT 不支持以
ACL_STREAM_PERSISTENT创建的 Stream。
源码佐证:src/acl/aclrt_impl/stream.cpp#L305-L313 直接调用底层rtStreamAbort。
6.4 aclrtStreamStop——仅停止正在执行的任务
aclError aclrtStreamStop(aclrtStream stream);与aclrtStreamAbort不同,本接口只停止正在执行的任务,不清理任务。约束:不支持绑定模型运行实例的 Stream,不支持默认 Stream(传NULL)。
源码佐证:src/acl/aclrt_impl/stream.cpp#L397-L405 调用底层rtsStreamStop。
6.5 aclrtActiveStream——激活 Stream(异步)
aclError aclrtActiveStream(aclrtStream activeStream, aclrtStream stream);异步接口。激活后,被激活的activeStream上的任务与当前stream上的任务并行执行。两个参数均只支持与模型绑定过的 Stream(需先调用aclrtCreateStreamWithConfig+aclmdlRIBindStream完成绑定)。产品支持:Ascend 950PR/950DT、Atlas A2 训练/推理系列、Atlas 200I/500 A2 推理产品、Atlas 推理系列、Atlas 训练系列(Atlas A3 系列不支持)。
6.6 aclrtSwitchStream——按条件跳转(异步)
aclError aclrtSwitchStream(void *leftValue, aclrtCondition cond, void *rightValue, aclrtCompareDataType dataType, aclrtStream trueStream, aclrtStream falseStream, aclrtStream stream);异步接口。根据leftValue与rightValue的比较结果在 Stream 之间跳转:跳转成功后只执行所跳转 Stream 上的任务,当前 Stream 上的任务停止执行。
参数:
| 参数 | 输入/输出 | 说明 |
|---|---|---|
| leftValue | 输入 | 左值数据的 Device 内存地址 |
| cond | 输入 | 比较条件,见 aclrtCondition |
| rightValue | 输入 | 右值数据的 Device 内存地址 |
| dataType | 输入 | 左右值数据类型,见 aclrtCompareDataType |
| trueStream | 输入 | 条件成立时执行的 Stream |
| falseStream | 输入 | 预留参数,当前固定传NULL |
| stream | 输入 | 执行跳转任务的 Stream |
源码佐证:src/acl/aclrt_impl/stream.cpp#L374-L395 中校验falseStream必须为nullptr(ACL_CHECK_INVALID_PARAM_NO_VALUE),否则报参数非法,与文档"预留参数固定传 NULL"一致;随后将 ACL 枚举强转为底层rtCondition_t/rtSwitchDataType_t调用rtsSwitchStream。
7. 溢出检测与 Stream 属性
7.1 溢出检测开关
aclError aclrtSetStreamOverflowSwitch(aclrtStream stream, uint32_t flag); aclError aclrtGetStreamOverflowSwitch(aclrtStream stream, uint32_t *flag);在饱和模式下对接上层训练框架(如 PyTorch)时,按 Stream 粒度打开/关闭溢出检测。flag 取值:0 关闭、1 打开。
- 打开/关闭后仅对后续新下发的任务生效,已下发任务维持原样;
- 关闭后无法通过溢出检测算子获取任务是否溢出;
- 产品支持:仅 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列支持(Atlas 200I/500 A2、Atlas 推理系列、Atlas 训练系列、IPV350 不支持)。
源码佐证:src/acl/aclrt_impl/stream.cpp#L296-L303 中先校验flag只能为 0 或 1(ACL_CHECK_INVALID_VALUE_WITH_EXPECT),再调用rtSetStreamOverflowSwitch。结合 第 5.1 节 的succStmSyncErrCodes集合中包含溢出类错误码,可推断溢出检测与同步语义在底层是打通的:溢出不中断任务执行,但同步时作为"成功但需关注"的信号返回。
7.2 aclrtSetStreamAttribute / aclrtGetStreamAttribute——属性读写
aclError aclrtSetStreamAttribute(aclrtStream stream, aclrtStreamAttr stmAttrType, aclrtStreamAttrValue *value); aclError aclrtGetStreamAttribute(aclrtStream stream, aclrtStreamAttr stmAttrType, aclrtStreamAttrValue *value);设置/获取 Stream 属性值。stmAttrType见 aclrtStreamAttr,value见 aclrtStreamAttrValue。
约束:
- 溢出检测属性:设置后仅对后续新下发任务生效;
ACL_STREAM_LAUNCH_BLOCKING_MODE属性:仅 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列支持。不支持对绑定模型运行实例的 Stream、以及以ACL_STREAM_PERSISTENT/ACL_STREAM_CPU_SCHEDULE/ACL_STREAM_DEVICE_USE_ONLY创建的 Stream 设置/获取;设置/获取时 Stream 必须不处于捕获状态;- 当 Stream 已设置遇错即停,其所在 Context 下的其他 Stream 也是遇错即停;
- Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列支持传
NULL(默认 Stream,但不支持对默认 Stream 设置 Failure Mode);Atlas 200I/500 A2、Atlas 推理系列、Atlas 训练系列不支持传NULL。
源码佐证:src/acl/aclrt_impl/stream.cpp#L335-L359 中属性读写分别透传rtsStreamSetAttribute/rtsStreamGetAttribute,并借助acl::GetStreamAttrDesc打印属性类型的可读描述用于日志,说明属性类型在 ACL 层有统一的枚举描述注册(可参考 src/inc/enum_name_registry.h 的枚举名注册机制)。
8. 查询类接口
8.1 aclrtStreamGetId——获取 Stream ID
aclError aclrtStreamGetId(aclrtStream stream, int32_t *streamId);获取指定 Stream 的 ID,传NULL时获取默认 Stream 的 ID。实现位于 src/acl/aclrt_impl/stream.cpp#L315-L321,调用rtsStreamGetId。
8.2 aclrtGetStreamAvailableNum——剩余可用 Stream 数
aclError aclrtGetStreamAvailableNum(uint32_t *streamCount);获取当前 Device 上剩余可用的 Stream 数量,可用于在创建大量 Stream 前做容量预判(结合 3.1 节 的型号上限)。实现调用rtsStreamGetAvailableNum(src/acl/aclrt_impl/stream.cpp#L323-L333)。
8.3 aclrtStreamGetPriority——查询优先级
aclError aclrtStreamGetPriority(aclrtStream stream, uint32_t *priority);查询指定 Stream 的优先级,数字越小优先级越高,取值范围与aclrtCreateStreamWithConfig的 priority 参数一致;传NULL时查询默认 Stream。实现调用rtStreamGetPriority(src/acl/aclrt_impl/stream.cpp#L204-L215)。
8.4 aclrtStreamGetFlags——查询创建 flag
aclError aclrtStreamGetFlags(aclrtStream stream, uint32_t *flags);查询创建 Stream 时设置的 flag。多个 flag 返回按位或结果(如配置0x01U | 0x02U返回0x03U),未配置返回 0。对于默认 Stream,不同产品型号的 flag 可能存在差异,应以本接口查询结果为准。实现位于 src/acl/aclrt_impl/stream.cpp#L217-L247,将底层 RT flag 反向映射回 ACL flag 后再输出。
9. 模型绑定与持久化任务
9.1 aclrtRegStreamStateCallback——Stream 状态回调
aclError aclrtRegStreamStateCallback(const char *regName, aclrtStreamStateCallback callback, void *args);注册 Stream 状态回调函数,不支持重复注册。当 Stream 状态变化(如调用aclrtCreateStream、aclrtDestroyStream)时,Runtime 模块触发回调。此处的 Stream 包含显式创建的 Stream 与默认 Stream。
参数:
regName:注册唯一名称,不能为空,字符串以\0结尾;callback:回调函数;非NULL表示注册,为NULL表示取消注册;args:传递给回调函数的用户数据指针。
回调函数原型:
typedef enum { ACL_RT_STREAM_STATE_CREATE_POST = 1, // 调用 create 接口(如 aclrtCreateStream)之后 ACL_RT_STREAM_STATE_DESTROY_PRE, // 调用 destroy 接口(如 aclrtDestroyStream)之前 } aclrtStreamState; typedef void (*aclrtStreamStateCallback)(aclrtStream stm, aclrtStreamState state, void *args);利用该回调可以在 Stream 生命周期关键节点(创建后、销毁前)挂接用户自定义逻辑,例如资源追踪、监控告警或统计上报。
9.2 aclrtPersistentTaskClean——清理持久化任务
aclError aclrtPersistentTaskClean(aclrtStream stream);清理ACL_STREAM_PERSISTENT类型 Stream 上的任务,适用于不删除该类型 Stream 的情况下重新下发任务的场景。该类型 Stream 必须通过aclrtCreateStreamWithConfig创建。实现调用rtsPersistentTaskClean(src/acl/aclrt_impl/stream.cpp#L407-L415)。
典型场景:
ACL_STREAM_PERSISTENTStream 与模型运行实例绑定(aclmdlRIBindStream),用于模型构建阶段。任务在销毁 Stream 时才释放资源,因此需要显式调用aclrtPersistentTaskClean完成一轮任务清理后再下发下一轮,相关模型运行实例管理接口参见 15_model_running_instance_management.md。
10. 综合使用示例
将上述接口串联成一个完整的生命周期(基于 example/1_basic_features/stream/0_simple_stream/main.cpp 的结构并加以扩充):
#include "acl/acl.h" #define CHECK_ERROR(expr) \ do { \ aclError ret = (expr); \ if (ret != ACL_SUCCESS) { \ /* 错误处理:打印并退出 */ \ return ret; \ } \ } while (0) int main() { aclrtStream stream = nullptr; aclrtStreamStatus streamStatus; CHECK_ERROR(aclInit(nullptr)); CHECK_ERROR(aclrtSetDevice(0)); // 隐式创建默认 Stream // 1. 创建显式 Stream:高优先级 + 快速下发 CHECK_ERROR(aclrtCreateStreamWithConfig( &stream, 0 /* 优先级,数字越小越高 */, ACL_STREAM_FAST_LAUNCH | ACL_STREAM_FAST_SYNC)); // 2. 查询创建时的 flag(期望返回 0x03U) uint32_t flags = 0; CHECK_ERROR(aclrtStreamGetFlags(stream, &flags)); // 3. 设置遇错即停(每个 Stream 只能设置一次) CHECK_ERROR(aclrtSetStreamFailureMode(stream, ACL_STOP_ON_FAILURE)); // 4. 下发任务(省略算子参数),同一 Stream 内顺序执行 // aclrtLaunchKernel(...); // 5. 查询执行状态 / 同步等待完成 CHECK_ERROR(aclrtStreamQuery(stream, &streamStatus)); // NOT_READY / COMPLETE CHECK_ERROR(aclrtSynchronizeStreamWithTimeout(stream, 1000)); // 最多等待 1000ms // 6. 获取剩余可用 Stream 数,评估后续创建容量 uint32_t available = 0; CHECK_ERROR(aclrtGetStreamAvailableNum(&available)); // 7. 强制销毁(不等待未完成任务) CHECK_ERROR(aclrtDestroyStreamForce(stream)); CHECK_ERROR(aclrtResetDevice(0)); aclFinalize(); return 0; }运行环境与前提:本仓库提供示例与编译脚本,可参考 example/1_basic_features/stream/0_simple_stream/README.md(以及英文版 README_en.md)了解编译运行方式;实际运行需要 Atlas 训练/推理系列等受支持硬件、对应版本的 CANN 工具链,并保证 Runtime 版本与 CANN 版本匹配(相关问题排查可参考 docs/zh/FAQ 目录下的《Runtime版本与CANN版本不匹配导致的问题》)。
11. 常见问题与排查建议
- 创建 Stream 失败(数量超限):先用
aclrtGetStreamAvailableNum查询剩余额度,对照 3.1 节 的型号上限,清理冗余 Stream 或分批创建。 - 遇错即停后无法下发新任务:
ACL_STOP_ON_FAILURE触发后不支持再下发新任务,需要销毁重建 Stream;且该 Context 下其他 Stream 同样处于遇错即停状态。 - 同步卡死:优先使用
aclrtSynchronizeStreamWithTimeout设置超时,超时返回ACL_ERROR_RT_STREAM_SYNC_TIMEOUT后可结合 错误码参考 与 日志接口 定位 Device 侧问题;遇错即停/异常场景下可参考 FAQ 中的遇错即停错误定位方法。 - Stream 被占用无法销毁:确认该 Stream 未被绑定模型运行实例、未被其他接口使用,必要时改用
aclrtDestroyStreamForce。 - 属性设置失败:确认产品型号支持对应的
ACL_STREAM_LAUNCH_BLOCKING_MODE等属性,并检查 Stream 是否处于捕获状态或绑定状态。
12. 关联资料
- 接口头文件:include/external/acl/acl_rt.h(含全部 flag 宏定义与接口声明)
- 接口实现:src/acl/aclrt_impl/stream.cpp(所有
*Impl函数的底层调用链) - 运行示例:example/1_basic_features/stream 目录下的
0_simple_stream、1_stream_with_failure_mode、2_multi_stream、3_stream_config_query、4_stream_resource_budget - 相关章节:Stream 编程模型(开发指南)、Event 管理、任务下发与内核执行、模型运行实例管理
- 环境变量:
ASCEND_RT_LAUNCH_BLOCKING(见 docs/zh/env_vars/ASCEND_RT_LAUNCH_BLOCKING.md)
- CANN
- Ascend
- 人工智能
- 任务调度
【免费下载链接】runtime
本项目提供CANN运行时组件和维测功能组件。
相关推荐
CANN opbase 中 aclDestroyTensor 接口详解:aclTensor 的创建与销毁生命周期管理
CANN opbase 中 aclDestroyTensor 接口详解:aclTensor 的创建与销毁生命周期管理 导读 在 CANN 算子库基础框架库 op
人工智能算子库CANNAscendCANN Runtime Stream管理完全指南:创建、同步、优先级与遇错即停
CANN Runtime Stream管理完全指南:创建、同步、优先级与遇错即停 Stream 是 CANN Runtime 中任务下发与调度的核心抽象,本文基
CANNAscend人工智能任务调度aclDestroyBoolArray 接口详解:CANN opbase 中 aclBoolArray 的销毁与生命周期管理
aclDestroyBoolArray 接口详解:CANN opbase 中 aclBoolArray 的销毁与生命周期管理 导读 aclDestroyBool
人工智能算子库CANNAscend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考