尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CANN/runtime Context管理开发指南
Context管理【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimeContext概念Context是CANN Runtime中的核心抽象代表一个Device上的执行上下文环境。它封装了Device上的计算资源、内存资源、Stream资源等运行时状态是Runtime操作的基础载体。每个Context与特定的Device绑定包含该Device上的计算资源用于执行Kernel、系统任务等内存资源设备内存分配与管理Stream资源任务队列及调度状态运行时配置影响任务执行的参数Context与线程绑定同一时刻一个线程只能使用一个Context。Runtime接口在执行时会自动使用当前线程绑定的Context。为什么要用Context使用Context的核心场景多线程并行计算多个线程并发使用同一Device时各自创建独立Context避免资源竞争和状态混乱。精细资源控制需要更细粒度地控制资源创建、使用、释放时机。多线程Context共享在同进程多线程场景下显式创建的Context可在多线程间共享使用。模块化程序设计不同功能模块使用独立Context便于资源管理和问题定位。显式Context vs 默认Context调用aclrtSetDevice接口时Runtime会自动为指定Device创建一个默认Context。对于简单应用使用默认Context即可满足需求。但对于复杂应用显式创建和管理Context具有以下优势场景默认Context显式Context多线程编程线程间共享默认Context任务执行顺序依赖线程调度每个线程独立Context便于隔离和调试资源隔离同一Device上的不同模块共享资源不同模块使用独立Context资源隔离更清晰代码可维护性线程切换Device时Context状态不明确显式指定Context代码意图清晰资源生命周期随Device生命周期管理独立控制Context创建和销毁时机Context与Device、Stream的关系Context与Device、Stream的关系如下图所示┌─────────────────────────────────────────────────────────────┐ │ Host进程 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Thread 1 │ │ Thread 2 │ │ Thread 3 │ │ │ │ Context A │ │ Context B │ │ Context A │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ └─────────┼─────────────────┼─────────────────┼───────────────┘ │ │ │ ▼ ▼ ▼ ┌────────────────────────────────────────────────────────────┐ │ Device 0 (NPU) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Context A │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ Stream 0 │ │ Stream 1 │ │ Stream 2 │ ... │ │ │ │ │ (default)│ │ │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Context B │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ │ │ Stream 0 │ │ Stream 1 │ ... │ │ │ │ │ (default)│ │ │ │ │ │ │ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ └────────────────────────────────────────────────────────────┘Device物理NPU设备一个Device上可创建多个Context。ContextDevice上的执行上下文包含默认Stream和用户创建的Stream。Stream任务队列归属于特定Context。如何使用Context单线程基础使用模式默认Context对于简单应用使用默认Context即可满足需求。调用aclrtSetDevice接口时Runtime会自动创建默认Context无需显式管理。以下示例展示单线程使用默认Context的基础流程// 1. 初始化Runtime aclInit(nullptr); // 2. 指定Device自动创建默认Context和默认Stream int32_t deviceId 0; aclrtSetDevice(deviceId); // 3. 创建显式Stream可选也可直接使用默认Stream传入nullptr aclrtStream stream; aclrtCreateStream(stream); // 4. 在Stream上下发任务 aclrtMemcpyAsync(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); myKernel8, nullptr, stream(devPtr, size); aclrtMemcpyAsync(hostPtr, size, devPtr, size, ACL_MEMCPY_DEVICE_TO_HOST, stream); // 5. 同步等待任务完成 aclrtSynchronizeStream(stream); // 6. 销毁显式Stream aclrtDestroyStream(stream); // 7. 复位Device释放默认Context和默认Stream aclrtResetDeviceForce(deviceId); // 8. 去初始化 aclFinalize();多线程并行计算多个线程使用同一Device时推荐为每个线程创建独立Context// 线程函数 void* threadFunc(void* arg) { int32_t deviceId *(int32_t*)arg; // 每个线程创建自己的Context aclrtContext ctx; aclrtCreateContext(ctx, deviceId); // 创建Stream aclrtStream stream; aclrtCreateStream(stream); // 执行任务 // ... 业务逻辑 ... // 同步等待任务完成 aclrtSynchronizeStream(stream); // 销毁资源 aclrtDestroyStream(stream); aclrtDestroyContext(ctx); return nullptr; } // 主线程 int main() { aclInit(nullptr); int32_t deviceId 0; aclrtSetDevice(deviceId); // 创建多个线程 pthread_t threads[4]; for (int i 0; i 4; i) { pthread_create(threads[i], nullptr, threadFunc, deviceId); } // 等待线程完成 for (int i 0; i 4; i) { pthread_join(threads[i], nullptr); } aclrtResetDeviceForce(deviceId); aclFinalize(); return 0; }多线程Context共享多个线程共享同一Context时需自行保证Stream上任务的执行顺序aclrtContext g_ctx; // 全局Context void* threadFunc(void* arg) { int threadId *(int*)arg; // 切换到共享Context aclrtSetCurrentContext(g_ctx); // 创建线程专属Stream aclrtStream stream; aclrtCreateStream(stream); // 在自己的Stream上执行任务 // ... 业务逻辑 ... aclrtSynchronizeStream(stream); aclrtDestroyStream(stream); return nullptr; } int main() { aclInit(nullptr); int32_t deviceId 0; aclrtSetDevice(deviceId); // 创建一个Context供多线程共享 aclrtCreateContext(g_ctx, deviceId); pthread_t threads[4]; int threadIds[4]; for (int i 0; i 4; i) { threadIds[i] i; pthread_create(threads[i], nullptr, threadFunc, threadIds[i]); } for (int i 0; i 4; i) { pthread_join(threads[i], nullptr); } aclrtDestroyContext(g_ctx); aclrtResetDeviceForce(deviceId); aclFinalize(); return 0; }Context切换使用aclrtSetCurrentContext切换当前线程的Context// 在Device 0上创建两个Context aclrtSetDevice(0); aclrtContext ctx1, ctx2; aclrtCreateContext(ctx1, 0); aclrtCreateContext(ctx2, 0); // 切换到ctx1 aclrtSetCurrentContext(ctx1); aclrtStream stream1; aclrtCreateStream(stream1); // ... 在ctx1上执行任务 ... // 切换到ctx2 aclrtSetCurrentContext(ctx2); aclrtStream stream2; aclrtCreateStream(stream2); // ... 在ctx2上执行任务 ... // 切换Context时如果新Context属于不同DeviceDevice也会随之切换 aclrtSetDevice(1); aclrtContext ctx3; aclrtCreateContext(ctx3, 1); aclrtSetCurrentContext(ctx3); // 当前Context切换为ctx3Device也切换为1Context参数配置使用aclrtCtxSetSysParamOpt设置Context级别的参数aclrtContext ctx; aclrtCreateContext(ctx, 0); // 设置Context参数示例设置内存配置 aclrtCtxSetSysParamOpt(ACL_SYS_PARAM_OPT_XXX, value); // 获取Context参数 int64_t paramValue; aclrtCtxGetSysParamOpt(ACL_SYS_PARAM_OPT_XXX, paramValue);默认Stream获取每个Context包含一个默认Stream可通过接口获取aclrtContext ctx; aclrtCreateContext(ctx, 0); // 获取当前Context的默认Stream aclrtStream defaultStream; aclrtCtxGetCurrentDefaultStream(defaultStream); // 使用默认Stream也可直接传nullptr aclrtMemcpyAsync(dst, size, src, size, ACL_MEMCPY_DEVICE_TO_DEVICE, nullptr);如何用好Context推荐做法优先使用显式Context对于多线程或复杂应用显式创建Context代码意图更清晰。Context与线程绑定推荐在创建Context的线程中使用该Context避免跨线程使用带来的复杂性。及时销毁资源Context不再使用时及时销毁避免资源泄漏。使用aclrtResetDeviceForceDevice使用完毕后使用aclrtResetDeviceForce一次性释放Device上所有资源。明确Context切换时机在多Context场景下显式调用aclrtSetCurrentContext切换增加代码可读性。避免的做法不要销毁默认Context默认Context由Runtime管理不能调用aclrtDestroyContext销毁。避免Context状态不确定多线程共享Context时避免依赖Context的隐式状态切换。不要跨线程随意操作同一Stream如果必须在多线程间共享Context每个线程应使用独立的Stream。不要在已复位的Device上使用ContextDevice被复位后相关Context不可用。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AMD Llama-2-70b-chat-hf_FP8_MLPerf_V2模型架构解析:80层Transformer的FP8量化实现

AMD Llama-2-70b-chat-hf_FP8_MLPerf_V2模型架构解析:80层Transformer的FP8量化实现

AMD Llama-2-70b-chat-hf_FP8_MLPerf_V2模型架构解析:80层Transformer的FP8量化实现 【免费下载链接】Llama-2-70b-chat-hf_FP8_MLPerf_V2 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Llama-2-70b-chat-hf_FP8_MLPerf_V2 AMD Llama-2-70b-chat-hf_FP…

📅 2026/10/18 17:33:19
抖音无水印下载完整指南:5分钟掌握免费批量下载神器

抖音无水印下载完整指南:5分钟掌握免费批量下载神器

抖音无水印下载完整指南:5分钟掌握免费批量下载神器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…

📅 2026/10/19 18:27:58
Claude Opus 4.7真伪校验:API服务信任审计实战指南

Claude Opus 4.7真伪校验:API服务信任审计实战指南

1. 这不是模型评测,而是一场API服务信任危机的现场拆解最近朋友圈和开发者群被一条消息刷屏:“Anthropic正式发布Claude Opus 4.7,全网首发支持!”——配图是某中转平台后台的“modelclaude-4.7-opus”下拉选项,截图里…

📅 2026/9/17 15:01:50
MORE NEWS

更多资讯

📰

YOLOv11目标检测:架构革新与工业应用实践

1. YOLOv11项目概述:目标检测领域的进化新星第一次接触YOLOv11是在一个工业质检项目的技术选型会上。当时客户需要实时检测流水线上的微小缺陷,我们对比了YOLOv5、YOLOv7等多个版本后,最终被YOLOv11的创新设计所折服。这个由Ultralytics团队在…

📰

深度学习量化交易系统:从回测到实盘的决策引擎构建

简介:本资源是一套完整的基于深度学习的股票量化交易实践项目,面向人工智能与金融科技方向的本科生毕业设计、课程设计及Python深度学习初学者。项目聚焦利用RNN、CNN、TFT、DLinear、TSMixer等主流时序模型预测股价并构建可回测交易策略,覆盖…

📰

国产图像生成模型五类技术范式深度解析

1. 这不是“又一个AI绘图模型列表”,而是五类图像生成范式的分水岭 你点开这篇内容,大概率刚被某篇“5大国产文生图模型横评”刷屏——标题吸睛,配图炫酷,但点进去全是参数堆砌、截图拼贴、效果对比模糊得像隔着毛玻璃看烟花。我试…

📰

AI模型推理性能优化:从硬件到算法的全链路排查指南

1. AI模型推理性能瓶颈排查全景图当我们在生产环境部署AI模型时,经常会遇到推理延迟高、吞吐量上不去的问题。上周我就遇到一个典型案例:某电商推荐系统的BERT模型在测试环境QPS能达到200,上线后却暴跌到50以下。经过三天深度排查&#xff0c…

📰

基于YOLOv12的水下鱼类检测系统开发与实践

1. 项目概述:水下鱼类检测系统的技术架构与应用价值这个基于YOLOv12的水下鱼类检测系统,本质上是一个融合了计算机视觉、深度学习与软件工程的综合解决方案。我在实际开发中发现,水下环境的光线折射、悬浮颗粒和动态模糊等问题,使…

📰

YOLO26 GFPN特征融合架构解析与优化实践

1. 项目概述:YOLO26的GFPN特征融合创新在目标检测领域,YOLO系列算法始终保持着迭代创新的步伐。最近发布的YOLO26版本中,最引人注目的改进莫过于全新设计的GFPN(Generalized Feature Pyramid Network)特征融合架构。这…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬