开发应用时,应用程序中必须包含运行管理资源申请的代码逻辑,关于运行管理资源申请的接口调用流程,请先参见AscendCL接口调用流程了解整体流程,再查看本节中的资源申请、释放流程说明。
您需要按顺序依次申请如下运行管理资源:Device、Context、Stream,确保可以使用这些资源执行运算、管理任务。所有数据处理都结束后,需要按顺序依次释放运行管理资源:Stream、Context、Device。
您需要按照Device、Context、Stream的顺序依次申请。其中,创建Context、Stream的方式分为隐式创建和显式创建,其适用场景有所不同:
关键接口的说明如下:
调用aclrtCreateContext接口显式创建Context,调用aclrtCreateStream接口显式创建Stream。系统在显式创建Context时,系统内部会调用aclrtSetDevice接口指定运行的Device,Device ID通过aclrtCreateContext接口传入。
如果查询结果为ACL_HOST,则数据传输时涉及申请Host上的内存。
如果查询结果为ACL_DEVICE,则数据传输时仅需申请Device上的内存。
数据传输的详细介绍请参见数据传输。
关键接口的说明如下:
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 初始化变量 extern bool g_isDevice; // =====运行管理资源申请===== // 指定运算的Device aclError ret = aclrtSetDevice(deviceId_); // 显式创建一个Context,用于管理Stream对象 ret = aclrtCreateContext(&context_, deviceId_); // 显式创建一个Stream // 用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序执行任务 ret = aclrtCreateStream(&stream_); // 获取当前昇腾AI软件栈的运行模式,根据不同的运行模式,后续的接口调用方式不同 aclrtRunMode runMode; ret = aclrtGetRunMode(&runMode); g_isDevice = (runMode == ACL_DEVICE); // =====运行管理资源申请===== // ...... // =====运行管理资源释放===== ret = aclrtDestroyStream(stream_); ret = aclrtDestroyContext(context_); ret = aclrtResetDevice(deviceId_); // =====运行管理资源释放===== // ...... |