CANN运行时Context模块架构

📅 2026/7/11 13:28:28
CANN运行时Context模块架构
Context 模块架构【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime1. 模块概述功能介绍Context 模块负责维护 Runtime 的执行上下文是连接 Device、Stream、Task、Model 和 Module 的核心对象。上层 ACL/Runtime API 进入 Runtime 后依赖当前线程绑定的 Context 找到对应设备、默认流、用户流、模型资源、模块缓存、系统参数和错误状态。设计目标支持rtSetDevice/aclrtSetDevice隐式创建和复用 Primary Context。支持rtCtxCreate/aclrtCreateContext显式创建用户 Context。通过线程局部变量维护当前线程的 Context 绑定关系。统一承载 Context 下属的 Stream、Model、Module、系统参数和错误状态。通过全局有效集合和 RAII 保护降低 Context handle 误用和并发销毁风险。为 ACL Graph、FFTS Plus、XPU、Snapshot、runtime_compact 等能力提供扩展入口。Context 在 Runtime 中主要有三类形态形态创建入口核心对象生命周期管理Primary ContextrtSetDevice()、aclrtSetDevice()Context(dev, true)Runtime::PrimaryContextRetain()/Runtime::PrimaryContextRelease()通过RefObjectContext *管理引用计数维度为 Device TS用户 ContextrtCtxCreate()、rtCtxCreateEx()、rtsCtxCreate()、aclrtCreateContext()Context(dev, false)ContextManage登记rtCtxDestroy()、rtCtxDestroyEx()、aclrtDestroyContext()显式销毁XPU ContextXPU 设备设置路径XpuContext : public ContextRuntime::PrimaryXpuContextRetain()/Runtime::PrimaryXpuContextRelease()管理2. 使用场景与对外接口2.1 使用场景场景一设置设备并使用 Primary Context。aclrtSetDevice(0); // Runtime 内部创建或复用设备 0 的 Primary Context并绑定到当前线程。场景二显式创建、切换和销毁用户 Context。aclrtContext ctx nullptr; aclrtCreateContext(ctx, 0); aclrtSetCurrentContext(ctx); // ... 提交任务 ... aclrtDestroyContext(ctx);场景三获取当前 Context 的默认 Stream。aclrtStream stream nullptr; aclrtCtxGetCurrentDefaultStream(stream);场景四设置当前 Context 级系统参数。aclrtCtxSetSysParamOpt(ACL_OPT_DETERMINISTIC, 1);场景五多线程复用同一个用户 Context。// 线程 A 创建 Context 后将 handle 传给线程 B。 // 线程 B 需要先调用 aclrtSetCurrentContext(ctx)再提交该 Context 下的任务。2.2 对外接口ACL Context 接口定义在include/external/acl/acl_rt.hC 符号入口位于src/acl/aclrt_c/runtime/context.c主要实现位于src/acl/aclrt_impl/context.cpp。ACL 接口Runtime 落点说明aclrtCreateContext()rtCtxCreateEx()创建用户 Context并在 Runtime 层设为当前线程 ContextaclrtDestroyContext()rtCtxDestroyEx()销毁用户 Context不能销毁 Primary ContextaclrtSetCurrentContext()rtCtxSetCurrent()将指定 Context 绑定到当前线程aclrtGetCurrentContext()rtCtxGetCurrent()获取当前线程绑定的 ContextaclrtCtxSetSysParamOpt()rtCtxSetSysParamOpt()设置当前 Context 的系统参数aclrtCtxGetSysParamOpt()rtCtxGetSysParamOpt()获取当前 Context 的系统参数aclrtCtxGetCurrentDefaultStream()rtsCtxGetCurrentDefaultStream()获取当前 Context 的默认 StreamaclrtGetPrimaryCtxState()rtsGetPrimaryCtxState()查询指定 Device 的 Primary Context 是否 activeaclrtCtxGetFloatOverflowAddr()rtsCtxGetFloatOverflowAddr()获取当前 Context 的浮点溢出标记地址Runtime Context 头文件位于pkg_inc/runtime/runtime/context.hRTS Context 头文件位于pkg_inc/runtime/runtime/rts/rts_context.h。Runtime / RTS 接口实现入口说明rtCtxCreate()、rtCtxCreateEx()src/runtime/api/api_c.cc创建用户 ContextRT_CTX_GEN_MODE当前返回不支持rtCtxDestroy()、rtCtxDestroyEx()src/runtime/api/api_c.cc销毁用户 ContextrtCtxSetCurrent()、rtCtxGetCurrent()src/runtime/api/api_c.cc设置或获取当前线程 ContextrtGetPriCtxByDeviceId()src/runtime/api/api_c.cc获取指定 Device 当前 TS 的 Primary ContextrtCtxGetDevice()src/runtime/api/api_c.cc获取当前 Context 绑定的 Device IDrtCtxSetSysParamOpt()、rtCtxGetSysParamOpt()src/runtime/api/api_c.cc读写当前 Context 级系统参数rtCtxGetCurrentDefaultStream()src/runtime/api/api_c.cc获取当前 Context 默认 StreamrtsCtxCreate()src/runtime/api/api_c_context.ccRTS 层创建 ContextrtsCtxDestroy()、rtsCtxSetCurrent()、rtsCtxGetCurrent()src/runtime/api/api_c_context.ccRTS 层转调 Runtime Context APIrtsCtxSetSysParamOpt()、rtsCtxGetSysParamOpt()src/runtime/api/api_c_context.ccRTS 层读写 Context 系统参数rtsGetPrimaryCtxState()src/runtime/api/api_c_context.cc查询 Primary Context 状态Device API 与 Primary Context 生命周期直接相关。接口文件位置Context 关系rtSetDevice()src/runtime/api/api_c_device.cc调用ApiImpl::SetDevice()内部 retain Primary ContextrtDeviceReset()src/runtime/api/api_c_device.cc调用ApiImpl::DeviceReset()内部 release Primary Context3. 架构总览整体设计思路Context 模块采用“公开 API → Runtime C API → API 装饰器 → ApiImpl → Runtime / Context 核心对象”的分层设计。公开 API 不直接操作Context、Device、Stream等资源对象而是进入Api::Instance()经过错误处理、Profiling 记录等装饰器后到达ApiImpl。ApiImpl负责参数校验、设备保留、Context 创建销毁和线程绑定。Runtime维护 Primary Context 引用对象ContextManage维护全局有效 Context 集合Context本身承载执行资源。当前 Context 的解析逻辑集中在Runtime::CurrentContext()当前线程显式设置过用户 Context 时优先返回InnerThreadLocalContainer::GetCurCtx()。当前线程通过rtSetDevice()绑定 Primary Context 时返回InnerThreadLocalContainer::GetCurRef()中的 Context。两者都不存在时返回空调用方通常返回RT_ERROR_CONTEXT_NULL或映射后的 ACL 错误码。架构分层图核心模块交互图4. 详细设计4.1 核心流程Primary Context 创建流程流程说明Primary Context 是 Device 级默认执行环境但源码中的保存维度是devId tsId。Runtime::PrimaryContextRetain()不是只处理当前线程的 TS而是遍历该 Device 下的 TS RefObject每个 RefObject 先执行IncRef()如果返回 true 表示已有 Primary Context只增加引用并读取已有对象如果返回 false说明该 TS 的 Primary Context 首次创建才会执行DeviceRetain()、new Context(dev, true)、Setup()、ContextManage::InsertContext()和RefObject::SetVal()。遍历完成后函数按当前线程 TS 返回RT_TSC_ID或RT_TSV_ID对应的 RefObject。ApiImpl::SetDevice()再把这个 RefObject 写入线程局部变量并清空显式用户 Context。关键代码// 文件位置src/runtime/core/src/api_impl/api_impl.cc rtError_t ApiImpl::SetDevice(const int32_t devId) { Runtime * const rt Runtime::Instance(); RefObjectContext * *context rt-PrimaryContextRetain(static_castuint32_t(devId)); NULL_PTR_RETURN_MSG(context, RT_ERROR_DEVICE_RETAIN); InnerThreadLocalContainer::SetCurRef(context); Context * const curCtx context-GetVal(); CHECK_CONTEXT_VALID_WITH_RETURN(curCtx, RT_ERROR_CONTEXT_NULL); InnerThreadLocalContainer::SetCurCtx(nullptr); return RT_ERROR_NONE; }用户 Context 创建流程流程说明用户 Context 有三类入口ACL 的aclrtCreateContext()会先进入aclrtCreateContextImpl()再调用rtCtxCreateEx(..., RT_CTX_NORMAL_MODE, deviceId)Runtime C API 的rtCtxCreate()/rtCtxCreateEx()会先拒绝当前不支持的RT_CTX_GEN_MODERTS 的rtsCtxCreate()会检查 flags 范围。三类入口最终都会进入ApiImpl::ContextCreate()。ContextCreate()通过 driver 查询设备数量并校验devId读取当前线程tsId后调用NewContext()。NewContext()retain 对应 Device构造Context(dev, false)并执行Setup()。创建成功后ContextCreate()将 Context 插入ContextManage再调用ContextSetCurrent()因此新创建的用户 Context 会成为当前线程的活跃 Context同时清空 Primary Context 引用。关键代码// 文件位置src/runtime/core/src/api_impl/api_impl.cc rtError_t ApiImpl::ContextCreate(Context ** const inCtx, const int32_t devId) { rtError_t error NewContext(static_castuint32_t(devId), tsId, inCtx); ERROR_RETURN_MSG_INNER(error, new context failed, drv devId%d, devId); ContextManage::InsertContext(*inCtx); error ContextSetCurrent(*inCtx); ERROR_RETURN_MSG_INNER(error, Failed to set current context); return RT_ERROR_NONE; }Context 销毁流程流程说明用户 Context 销毁前会先确认 handle 仍在ContextManage有效集合中然后拒绝销毁IsPrimary()为 true 的 Context。Primary Context 只能通过rtDeviceReset()对应路径释放。Context::TearDown()清理 Context 下的 Model、Stream 和在线 Profiling Stream用户 Context 的默认 Stream 也在该阶段释放。Context 从有效集合移除后如果仍被其他线程保护使用则等最后一个ContextProtect析构时释放。Primary Context 的释放路径在Runtime::PrimaryContextRelease()该路径按引用计数递减计数归零后执行回调、Context::TearDown()、ContextManage::EraseContextFromSet()和RefObject::ResetVal()。当前 Context 获取流程关键代码// 文件位置src/runtime/core/src/runtime.cc Context *Runtime::CurrentContext() const { Context * const curCtx InnerThreadLocalContainer::GetCurCtx(); if (curCtx ! nullptr) { return curCtx; } RefObjectContext * * const curRef InnerThreadLocalContainer::GetCurRef(); if (curRef ! nullptr) { return curRef-GetPrimaryCtxCallBackFlag() ? curRef-GetVal(false) : curRef-GetVal(); } return nullptr; }Context 初始化流程流程说明Context::Setup()建立 Context 的基础执行环境。Context::Init()创建moduleAllocator_并初始化 Context 级系统参数数组。SetOverflowAddr()为浮点溢出检测分配设备侧地址大小由OVERFLOW_ADDR_MAX_SIZE定义。Primary Context 的默认 Stream 来自 Device 的 Primary Stream用户 Context 则通过StreamFactory::CreateStream()创建自己的默认 Stream。Context 同步流程流程说明Context::Synchronize()首先确认defaultStream_存在然后遍历streams_收集需要同步的用户 Stream。IsStreamNotSync()会跳过特定类型的 Stream处于 capture 状态的 Stream 不能在该路径同步。收集完成后Context 先执行任务回收再通过CheckStatus()检查设备状态和 Context 失败状态最后调用SyncStreamsWithTimeout()同步收集到的 Stream。Stream、Model 和 Module 管理资源创建入口Context 内部状态销毁或释放默认 StreamContext::Setup()defaultStream_用户 Context 在TearDown()中销毁Primary Context 不销毁 Device 的 Primary Stream用户 StreamContext::StreamCreate()streams_Context::StreamDestroy()从streams_移除后调用TearDownStream()在线 Profiling StreamOnlineStreamInit()onlineStream_Context::TearDown()中销毁Model / CaptureModelContext::ModelCreate()models_Context::ModelDestroy()或Context::TearDown()中清理ModuleContext::GetModule()moduleAllocator_Context::ReleaseModule()或析构时释放4.2 核心机制详解线程绑定机制设计思想当前线程只能有一个生效的 Context 来源。显式用户 Context 和 Primary Context 引用分别保存在不同 TLS 字段中设置其中一个时会清空另一个。TLS 字段设置入口含义InnerThreadLocalContainer::SetCurCtx()ApiImpl::ContextSetCurrent()保存用户显式设置的Context *InnerThreadLocalContainer::SetCurRef()ApiImpl::SetDevice()保存 Primary Context 的RefObjectContext *// 文件位置src/runtime/core/src/api_impl/api_impl.cc rtError_t ApiImpl::ContextSetCurrent(Context * const inCtx) { InnerThreadLocalContainer::SetCurCtx(inCtx); InnerThreadLocalContainer::SetCurRef(nullptr); (void)ThreadLocalContainer::GetOrCreateWatchDogHandle(); return RT_ERROR_NONE; }Context handle 有效性与并发销毁保护设计思想Context handle 是 opaque pointerRuntime 需要防止无效指针进入核心逻辑也要避免一个线程销毁 Context 时另一个线程仍在使用。ContextManage保存有效 Context 集合ContextProtect负责作用域内使用计数回落和延迟释放。CHECK_CONTEXT_VALID_WITH_RETURN宏封装了有效性检查和ContextProtect构造。ContextManage::EraseContextFromSet()删除 Context 时会先从集合中移除再标记删除状态如果使用计数不为 0释放动作由最后一个ContextProtect完成。Primary Context 引用计数设计思想Primary Context 与 Device/TS 绑定多次设置同一 Device 时复用已有 Context。Runtime 使用priCtxs_[devId][tsId]保存RefObjectContext *通过引用计数控制创建和销毁。rtsGetPrimaryCtxState()/aclrtGetPrimaryCtxState()最终进入Runtime::GetPrimaryCtxState()该函数遍历指定 Device 下的 TS 引用对象只要存在引用计数大于 0 的 Primary Context就返回 active。系统参数作用域rtCtxSetSysParamOpt()和rtsCtxSetSysParamOpt()设置的是当前 Context 的系统参数最终写入Context::sysParamOpt_。sysParamOpt_使用pairbool, int64_t保存是否已设置和值。读取未设置参数时Context::CtxGetSysParamOpt()返回RT_ERROR_NOT_SET_SYSPARAMOPTAPI 层映射为对外错误码。// 文件位置src/runtime/core/src/context/context.cc rtError_t Context::CtxSetSysParamOpt(const rtSysParamOpt configOpt, const int64_t configVal) { const std::unique_lockstd::mutex mutexLock(sysParamOptLock_); sysParamOpt_[configOpt].first true; sysParamOpt_[configOpt].second configVal; return RT_ERROR_NONE; }错误状态传播Context 维护两类错误状态lastErr_记录最近一次错误GetContextLastErr()读取后会清零failureError_记录失败模式下需要传播的错误。ContextManage::SetGlobalFailureErr()会按 Device ID 遍历有效 Context设置 Context failure error、Stream 状态和 Device 状态。Context::CheckStatus()会检查设备运行状态、驱动状态、设备业务状态和 Context failure error只有ctxMode_ STOP_ON_FAILURE时Context failure error 会作为返回错误继续向上传播。Module 懒分配Context::Init()初始化的是moduleAllocator_真正的Module对象在Context::GetModule()首次访问对应Program时通过device_-ModuleAlloc(prog)创建并记录到Program与 Context 的映射关系。释放时通过Context::ReleaseModule()清空 allocator 条目并调用device_-ModuleRelease()。4.3 特性扩展Context 的特性扩展主要采用两种方式。扩展模式使用方说明编译单元分离ACL Graph、FFTS Plus方法声明在context.hpp实现放在src/runtime/feature/目录链接为Context成员方法继承子类XPUXpuContext继承Context并重写虚方法ACL Graph 扩展ACL Graph 相关 Context 实现位于src/runtime/feature/aclgraph/context_aclgraph.cc、src/runtime/feature/aclgraph/context_standard_soc_aclgraph.cc和src/runtime/feature/aclgraph/tiny/context_tiny_stub_aclgraph.cc主要为 Stream Capture 和 CaptureModel 提供入口。能力入口开始捕获Context::StreamBeginCapture()结束捕获Context::StreamEndCapture()查询捕获状态Context::StreamGetCaptureInfo()TaskGroup 采样Context::StreamBeginTaskGrp()、Context::StreamEndTaskGrp()模型调试输出Context::ModelDebugDotPrint()、Context::ModelDebugJsonPrint()FFTS Plus 扩展FFTS Plus Context 实现位于src/runtime/feature/ffts/context_ffts_standard_soc.cctiny 平台 stub 位于src/runtime/feature/ffts/context_ffts_tiny_stub.cc。标准实现中Context::FftsPlusTaskLaunch()从 Stream 分配TS_TASK_TYPE_FFTS_PLUS任务初始化 FFTS Plus task等待参数拷贝完成后通过 Device 提交任务。Stream 处于 capture 状态时还会补充 RDMA PI value modify 任务。XPU Context 扩展XPU Context 定义在src/runtime/core/inc/context/xpu_context.hpp实现位于src/runtime/feature/xpu/xpu_context.cc和src/runtime/feature/xpu/runtime_xpu_adapt.cc。XpuContext继承Context重写Setup()、TearDown()、StreamCreate()、TearDownStream()和CheckStatus()。重写方法差异行为Setup()设置STOP_ON_FAILURE模式StreamCreate()校验 priority 和 flag创建XpuStreamTearDown()遍历 XPU Context 下的 Stream 并逐一清理CheckStatus()直接返回 Context 的 failure errorSnapshot 和恢复Context 模块通过ContextManage为 Snapshot 提供设备、Stream 和 Model 维度的信息入口。ContextManage::DeviceGetStreamlist()、DeviceGetModelList()遍历有效 Context 集合并筛选指定 DeviceSnapShotProcessBackup()、SnapShotProcessRestore()调用 Model 备份恢复、ACL Graph 恢复以及驱动资源备份恢复。runtime_compact Contextruntime_compact使用 C 结构体实现轻量 Context代码位于src/runtime_compact/feature/inc/context.h、src/runtime_compact/feature/src/context_common.c、src/runtime_compact/feature/src/context_linux.c和src/runtime_compact/feature/src/context_liteos.c。平台当前 Context 记录方式Linux__thread Context *g_curCtx和g_curCtxSeqLiteOSg_contextRecord按 task id 保存ContextKeyObjcompact Context 保存Device *、Stream vector 和 stream lock创建时从g_contextMemPool分配销毁和查询时通过内存池序列号判断 handle 是否仍有效。4.4 模块职责划分模块职责位置ACL Context APIACL 对外 Context 接口、参数校验、错误码转换、Profiling 统计src/acl/aclrt_impl/context.cpp、src/acl/aclrt_c/runtime/context.cRuntime C APIRuntime C 接口入口转调Api::Instance()src/runtime/api/api_c.cc、src/runtime/api/api_c_context.cc、src/runtime/api/api_c_device.ccAPI 抽象Context API 虚接口和装饰器链src/runtime/api/api.hpp、src/runtime/core/src/api_impl/api_decorator.cc、src/runtime/core/src/profiler/api_profile_decorator.ccApiImplContext 创建、销毁、设置当前、获取当前、系统参数操作src/runtime/core/src/api_impl/api_impl.ccRuntimePrimary Context 数组、引用计数、当前 Context 解析、Device 生命周期联动src/runtime/core/inc/runtime.hpp、src/runtime/core/src/runtime.ccContext资源容器管理 Device、Stream、Model、Module、系统参数和错误状态src/runtime/core/inc/context/context.hpp、src/runtime/core/src/context/context.ccContextManage全局 Context 集合、有效性校验、设备异常处理、Snapshot 入口src/runtime/core/inc/context/context_manage.hpp、src/runtime/core/src/context/context_manage.ccContextDataManage线程安全 set 封装保存有效 Context 指针src/runtime/core/src/common/context_data_manage.h、src/runtime/core/src/common/context_data_manage.ccContextProtectContext 使用计数保护配合延迟释放src/runtime/core/inc/context/context_protect.hpp、src/runtime/core/src/context/context_protect.ccACL Graph Context流捕获、CaptureModel、TaskGroup、模型调试输出src/runtime/feature/aclgraph/context_aclgraph.ccFFTS ContextFFTS Plus task launchsrc/runtime/feature/ffts/context_ffts_standard_soc.ccXPU ContextXPU Context 生命周期和 Stream 管理src/runtime/core/inc/context/xpu_context.hpp、src/runtime/feature/xpu/xpu_context.cccompact Contextruntime_compact 轻量 Contextsrc/runtime_compact/feature/inc/context.h、src/runtime_compact/feature/src/context_common.c4.5 核心数据结构5. 关键文件索引模块文件路径核心内容ACL 公开头文件include/external/acl/acl_rt.hACL Context API 声明和接口约束ACL C 入口src/acl/aclrt_c/runtime/context.cACL Context C 符号入口转调 wrapperACL 实现src/acl/aclrt_impl/context.cppACL Context 实现、参数校验、错误码转换ACL wrappersrc/acl/aclrt_impl/acl_rt_wrapper.hACL runtime wrapper 宏注册Runtime Context 头文件pkg_inc/runtime/runtime/context.hrtContext_t、rtCtx*接口声明RTS Context 头文件pkg_inc/runtime/runtime/rts/rts_context.hrtsCtx*接口声明Runtime C APIsrc/runtime/api/api_c.ccrtCtx*、sysparam、default stream 等接口入口RTS C APIsrc/runtime/api/api_c_context.ccrtsCtx*、primary ctx state 接口入口Device C APIsrc/runtime/api/api_c_device.ccrtSetDevice()、rtDeviceReset()与 Primary Context 生命周期联动API 抽象src/runtime/api/api.hppContext 相关虚接口定义ApiImplsrc/runtime/core/src/api_impl/api_impl.ccContext 创建、销毁、线程绑定、系统参数实现Runtimesrc/runtime/core/inc/runtime.hpp、src/runtime/core/src/runtime.ccPrimary Context 引用计数、当前 Context 解析Context 头文件src/runtime/core/inc/context/context.hppContext 类、校验宏、核心方法声明Context 实现src/runtime/core/src/context/context.ccContext 生命周期、Stream、Model、Module、sysparam、同步和错误状态Context 平台实现src/runtime/core/src/context/context_standard_soc.cc、src/runtime/core/src/context/context_tiny_stub.cc标准平台和 tiny stub 的 Context 差异实现ContextManagesrc/runtime/core/inc/context/context_manage.hpp、src/runtime/core/src/context/context_manage.cc全局 Context 集合、有效性校验、设备异常、Snapshot 入口ContextDataManagesrc/runtime/core/src/common/context_data_manage.h、src/runtime/core/src/common/context_data_manage.cc有效 Context set 和读写锁ContextProtectsrc/runtime/core/inc/context/context_protect.hpp、src/runtime/core/src/context/context_protect.ccRAII 使用计数和延迟释放ACL Graph 扩展src/runtime/feature/aclgraph/context_aclgraph.cc、src/runtime/feature/aclgraph/context_standard_soc_aclgraph.cc、src/runtime/feature/aclgraph/tiny/context_tiny_stub_aclgraph.cc流捕获和 CaptureModel 相关 Context 实现FFTS 扩展src/runtime/feature/ffts/context_ffts_standard_soc.cc、src/runtime/feature/ffts/context_ffts_tiny_stub.ccFFTS Plus task launch 标准实现和 stubXPU 扩展src/runtime/core/inc/context/xpu_context.hpp、src/runtime/feature/xpu/xpu_context.cc、src/runtime/feature/xpu/runtime_xpu_adapt.ccXPU Context 生命周期、Stream 和 Primary XPU Contextcompact Contextsrc/runtime_compact/feature/inc/context.h、src/runtime_compact/feature/src/context_common.c、src/runtime_compact/feature/src/context_linux.c、src/runtime_compact/feature/src/context_liteos.cruntime_compact 轻量 Context 实现Context 示例example/1_basic_features/context/README.mdContext 使用入口说明6. 测试覆盖测试文件覆盖重点tests/ut/runtime/runtime/test/rt_utest_api_context.ccRTS Context 创建销毁、设置获取当前 Context、Primary Context 状态、sysparam、默认 Streamtests/ut/runtime/runtime/test/rt_utest_context.ccContext Setup、TearDown、Synchronize、任务回收、并发 Context、Module、Model、FFTS、ContextProtect 等tests/ut/runtime/runtime/test/platform/910B/rt_utest_api_context.cc910B 平台 Context API 差异用例tests/ut/runtime/runtime/test/platform/910B/rt_utest_context.cc910B 平台 Context 行为用例tests/ut/runtime/runtime/test/platform/910_95/xpu/rt_utest_xpu_context.ccXPU Context 生命周期和 Stream 行为tests/ut/runtime/runtime_c/testcase/feature/rt_api_test.ccruntime_compact Context API 行为tests/ut/acl/testcase/acl_runtime_unittest.cppACL Context API 参数校验和 Runtime 转调tests/ut/runtime/runtime/fuzz/testcase/rt_event_ctx_fuzzer.ccEvent 与 Context 组合路径 fuzz7. 设计约束与维护建议Primary Context 只能通过 Device 生命周期释放用户显式销毁接口不能销毁IsPrimary()为 true 的 Context。新增以Context *为入参的 API 时应使用CHECK_CONTEXT_VALID_WITH_RETURN或等价逻辑保证 handle 已登记且ContextProtect覆盖 API 执行区间。调用ContextManage::CheckContextIsValid(ctx, true)后必须配套ContextProtect否则 Context 使用计数不会在作用域结束时回落。切换当前 Context 时需要明确处理curCtx和curRef。显式 Context 使用SetCurCtx(ctx)并清空curRef设置 Device 使用SetCurRef(ref)并清空curCtx。新增 Context 下属资源时需要补齐Context::TearDown()、异常回收、Snapshot 备份恢复和必要的测试用例。新增平台差异实现时优先放入src/runtime/feature/或现有平台 stub 文件避免把平台条件散落到核心 Context 主流程。新增 ACL/RTS API 时需要同步检查include/external/acl/acl_rt.h、pkg_inc/runtime/runtime/context.h、pkg_inc/runtime/runtime/rts/rts_context.h、src/runtime/api/api.hpp、src/runtime/core/src/api_impl/api_impl.cc和 profiler 装饰器。8. 性能与可靠性关注点Primary Context 通过引用计数复用避免同一 Device/TS 组合重复创建默认执行环境。用户 Context 销毁先从ContextManage有效集合移除再结合使用计数延迟释放降低并发使用时的 UAF 风险。Context::Setup()区分 Primary Context 和用户 Context 的默认 Stream 来源避免用户 Context 销毁时误删 Device 的 Primary Stream。Context::Synchronize()跳过无需同步的 Stream并拒绝同步 capture 状态的 Stream避免捕获期间破坏 Stream Capture 状态。Module 采用按 Program ID 懒分配模式moduleAllocator_在 Context 初始化时创建具体 Module 在首次GetModule()时创建。Context 级 sysparam 保存在sysParamOpt_中同一进程内不同 Context 可以保存不同配置。本模块文档基于src/runtime/core/src/context/、src/runtime/core/src/runtime.cc、src/runtime/core/src/api_impl/api_impl.cc及 Context 相关 API、feature、runtime_compact 源码整理。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考