接口调用流程
开发应用时,应用程序中必须包含运行管理资源申请的代码逻辑,关于运行管理资源申请的接口调用流程,请先参见pyACL接口调用流程,了解整体接口调用流程,再查看本节中的资源申请、释放流程说明。
运行管理资源包括:Device、Context、Stream。
运行管理资源申请
您需要按顺序依次申请如下运行管理资源:Device、Context、Stream,确保可以使用这些资源执行运算、管理任务。
图1 运行管理资源申请流程
- 创建Context、Stream的方式分为隐式创建和显式创建,推荐使用显式创建。
表1 Context和Stream显式创建与隐式创建差异 差异点
显式创建的Context和Stream
隐式创建的Context和Stream
创建
- Context需调用acl.rt.create_context接口。
- Stream需调用acl.rt.create_stream接口。
使用acl.rt.set_device接口隐式创建默认Context和默认Stream。
释放
- 释放时需显式调用acl.rt.destroy_context接口。
- 释放时需显式调用acl.rt.destroy_stream接口。
调用acl.rt.reset_device接口后自动释放默认Context和默认Stream。
- 一个Device对应一个默认Context,默认Context不能通过acl.rt.destroy_context接口来释放。
- 一个Device对应一个默认Stream,默认Stream不能通过acl.rt.destroy_stream接口来释放。默认Stream作为接口入参时,直接传0。
- 隐式创建Context和Stream:适合简单、无复杂交互逻辑的应用,但缺点在于,在多线程编程中,每个线程都使用默认Context或默认Stream,默认Stream中任务的执行顺序取决于操作系统线程调度的顺序。
- 显式创建Context和Stream:适合大型、复杂交互逻辑的应用,且便于提高程序的可读性、可维护性。
- 关键接口的说明如下:
- 申请运行管理资源时,需按顺序依次申请:Device、Context、Stream。
- 调用acl.rt.set_device接口显式指定用于运算的Device。
- 调用acl.rt.create_context接口显式创建Context,调用acl.rt.create_stream接口显式创建Stream。
- 不显式创建Context和Stream,系统会使用默认Context、默认Stream,该默认Context、默认Stream是在调用acl.rt.set_device接口时隐式创建的。
默认Stream作为接口入参时,直接传0。
- 不显式指定用于运算的Device。
调用acl.rt.create_context接口显式创建Context,调用acl.rt.create_stream接口显式创建Stream。系统在显式创建Context时,系统内部会调用acl.rt.set_device接口指定运行的Device,Device ID通过acl.rt.create_context接口传入。
- 调用acl.rt.set_device接口显式指定用于运算的Device。
- (可选)调用acl.rt.get_run_mode接口获取软件栈的运行模式,根据运行模式来判断后续的内存申请接口调用逻辑。
如果查询结果为ACL_HOST,则数据传输时涉及申请Host上的内存。
如果查询结果为ACL_DEVICE,则数据传输时仅需申请Device上的内存。
数据传输的详细介绍请参见数据传输。
- 申请运行管理资源时,需按顺序依次申请:Device、Context、Stream。
运行管理资源释放
所有数据处理都结束后,需要按顺序依次释放运行管理资源:Stream、Context、Device。
图2 运行管理资源释放流程
关键接口的说明如下:
- 显式创建Context和Stream时,需调用acl.rt.destroy_stream接口释放Stream,再调用acl.rt.destroy_context接口释放Context。若显式调用acl.rt.set_device接口指定运算的Device时,还需调用acl.rt.reset_device接口释放Device上的资源。
- 不显式创建Context和Stream时,仅需调用acl.rt.reset_device接口释放Device上的资源。
父主题: 运行管理资源申请与释放