【2023 · CANN训练营第一季】运行资源管理初探
【2023 · CANN训练营第一季】运行资源管理初探
一、申请运行资源
申请运行管理资源顺序:Device->Context->Stream
推荐这三者都显式的创建,这样有助于我们理清初始化的思路。
但是也可以隐式创建:
创建Device后不调用函数创建Context和Stream,系统会在调用Device创建函数时默认创建的Context和Stream,如果二者需要作为借口参数时,直接传NULL即可。
不显式创建Device,则需要显式创建Context和Stream,创建Context时系统内部会调用接口指定运行的Device。
所用到的函数:
note:Context创建后只能在该线程下使用,跨线程使用的时无法使用其他线程的Context。
二、API内容
1.Device管理
相关函数:
aclError aclrtSetDevice(int32_t deviceId) //指定当前进程或线程中用于运算的Device,同时隐式创建默认Context。同步接口。
aclError aclrtResetDevice(int32_t deviceId) //复位当前运算的Device,释放Device上的资源,包括默认Context、默认Stream以及默认Context下创建的所有Stream,同步接口
aclError aclrtGetDevice(int32_t *deviceId) 获取当前正在使用的Device的ID,同步接口。
aclError aclrtGetRunMode(aclrtRunMode *runMode)//获取当前昇腾AI软件栈的运行模式
aclError aclrtGetDeviceCount(uint32_t count)//获取可用Device的数量,同步接口。
2.Context管理
相关函数:
aclError aclrtCreateContext(aclrtContext *context, int32_t deviceId) //在当前进程或线程中显式创建一个Context。同步接口
aclError aclrtDestroyContext(aclrtContext context) //销毁一个Context,释放Context的资源,同步接口。只能销毁通过aclrtCreateContext接口创建的Context。
aclError aclrtSetCurrentContext(aclrtContext context) //设置线程的Context,同步接口。
aclError aclrtGetCurrentContext( aclrtContext *context) //获取线程的Context,同步接口。如果用户多次调用aclrtSetCurrentContext接口设置当前线程的Context,则获取的是最后一次设置的Context。
3.Stream管理
相关函数:
aclError aclrtCreateStream(aclrtStream stream) //在当前进程或线程中创建一个Stream,同步接口。
aclError aclrtDestroyStream(aclrtStream stream) //销毁指定Stream,只能销毁通过aclrtCreateStream接口创建的Stream,同步接口。
三、申请&释放运行资源代码验证学习
简单测试这些函数的用法:
编译使用的cmake如下,随便在sample中找了个C++的工程简单改了改,有空后面弄个makeFile用一下,要简单一些
为了输入编译cmake简单,搞了个简单脚本build.sh协助运行一下
测试的代码,其内容为:acl初始化后读取device数量,并设置要用的device,依次创建Context和Stream等,并按照创建顺序的逆序销毁。
这里切用户踩了一个小坑,就是发现切完没有用户,捣鼓了半天,突然看到网上有人建议输入 bash 一下,才出来用户

运行build.sh

生成makefile文件,输入make

在out下生成了main执行文件,运行它

发现报错,在社区文档中查询aclError

于是我们创建该文件,再次运行。运行成功

ps:该文仅是为了记录CANN训练营的学习过程所用,不参与任何商业用途,有代码问题可以私下与我交流修改