当前位置: 首页 > news >正文

学习昇腾开发的第11天--主要接口调用流程

一、主要接口调用流程:

二、运行管理资源Device、Context、Stream基本关系:

1)Context作为一个容器,管理了所有对象(包括Stream、Event、设备内存等)的生命周期。不同Context的Stream、不同Context的Event是完全隔离的,无法建立同步等待关系

2)Stream用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在Device上执行。

3)Event支持调用AscendCL接口同步Stream之间的任务,包括同步Host与Device之间的任务、Device与Device间的任务。

总结:一般情况下单线程多Stream性能更优。

三、VDEC视频解码

四、ATB加速库接口

  • CANN版本≥8.0.0且MindIE版本≥1.0.0时,直接使用MindIE的推理引擎调用ATB加速库。在需要回退CANN版本时,回退后的CANN版本不能<8.0.0。
  • CANN版本<8.0.0或MindIE版本<1.0.0时,在需要升级或者回退CANN版本时,请基于目标CANN版本重新编译调用ATB的程序,才能正常使用ATB加速库。

由于我的cann是7.0.0RC1版本,无法使用ATB,所以需要升级CANN。

在资源下载中心社区版,重新去下载CANN包和MindIE包。

升级步骤参考:

升级CANN-CANN商用版8.1.RC1-昇腾社区

注意:升级驱动一定要查看版本是否适配(一般适配就近版本)

如果固件、驱动、toolkit、kernels版本配套,可以直接单独升级CANN,如果不配套就升级,大概率会升级失败,此时最好选择升级的路径是:固件-->驱动-->CANN

注意!:如果升级固件失败,可能是固件包不匹配

解决方法:不升级固件驱动包,选择版本稍低一点的cann(toolkit和kernels两个包)

注意!:如果CANN还是升级失败就选择install的方式安装

eg:./Ascend-cann-kernels-<chip_type>_<version>_linux-<arch>.run --install

五、调用ACL接口有对应链接但找不到函数实现问题

具体报错:

通过查询官方文档,从acl v1.2.0起所有新版本的acl不再支持这两个api,意思就是这连各国api已经被废弃了!!!部分api有新的替代api,当然目前还没看到这两个错误信息的替代api。

可以通过代码来判断当前ACL版本:

int32_t major = 0, minor = 0, patch = 0;
aclError ret = aclrtGetVersion(&major, &minor, &patch);if (ret == ACL_SUCCESS) {std::cout << "AscendCL Version: " << major << "." << minor << "." << patch << std::endl;
} else {std::cerr << "Failed to get AscendCL version, error code: " << ret << std::endl;
}

代码实现(目前实现部分后续补充):

1、ACL初始化

// 初始化aclaclError acl_Init_ret =aclInit(NULL);if (acl_Init_ret != ACL_SUCCESS) {qDebug() << "Failed to Init ACL, error:" << acl_Init_ret;}else qDebug()<<"sucssce:"<<acl_Init_ret;

2、运行管理资源申请

 //获取可用Device的数量uint32_t deviceCount = 0;  // 定义一个变量接收设备数量aclError acl_deviceCount_ret = aclrtGetDeviceCount(&deviceCount);if (acl_deviceCount_ret == ACL_SUCCESS) {qDebug() <<"sucssce:"<<acl_deviceCount_ret<< "Device count:" << deviceCount;} else {qDebug() << "Failed to get device count, error:" << acl_deviceCount_ret;}// 设置使用设备0aclError acl_SetDevice_ret = aclrtSetDevice(0);if (acl_SetDevice_ret != ACL_SUCCESS) {qDebug() << "Failed to set device, error:" << acl_SetDevice_ret;}else qDebug()<<"sucssce:"<<acl_SetDevice_ret;//显示创建ContextaclrtContext myContext0;aclError acl_CreateContext_ret = aclrtCreateContext(&myContext0,0);if(acl_CreateContext_ret != ACL_SUCCESS){qDebug() << "Failed to Create Context, error:" << acl_CreateContext_ret;}else qDebug()<<"sucssce:"<<acl_CreateContext_ret;//显示创建StreamaclrtStream myStream0;aclError acl_CreateStream_ret = aclrtCreateStream(&myStream0);if(acl_CreateStream_ret != ACL_SUCCESS){qDebug() << "Failed to Create Context, error:" << acl_CreateStream_ret;}else qDebug()<<"sucssce:"<<acl_CreateStream_ret;

3、创建一个C++线程

4、实现回调函数

void Utils:: callback(acldvppStreamDesc *input, acldvppPicDesc *output, void *userdata)
{Utils utilsobj;static int count = 1;if (output != nullptr) {//获取VDEC解码的输出内存,调用自定义函数WriteToFile将输出内存中的数据写入文件后,再调用acldvppFree接口释放输出内存void *vdecOutBufferDev = acldvppGetPicDescData(output);if (vdecOutBufferDev != nullptr) {// 0: vdec success; others, vdec failed//retCode为0表示解码成功,为1表示解码失败。如果解码失败,需要根据日志中的返回码判断具体的问题,返回码请参见返回码说明。int retCode = acldvppGetPicDescRetCode(output);if (retCode == 0) {// process task: write fileuint32_t size = acldvppGetPicDescSize(output);std::string fileNameSave = "outdir/image" + std::to_string(count);// vdec输出结果在device侧,在WriteToFile方法中进行下述处理if (!utilsobj.WriteToFile(fileNameSave.c_str(), vdecOutBufferDev, size)) {ERROR_LOG("write file failed.");}} else {ERROR_LOG("vdec decode frame failed.");}// free output vdecOutBufferDevaclError ret = acldvppFree(vdecOutBufferDev);}// 释放acldvppPicDesc类型的数据,表示解码后输出图片描述数据aclError ret = acldvppDestroyPicDesc(output);}// free input vdecInBufferDev and destroy stream descif (input != nullptr) {void *vdecInBufferDev = acldvppGetStreamDescData(input);if (vdecInBufferDev != nullptr) {aclError ret = acldvppFree(vdecInBufferDev);}// 释放acldvppStreamDesc类型的数据,表示解码的输入码流描述数据aclError ret = acldvppDestroyStreamDesc(input);}INFO_LOG("success to callback %d.", count);count++;
}

http://www.lqws.cn/news/602389.html

相关文章:

  • CMU-15445(6)——PROJECT#2-BPlusTree-Task#1
  • 记一次Ubuntu22安装MongoDB8并同步本地数据过程
  • 应急响应类题练习——玄机第四章 windows实战-emlog
  • 微信小程序使用秋云ucharts echarts
  • 高阶数据结构------并查集
  • 数据结构day7——文件IO
  • STM32——存储器映射(Memory mapping)
  • 反向传播 梯度消失
  • OSE3.【Linux】练习:编写进度条及pv命令项目中的进度条函数
  • 07CSRF 漏洞保护
  • vite项目中引入tailwindcss,难倒AI的操作
  • Modbus协议
  • 数字图像处理学习笔记
  • Spring IOC容器核心阶段解密:★Bean实例化全流程深度剖析★
  • 菜谱大全——字符串处理艺术:从文本解析到高效搜索 [特殊字符][特殊字符]
  • 城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 自由学习记录(66)
  • RESTful API 设计原则深度解析
  • 转录组分析流程(六):列线图
  • 笨方法学python-习题12
  • JavaScript 安装使用教程
  • 解码知识整理,使您的研究更高效!
  • 分区表设计:历史数据归档与查询加速
  • [论文阅读] 人工智能 + 软件工程 | 从软件工程视角看大语言模型:挑战与未来之路
  • python训练day46 通道注意力
  • 2025-0701学习记录19——“问题-方法-洞见”框架做汇报
  • 半导体和PN结
  • socket编程
  • Android11 添加自定义物理按键事件监听回调
  • Vite 7.0 与 Vue 3.5:前端开发的性能革命与功能升级