开发者
下载

Context概念及使用场景

Context概念

Context是CANN Runtime中的核心抽象,代表一个Device上的执行上下文环境。它封装了Device上的计算资源、内存资源、Stream资源等运行时状态,是Runtime操作的基础载体。

每个Context与特定的Device绑定,包含该Device上的:

  • 计算资源:用于执行Kernel、系统任务等;
  • 内存资源:设备内存分配与管理;
  • Stream资源:任务队列及调度状态;
  • 运行时配置:影响任务执行的参数。

Context与线程绑定,同一时刻一个线程只能使用一个Context。Runtime接口在执行时,会自动使用当前线程绑定的Context。

为什么要用Context

使用Context的核心场景如下:

  1. 多线程并行计算:多个线程并发使用同一Device时,各自创建独立Context,避免资源竞争和状态混乱。
  2. 精细资源控制:需要更细粒度地控制资源创建、使用、释放时机。
  3. 多线程Context共享:在同进程多线程场景下,显式创建的Context可在多线程间共享使用。
  4. 模块化程序设计:不同功能模块使用独立Context,便于资源管理和问题定位。

调用aclrtSetDevice接口时,Runtime会自动为指定Device创建一个默认Context。对于简单应用,使用默认Context即可满足需求。但对于复杂应用,显式创建和管理Context具有以下优势。

表1 显式Context vs 默认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。