示例代码
关于多线程、多Stream的场景,请参见Stream管理。
基本原理
您需要按顺序依次申请如下运行管理资源:Device、Context、Stream,确保可以使用这些资源执行运算、管理任务。所有数据处理都结束后,需要按顺序依次释放运行管理资源:Stream、Context、Device。
- 关于Context和Stream。
- 显式创建Context时,调用acl.rt.create_context接口,此时需显式调用acl.rt.destroy_context接口释放。
- 显式创建Stream时,调用acl.rt.create_stream接口,此时需显式调用acl.rt.destroy_stream接口释放。
- 如果不显式创建Context和Stream,您可以使用acl.rt.set_device接口隐式创建的默认Context和默认Stream,但默认Context和默认Stream存在如下限制:
- 一个Device对应一个默认Context,默认Context不能通过acl.rt.destroy_context接口来释放。
- 一个Device对应一个默认Stream,默认Stream不能通过acl.rt.destroy_stream接口来释放。默认Stream作为接口入参时,直接传0。
- 默认Context、默认Stream,是在调用acl.rt.reset_device接口后自动释放。
- 关于单进程、单线程、单Stream场景。
示例代码
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import acl #...... # ======运行管理资源申请====== # 1.指定运算的Device。 ret = acl.rt.set_device(device_id) # 2.显式创建一个Context,用于管理Stream对象。 context, ret = acl.rt.create_context(device_id) # 3.显式创建一个Stream。 #用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序执行任务。 stream, ret = acl.rt.create_stream() # ======运行管理资源申请====== #...... # ======运行管理资源释放====== ret = acl.rt.destroy_stream(stream) ret = acl.rt.destroy_context(context) ret = acl.rt.reset_device(device_id) # ======运行管理资源释放====== #...... |
父主题: 运行管理资源申请与释放