CANN Runtime Stream管理接口详解:创建、同步、销毁与高级特性
2026/9/20 1:53:47 网站建设 项目流程
  • CANN
  • Ascend
  • 人工智能
  • 任务调度

【免费下载链接】runtime

本项目提供CANN运行时组件和维测功能组件。

项目地址:https://gitcode.com/cann/runtime
点击查看免费下载

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_LAUNCH0x00000001U创建 Stream 时预申请系统内部资源,下发任务更快。一次性创建、多次下发任务的场景总耗时更短,但内存消耗增加
ACL_STREAM_FAST_SYNC0x00000002U同步时主动查询任务状态而非被动等待通知,aclrtSynchronizeStream等待时间更短,但 CPU 消耗增加
ACL_STREAM_PERSISTENT0x00000004U任务不立即执行、执行完不立即销毁资源,销毁 Stream 时才释放。用于与模型绑定,配合 aclmdlRIBindStream
ACL_STREAM_HUGE0x00000008UStream 可容纳的 Task 数量更大。当前版本设置该 flag 不生效
ACL_STREAM_CPU_SCHEDULE0x00000010U用于队列方式模型推理场景承载 AI CPU 调度任务,预留功能
ACL_STREAM_DEVICE_USE_ONLY0x00000020U表示该 Stream 仅在 Device 上调用。仅 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列、Atlas 推理系列产品支持

ACL_STREAM_FAST_LAUNCHACL_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_LAUNCHACL_STREAM_DEVICE_USE_ONLY → RT_STREAM_CP_PROCESS_USE),再通过rtsStreamCreate携带优先级与 flag 属性下发。由此可推断:priorityflag最终会被编码进rtStreamCreateAttr_t属性数组并传递给 Runtime 底层创建逻辑。

4. 销毁 Stream

4.1 aclrtDestroyStream——等待后销毁

aclError aclrtDestroyStream(aclrtStream stream);

销毁通过aclrtCreateStreamaclrtCreateStreamWithConfig创建的 Stream;若 Stream 上存在未完成任务,会等待任务完成后再销毁。

约束

  • 调用前需先调用aclrtSynchronizeStream确保任务全部完成;
  • 销毁时该 Stream 必须位于当前 Context 下;
  • 销毁时需确保没有其他接口正在使用该 Stream。

4.2 aclrtDestroyStreamForce——强制销毁

aclError aclrtDestroyStreamForce(aclrtStream stream);

不等待未完成任务,直接强制销毁 Stream。约束:销毁时 Stream 必须在当前 Context 下。

源码佐证:实现分别调用rtStreamDestroyrtStreamDestroyForce(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_PERSISTENTACL_STREAM_DEVICE_USE_ONLYACL_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_PERSISTENTACL_STREAM_DEVICE_USE_ONLYACL_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 成对标记一个异步执行区间。区间内以下接口下发的任务保持异步模式:

  • aclrtLaunchKernelaclrtLaunchKernelV2aclrtLaunchKernelWithConfig
  • aclrtLaunchKernelWithHostArgsaclrtLaunchKernelWithArgsArray
  • aclrtLaunchSIMTKernelWithArgsArrayaclrtLaunchSIMTKernelWithHostArgs
  • aclmdlRIExecuteAsync

参数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_PERSISTENTACL_STREAM_CPU_SCHEDULEACL_STREAM_DEVICE_USE_ONLY创建的 Stream;产品支持范围限于 Ascend 950PR/950DT、Atlas A3 训练/推理系列、Atlas A2 训练/推理系列。

源码佐证:src/acl/aclrt_impl/stream.cpp#L167-L185 中 Begin/End 实现会先校验flag == 0ACL_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);

异步接口。根据leftValuerightValue的比较结果在 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必须为nullptrACL_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 状态变化(如调用aclrtCreateStreamaclrtDestroyStream)时,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. 常见问题与排查建议

  1. 创建 Stream 失败(数量超限):先用aclrtGetStreamAvailableNum查询剩余额度,对照 3.1 节 的型号上限,清理冗余 Stream 或分批创建。
  2. 遇错即停后无法下发新任务ACL_STOP_ON_FAILURE触发后不支持再下发新任务,需要销毁重建 Stream;且该 Context 下其他 Stream 同样处于遇错即停状态。
  3. 同步卡死:优先使用aclrtSynchronizeStreamWithTimeout设置超时,超时返回ACL_ERROR_RT_STREAM_SYNC_TIMEOUT后可结合 错误码参考 与 日志接口 定位 Device 侧问题;遇错即停/异常场景下可参考 FAQ 中的遇错即停错误定位方法。
  4. Stream 被占用无法销毁:确认该 Stream 未被绑定模型运行实例、未被其他接口使用,必要时改用aclrtDestroyStreamForce
  5. 属性设置失败:确认产品型号支持对应的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_stream1_stream_with_failure_mode2_multi_stream3_stream_config_query4_stream_resource_budget
  • 相关章节:Stream 编程模型(开发指南)、Event 管理、任务下发与内核执行、模型运行实例管理
  • 环境变量:ASCEND_RT_LAUNCH_BLOCKING(见 docs/zh/env_vars/ASCEND_RT_LAUNCH_BLOCKING.md)
  • CANN
  • Ascend
  • 人工智能
  • 任务调度

【免费下载链接】runtime

本项目提供CANN运行时组件和维测功能组件。

项目地址:https://gitcode.com/cann/runtime
点击查看免费下载
上一篇:5分钟掌握Flowable-Engine生态:插件与扩展资源全景指南
下一篇:从注入器到内存IPC协议:Horion安全机制、封号风险与CC BY-NC许可完全说明

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询