CANN Runtime Stream管理接口详解:创建、同步、销毁与高级特性
发布时间:2026/9/20 1:53:49 锦皓数字建站

CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载CANNCompute Architecture for Neural NetworksRuntime 的 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. 创建 Stream3.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 训练/推理系列1984Atlas 200I/500 A2 推理产品512Atlas 推理系列产品1024Atlas 训练系列产品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 等同于aclrtCreateStreamflag 取值说明宏定义均位于 include/external/acl/acl_rt.h#L36-L41flag 宏值语义ACL_STREAM_FAST_LAUNCH0x00000001U创建 Stream 时预申请系统内部资源下发任务更快。一次性创建、多次下发任务的场景总耗时更短但内存消耗增加ACL_STREAM_FAST_SYNC0x00000002U同步时主动查询任务状态而非被动等待通知aclrtSynchronizeStream等待时间更短但 CPU 消耗增加ACL_STREAM_PERSISTENT0x00000004U任务不立即执行、执行完不立即销毁资源销毁 Stream 时才释放。用于与模型绑定配合 aclmdlRIBindStreamACL_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_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. 销毁 Stream4.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与rtStreamDestroyForcesrc/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_CLOSEsocket 关闭。即这些业务级返回码不会被视为同步失败体现了同步语义对溢出检测、模型正常中止等场景的兼容。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默认 StreamAtlas 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表示默认 Streamflag为预留参数当前固定配置为 0。行为细节aclrtNonBlockingLaunchEnd调用时若已不存在尚未结束的 Begin 调用且当前 Stream 需要同步会等待该 Stream 上已下发任务完成后再返回若仍有未结束的 Begin则继续采用异步模式本接口设置的异步模式优先级高于ASCEND_RT_LAUNCH_BLOCKING环境变量和ACL_STREAM_LAUNCH_BLOCKING_MODE属性Begin/End 必须成对使用且 Stream 相同未先调用 Begin 就调用 End 会返回失败支持嵌套调用每层 Begin 需对应一层 EndaclrtNonBlockingLaunchBegin(stream, 0); // 外层开始 aclrtNonBlockingLaunchBegin(stream, 0); // 内层开始 aclrtNonBlockingLaunchEnd(stream, 0); // 内层结束 aclrtNonBlockingLaunchEnd(stream, 0); // 外层结束约束不支持绑定模型运行实例aclmdlRIBindStream的 StreamStream 必须不处于捕获状态不支持以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 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_ABORTAscend 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需先调用aclrtCreateStreamWithConfigaclmdlRIBindStream完成绑定。产品支持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输入比较条件见 aclrtConditionrightValue输入右值数据的 Device 内存地址dataType输入左右值数据类型见 aclrtCompareDataTypetrueStream输入条件成立时执行的 StreamfalseStream输入预留参数当前固定传NULLstream输入执行跳转任务的 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 或 1ACL_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见 aclrtStreamAttrvalue见 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 ModeAtlas 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 IDaclError 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 节 的型号上限。实现调用rtsStreamGetAvailableNumsrc/acl/aclrt_impl/stream.cpp#L323-L333。8.3 aclrtStreamGetPriority——查询优先级aclError aclrtStreamGetPriority(aclrtStream stream, uint32_t *priority);查询指定 Stream 的优先级数字越小优先级越高取值范围与aclrtCreateStreamWithConfig的 priority 参数一致传NULL时查询默认 Stream。实现调用rtStreamGetPrioritysrc/acl/aclrt_impl/stream.cpp#L204-L215。8.4 aclrtStreamGetFlags——查询创建 flagaclError 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创建。实现调用rtsPersistentTaskCleansrc/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赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐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上一篇5分钟掌握Flowable-Engine生态插件与扩展资源全景指南下一篇从注入器到内存IPC协议Horion安全机制、封号风险与CC BY-NC许可完全说明创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。