Context概念及使用场景
Context概念
Context是CANN Runtime中的核心抽象,代表一个Device上的执行上下文环境。它封装了Device上的计算资源、内存资源、Stream资源等运行时状态,是Runtime操作的基础载体。
每个Context与特定的Device绑定,包含该Device上的:
- 计算资源:用于执行Kernel、系统任务等;
- 内存资源:设备内存分配与管理;
- Stream资源:任务队列及调度状态;
- 运行时配置:影响任务执行的参数。
Context与线程绑定,同一时刻一个线程只能使用一个Context。Runtime接口在执行时,会自动使用当前线程绑定的Context。
为什么要用Context
使用Context的核心场景如下:
- 多线程并行计算:多个线程并发使用同一Device时,各自创建独立Context,避免资源竞争和状态混乱。
- 精细资源控制:需要更细粒度地控制资源创建、使用、释放时机。
- 多线程Context共享:在同进程多线程场景下,显式创建的Context可在多线程间共享使用。
- 模块化程序设计:不同功能模块使用独立Context,便于资源管理和问题定位。
调用aclrtSetDevice接口时,Runtime会自动为指定Device创建一个默认Context。对于简单应用,使用默认Context即可满足需求。但对于复杂应用,显式创建和管理Context具有以下优势。
|
场景 |
默认Context |
显式Context |
|---|---|---|
|
多线程编程 |
线程间共享默认Context,任务执行顺序依赖线程调度 |
每个线程独立Context,便于隔离和调试 |
|
资源隔离 |
同一Device上的不同模块共享资源 |
不同模块使用独立Context,资源隔离更清晰 |
|
代码可维护性 |
线程切换Device时Context状态不明确 |
显式指定Context,代码意图清晰 |
|
资源生命周期 |
随Device生命周期管理 |
独立控制Context创建和销毁时机 |
Context与Device、Stream的关系
Context与Device、Stream的关系如下图所示:

- Device:物理NPU设备,一个Device上可创建多个Context。
- Context:Device上的执行上下文,包含默认Stream和用户创建的Stream。
- Stream:任务队列,归属于特定Context。
父主题: Context管理