CANN运行时Context模块架构
2026/7/11 13:28:19 网站建设 项目流程

Context 模块架构

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

1. 模块概述

  • 功能介绍: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()通过RefObject<Context *>管理引用计数,维度为 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.h,C 符号入口位于src/acl/aclrt_c/runtime/context.c,主要实现位于src/acl/aclrt_impl/context.cpp

ACL 接口Runtime 落点说明
aclrtCreateContext()rtCtxCreateEx()创建用户 Context,并在 Runtime 层设为当前线程 Context
aclrtDestroyContext()rtCtxDestroyEx()销毁用户 Context,不能销毁 Primary Context
aclrtSetCurrentContext()rtCtxSetCurrent()将指定 Context 绑定到当前线程
aclrtGetCurrentContext()rtCtxGetCurrent()获取当前线程绑定的 Context
aclrtCtxSetSysParamOpt()rtCtxSetSysParamOpt()设置当前 Context 的系统参数
aclrtCtxGetSysParamOpt()rtCtxGetSysParamOpt()获取当前 Context 的系统参数
aclrtCtxGetCurrentDefaultStream()rtsCtxGetCurrentDefaultStream()获取当前 Context 的默认 Stream
aclrtGetPrimaryCtxState()rtsGetPrimaryCtxState()查询指定 Device 的 Primary Context 是否 active
aclrtCtxGetFloatOverflowAddr()rtsCtxGetFloatOverflowAddr()获取当前 Context 的浮点溢出标记地址

Runtime Context 头文件位于pkg_inc/runtime/runtime/context.h,RTS Context 头文件位于pkg_inc/runtime/runtime/rts/rts_context.h

Runtime / RTS 接口实现入口说明
rtCtxCreate()rtCtxCreateEx()src/runtime/api/api_c.cc创建用户 Context,RT_CTX_GEN_MODE当前返回不支持
rtCtxDestroy()rtCtxDestroyEx()src/runtime/api/api_c.cc销毁用户 Context
rtCtxSetCurrent()rtCtxGetCurrent()src/runtime/api/api_c.cc设置或获取当前线程 Context
rtGetPriCtxByDeviceId()src/runtime/api/api_c.cc获取指定 Device 当前 TS 的 Primary Context
rtCtxGetDevice()src/runtime/api/api_c.cc获取当前 Context 绑定的 Device ID
rtCtxSetSysParamOpt()rtCtxGetSysParamOpt()src/runtime/api/api_c.cc读写当前 Context 级系统参数
rtCtxGetCurrentDefaultStream()src/runtime/api/api_c.cc获取当前 Context 默认 Stream
rtsCtxCreate()src/runtime/api/api_c_context.ccRTS 层创建 Context
rtsCtxDestroy()rtsCtxSetCurrent()rtsCtxGetCurrent()src/runtime/api/api_c_context.ccRTS 层转调 Runtime Context API
rtsCtxSetSysParamOpt()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 Context
rtDeviceReset()src/runtime/api/api_c_device.cc调用ApiImpl::DeviceReset(),内部 release Primary Context

3. 架构总览

整体设计思路

Context 模块采用“公开 API → Runtime C API → API 装饰器 → ApiImpl → Runtime / Context 核心对象”的分层设计。公开 API 不直接操作ContextDeviceStream等资源对象,而是进入Api::Instance(),经过错误处理、Profiling 记录等装饰器后到达ApiImplApiImpl负责参数校验、设备保留、Context 创建销毁和线程绑定。Runtime维护 Primary Context 引用对象,ContextManage维护全局有效 Context 集合,Context本身承载执行资源。

当前 Context 的解析逻辑集中在Runtime::CurrentContext()

  1. 当前线程显式设置过用户 Context 时,优先返回InnerThreadLocalContainer::GetCurCtx()
  2. 当前线程通过rtSetDevice()绑定 Primary Context 时,返回InnerThreadLocalContainer::GetCurRef()中的 Context。
  3. 两者都不存在时返回空,调用方通常返回RT_ERROR_CONTEXT_NULL或映射后的 ACL 错误码。

架构分层图

核心模块交互图

4. 详细设计

4.1 核心流程

Primary Context 创建流程

流程说明

Primary Context 是 Device 级默认执行环境,但源码中的保存维度是devId + tsIdRuntime::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_IDRT_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(); RefObject<Context *> *context = rt->PrimaryContextRetain(static_cast<uint32_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_MODE;RTS 的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_cast<uint32_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; } RefObject<Context *> * 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 的RefObject<Context *>
// 文件位置: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 pointer,Runtime 需要防止无效指针进入核心逻辑,也要避免一个线程销毁 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]保存RefObject<Context *>,通过引用计数控制创建和销毁。

rtsGetPrimaryCtxState()/aclrtGetPrimaryCtxState()最终进入Runtime::GetPrimaryCtxState(),该函数遍历指定 Device 下的 TS 引用对象,只要存在引用计数大于 0 的 Primary Context,就返回 active。

系统参数作用域

rtCtxSetSysParamOpt()rtsCtxSetSysParamOpt()设置的是当前 Context 的系统参数,最终写入Context::sysParamOpt_sysParamOpt_使用pair<bool, int64_t>保存是否已设置和值。读取未设置参数时,Context::CtxGetSysParamOpt()返回RT_ERROR_NOT_SET_SYSPARAMOPT,API 层映射为对外错误码。

// 文件位置:src/runtime/core/src/context/context.cc rtError_t Context::CtxSetSysParamOpt(const rtSysParamOpt configOpt, const int64_t configVal) { const std::unique_lock<std::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.ccsrc/runtime/feature/aclgraph/context_standard_soc_aclgraph.ccsrc/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.cc,tiny 平台 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.ccsrc/runtime/feature/xpu/runtime_xpu_adapt.ccXpuContext继承Context,重写Setup()TearDown()StreamCreate()TearDownStream()CheckStatus()

重写方法差异行为
Setup()设置STOP_ON_FAILURE模式
StreamCreate()校验 priority 和 flag,创建XpuStream
TearDown()遍历 XPU Context 下的 Stream 并逐一清理
CheckStatus()直接返回 Context 的 failure error
Snapshot 和恢复

Context 模块通过ContextManage为 Snapshot 提供设备、Stream 和 Model 维度的信息入口。ContextManage::DeviceGetStreamlist()DeviceGetModelList()遍历有效 Context 集合并筛选指定 Device;SnapShotProcessBackup()SnapShotProcessRestore()调用 Model 备份恢复、ACL Graph 恢复以及驱动资源备份恢复。

runtime_compact Context

runtime_compact使用 C 结构体实现轻量 Context,代码位于src/runtime_compact/feature/inc/context.hsrc/runtime_compact/feature/src/context_common.csrc/runtime_compact/feature/src/context_linux.csrc/runtime_compact/feature/src/context_liteos.c

平台当前 Context 记录方式
Linux__thread Context *g_curCtxg_curCtxSeq
LiteOSg_contextRecord按 task id 保存ContextKeyObj

compact Context 保存Device *、Stream vector 和 stream lock,创建时从g_contextMemPool分配,销毁和查询时通过内存池序列号判断 handle 是否仍有效。

4.4 模块职责划分

模块职责位置
ACL Context APIACL 对外 Context 接口、参数校验、错误码转换、Profiling 统计src/acl/aclrt_impl/context.cppsrc/acl/aclrt_c/runtime/context.c
Runtime C APIRuntime C 接口入口,转调Api::Instance()src/runtime/api/api_c.ccsrc/runtime/api/api_c_context.ccsrc/runtime/api/api_c_device.cc
API 抽象Context API 虚接口和装饰器链src/runtime/api/api.hppsrc/runtime/core/src/api_impl/api_decorator.ccsrc/runtime/core/src/profiler/api_profile_decorator.cc
ApiImplContext 创建、销毁、设置当前、获取当前、系统参数操作src/runtime/core/src/api_impl/api_impl.cc
RuntimePrimary Context 数组、引用计数、当前 Context 解析、Device 生命周期联动src/runtime/core/inc/runtime.hppsrc/runtime/core/src/runtime.cc
Context资源容器,管理 Device、Stream、Model、Module、系统参数和错误状态src/runtime/core/inc/context/context.hppsrc/runtime/core/src/context/context.cc
ContextManage全局 Context 集合、有效性校验、设备异常处理、Snapshot 入口src/runtime/core/inc/context/context_manage.hppsrc/runtime/core/src/context/context_manage.cc
ContextDataManage线程安全 set 封装,保存有效 Context 指针src/runtime/core/src/common/context_data_manage.hsrc/runtime/core/src/common/context_data_manage.cc
ContextProtectContext 使用计数保护,配合延迟释放src/runtime/core/inc/context/context_protect.hppsrc/runtime/core/src/context/context_protect.cc
ACL Graph Context流捕获、CaptureModel、TaskGroup、模型调试输出src/runtime/feature/aclgraph/context_aclgraph.cc
FFTS ContextFFTS Plus task launchsrc/runtime/feature/ffts/context_ffts_standard_soc.cc
XPU ContextXPU Context 生命周期和 Stream 管理src/runtime/core/inc/context/xpu_context.hppsrc/runtime/feature/xpu/xpu_context.cc
compact Contextruntime_compact 轻量 Contextsrc/runtime_compact/feature/inc/context.hsrc/runtime_compact/feature/src/context_common.c

4.5 核心数据结构

5. 关键文件索引

模块文件路径核心内容
ACL 公开头文件include/external/acl/acl_rt.hACL Context API 声明和接口约束
ACL C 入口src/acl/aclrt_c/runtime/context.cACL Context C 符号入口,转调 wrapper
ACL 实现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_trtCtx*接口声明
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.hppsrc/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.ccsrc/runtime/core/src/context/context_tiny_stub.cc标准平台和 tiny stub 的 Context 差异实现
ContextManagesrc/runtime/core/inc/context/context_manage.hppsrc/runtime/core/src/context/context_manage.cc全局 Context 集合、有效性校验、设备异常、Snapshot 入口
ContextDataManagesrc/runtime/core/src/common/context_data_manage.hsrc/runtime/core/src/common/context_data_manage.cc有效 Context set 和读写锁
ContextProtectsrc/runtime/core/inc/context/context_protect.hppsrc/runtime/core/src/context/context_protect.ccRAII 使用计数和延迟释放
ACL Graph 扩展src/runtime/feature/aclgraph/context_aclgraph.ccsrc/runtime/feature/aclgraph/context_standard_soc_aclgraph.ccsrc/runtime/feature/aclgraph/tiny/context_tiny_stub_aclgraph.cc流捕获和 CaptureModel 相关 Context 实现
FFTS 扩展src/runtime/feature/ffts/context_ffts_standard_soc.ccsrc/runtime/feature/ffts/context_ffts_tiny_stub.ccFFTS Plus task launch 标准实现和 stub
XPU 扩展src/runtime/core/inc/context/xpu_context.hppsrc/runtime/feature/xpu/xpu_context.ccsrc/runtime/feature/xpu/runtime_xpu_adapt.ccXPU Context 生命周期、Stream 和 Primary XPU Context
compact Contextsrc/runtime_compact/feature/inc/context.hsrc/runtime_compact/feature/src/context_common.csrc/runtime_compact/feature/src/context_linux.csrc/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、默认 Stream
tests/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 组合路径 fuzz

7. 设计约束与维护建议

  • Primary Context 只能通过 Device 生命周期释放,用户显式销毁接口不能销毁IsPrimary()为 true 的 Context。
  • 新增以Context *为入参的 API 时,应使用CHECK_CONTEXT_VALID_WITH_RETURN或等价逻辑,保证 handle 已登记且ContextProtect覆盖 API 执行区间。
  • 调用ContextManage::CheckContextIsValid(ctx, true)后必须配套ContextProtect,否则 Context 使用计数不会在作用域结束时回落。
  • 切换当前 Context 时需要明确处理curCtxcurRef。显式 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.hpkg_inc/runtime/runtime/context.hpkg_inc/runtime/runtime/rts/rts_context.hsrc/runtime/api/api.hppsrc/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.ccsrc/runtime/core/src/api_impl/api_impl.cc及 Context 相关 API、feature、runtime_compact 源码整理。

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

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

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

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

立即咨询