欢迎光临散文网 会员登陆 & 注册

【2023 · CANN训练营第一季】运行资源管理初探

2023-05-07 20:37 作者:白子不摆烂版  | 我要投稿

【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训练营的学习过程所用,不参与任何商业用途,有代码问题可以私下与我交流修改



【2023 · CANN训练营第一季】运行资源管理初探的评论 (共 条)

分享到微博请遵守国家法律