PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=117)

环境说明
  • 高通865 android盒子
  • Hexagon_SDK

前言


  由于业务需求,我们需要展示高通865的cpu/gpu/dsp的使用率,其中cpu/gpu是非常简单的。但是对于dsp来说,我找了许久,才发现了一点点端倪,下面就是这一部分成果。

高通cDSP使用率查询


  要实现高通dsp使用率的查询,我们最开始查询到的一点资料是一个sysmon tools,这个工具在高通的sdk中,这个工具可以查看相关的利用率,所以我们按照这个方向走下去。

安装高通dsp sdk

  去此网站下载sdk并安装(https://developer.qualcomm.com/software/hexagon-dsp-sdk/tools) 。注意,安装需要java环境,请自备。

  然后我们需要检查我们的环境配置。

  参考SDK目录中Hexagon_SDK/3.5.4/docs/calculator_c++.html,然后进入Hexagon_SDK\3.5.4\examples\common\calculator_c++目录,编译生成target文件及模拟文件。然后安装教程,将计算器例子拷贝到设备相关目录进行运行,成功得到计算结果。这代表环境配置正确。

  注意:这里可能会有很多问题,多看文档,多对比。特别是设备对应的dsp工具链选对,详情参考:Hexagon_SDK/3.5.4/docs/feature_matrix.html。

  在这一步的计算器例子执行完成之后,基本上,我们应该知道生成的文件有3个,一个是android adb 可执行文件,一个是可执行文件对应的ndk库。一个是ndk库对应的dsp调用so。它们之间的关系是执行可执行文件,查找对应的符号,然后通过fastrpc调用dsp对应的符号,并得到结果。详情参考:Hexagon_SDK/3.5.4/docs/APIs_FastRPC.html#FastRPC%20architecture

高通cDSP使用率查询原理分析

  在Hexagon_SDK\3.5.4\tools\utils\sysmon,当我把sysMon_DSP_Profiler_V2.apk安装到系统后,终于看到了cDSP使用率查询的一丝方法。从图中可知,我们得到了dsp的当前工作频率,以及当前的使用率。但是我的需求是制作一个小工具,能够直接打印出core utilization,所以需要想其他办法。

  当我了解到这些内容后,就得把目标放在高通sdk里面的perf相关内容里面,我查询了相关api和文档后(Hexagon_SDK/3.5.4/docs/APIs_DSP%20Clk%20&%20Rsrc%20Mgmt.html),发现了两个相关的内容,DSP Power and Performance Management 以及 HAP PMU framework。但是这个时候,我还是没有办法知道官方的工具里面显示的使用率是怎么算的。最开始:根据文档Hexagon_SDK/3.5.4/docs/images/Hexagon_Document_Bundle.pdf 第9章 processor event symbols,我以为直接用COMMITTED_PKT_ANY及COMMITTED_PKT_SMT就能计算出使用率,但是经过我的分析,怎么算都对不上,这个时候我又把重心转向官方的分析工具,官方的分析工具能够保存数据,然后用官方的其他的工具来后处理之后进行分析,看看能否从这里找到一些相关信息。

  再次使用官方工具分析dsp信息然后保存相关的数据文件,然后dump到windows上,得到sysmon_CDSP.bin,用工具分析。在Hexagon_SDK\3.5.4\tools\utils\sysmon\parser_win_v2 目录有两个工具,一个是解析工具,一个是生成html报告,我们按照官方的方法生成html报告,如下图。

  我们打开生成的html报告,我在报告中总算查看到了QDSP6 Utilization和QDSP6 Core performance ,如下图。通过阅读相关含义,了解到了官方app中的core utilization的计算方法。其计算方法为:使用率=(总执行次数/当前频率(hz) * 采样时间(s))* 100。原理解释:总执行次数除以当前频率下满载运行次数,得到使用率。这里的总执行次数由HAP_perf_get_pcycles来得到,当前运行频率由HAP_power_get得到。到此,整个技术上的链条打通了,现在开始编写小程序。

高通cDSP编程

  首先,直接复制一个calculator_c++官方例子工程来作为模板,根据我了解到的资料,直接选取makefile作为作为编译手段。通过编写dsp的小程序,然后得到我们的使用率。下面是重要api的展示。

/**
* Data type to retrieve power values from the ADSP
* @param type - Identifies the type to retrieve.
* @param max_mips - Max mips supported
* @param max_bus_bw - Max bus bw supported
* @param client_class - Current client class
* @param clkFreqHz - Current core CPU frequency
* @param aggregateAVSMpps - Aggregate AVS Mpps used by audio and voice
* @param dcvsEnabled - Indicates if dcvs is enabled / disabled.
*/
typedef struct {
HAP_Power_response_type type;
union{
unsigned int max_mips;
uint64 max_bus_bw;
unsigned int client_class;
unsigned int clkFreqHz;
unsigned int aggregateAVSMpps;
boolean dcvsEnabled;
};
} HAP_power_response_t; /**
* Method to retrieve power values from the ADSP
* @param context - Ignored
* @param request - Response.
*/
int HAP_power_get(void* context, HAP_power_response_t* response); /*
HAP_perf_get_pcycles Gets the current 64-bit processor cycle count The processor cycle count is the current number of processor cycles executed
since the Hexagon processor was last reset. Note that this counter stops incrementing whenever the DSP enters a low-power
state (such as clock gating), as opposed to the qtimer, which increments
regardless of the DSP power state. Returns:
Integer -- Current count of Hexagon processor cycle count.
*/
uint64 HAP_perf_get_pcycles(void);

  对于我们编写dsp小程序来说,有一个值得注意的地方,这些api虽然我们是在android ndk程序里面调用的,但是我们仅仅是在android ndk侧找到符号,然后通过fastrpc将参数发给dsp端,dsp端调用对应的api后,将结果返回给android ndk端。此部分重点参考前文环境配置部分,对于新手来说,很难理解或者说适应这个东西。

高通cDSP程序部署及签名

  由于高通的cDSP程序调用方式比较特殊,我们应该按照官方Hexagon_SDK/3.5.4/docs/calculator_c++.html例子中推荐的部署方式,如果需要自定义部署,请参考环境变量DSP_LIBRARY_PATH。也就是拷贝android侧文件到对应目录,拷贝dsp侧目录到对应目录。

  此外,当你真的自定义程序并部署使用的时候,会遇到签名问题。在开发阶段,我们都是使用testsign,具体详情参考:Hexagon_SDK/3.5.4/docs/Tools_Signing.html,就是按照官方方法生成一个对应的testsign-xxxx.so的文件,此文件包含了当前设备的id,能够让运行在当前设备上的程序免签。但是这种方法只能够用于调试,对于大规模使用,需要采取另外的部署方式,一种是联系厂家,提供批量签名工具,另外就是使用 Unsigned PD 功能(Unsigned PD is a sandboxed low-rights process that allows the signature-free modules to run on the cDSP.)。Unsigned PD可以让一些低权程序运行在dsp上,主要还是被用于神经网络推理。但是就是这个Unsigned PD也是不是那么好用的,这里直接copy小米mace框架里面的so和代码,在执行任何dsp api之前调用hexnn_controller_request_unsigned_pd(https://github.com/XiaoMi/mace/blob/fa72958a647be9457cf0a19d2f1195205a4b1a58/mace/runtimes/hexagon/dsp/hexagon_dsp_wrapper.cc) 。 这里不得不感叹一句,这些厂家的py关系真好。

  当所有部署完毕之后,执行dsp程序得到如下图结果:

RK3588 NPU使用率查询


  要实现高通dsp使用率的查询,我们最开始查询到的一点资料是一个sysmon tools,这个工具在高通的sdk中,所以我们按照这个方向走下去。

后记


  这里关于dsp编程来说,我这里可以说仅仅是一个小demo,这个部分最有价值的还是计算加速部分,一些重要的向量运算,这次我没有这个需求就不去关注了。

  但是换句话说,有了这一部分的经验后,后面哪怕是学习一些深入的东西,也是有一点基础在的。

参考文献

[1]Qualcomm.Hexagon SDK 3.5.4 Doc

[2]RockChip.Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN


打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

如某些图片无法查看,请尝试开启外网

高通cDSP简单编程例子(实现查询高通cDSP使用率、签名),RK3588 npu使用率查询的更多相关文章

  1. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  2. ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...

  3. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  4. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  5. 为什么C语言在2013年仍然很重要:一个简单的例子

    附注:在最初的文章里,我没说明进行模2^64的计算——我当然明白那些不是“正确的”斐波那契数列,其实我不是想分析大数,我只是想探寻编译器产生的代码和计算机体系结构而已. 最近,我一直在开发Dynvm— ...

  6. 高质量C++/C编程指南

    http://man.chinaunix.net/develop/c&c++/c/c.htm#_Toc520634042 高质量C++/C编程指南 文件状态 [  ] 草稿文件 [√] 正式文 ...

  7. Python编程初学者指南PDF高清电子书免费下载|百度云盘

    百度云盘:Python编程初学者指南PDF高清电子书免费下载 提取码:bftd 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计算 ...

  8. 简单的例子了解自定义ViewGroup(一)

    在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...

  9. 《高质量C++/C编程指南》陷阱 【转】

    作者:幻の上帝 出处:http://hi.baidu.com/frankhb1989/item/185f0a14823dd1f8dceeca2c 此文硬伤不少,且相对谭XX的书而言隐晦许多,不建议新手 ...

随机推荐

  1. 使用CSS实现《声生不息》节目Logo

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 <声生不息> 是芒果TV.香港电视广播有限公司和湖南卫视联合推 ...

  2. MyBatisPlus详解

    1.MyBatisPlus概述 需要的基础:MyBatis.Spring.SpringMVC 为什么要学习?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! 简介 ...

  3. Cocos---大作业:简单H5小游戏

    Cocos大作业:传统美食分分类 知识点清单: 场景切换,监听时间,碰撞组件及回调,拖动角色移动,分数记录,随机数和定时器,背景音乐控制,资源池控制,预制体,进度条... 源码+q:143144832 ...

  4. 纯CSS如何禁止用户复制网页的内容?

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  5. 记一次IIS网站启动不了的问题排查

    今天清理了下机器中的IIS网站,将很久不用的网站都删除. 因为需要删除的比较多,正在使用的很少,就将网站全部删除了,然后准备重新添加需要用的. 在添加了网站后,点击启动按钮,发现网站启动不了,因为网站 ...

  6. WPF|快速添加新手引导功能(支持MVVM)

    阅读导航 前言 案例一 案例二 案例三(本文介绍的方式) 如何使用? 控件如何开发的? 总结 1. 前言 案例一 站长分享过 眾尋 大佬的一篇 WPF 简易新手引导 一文,新手引导的效果挺不错的,如下 ...

  7. 【freertos】009-任务控制

    目录 前言 9.1 相对延时 9.1.1 函数原型 9.1.2 函数说明 9.1.3 参考例子 9.2 绝对延时 9.2.1 函数原型 9.2.2 函数说明 9.2.3 参考例子 9.3 获取任务优先 ...

  8. React简单教程-3.1-样式之使用 tailwindcss

    前言 本文是作为一个额外内容,主要介绍 tailwindcss 的用法 tailwindcss 是一个功能类优先的 CSS 框架,我在以前的文章里有描述为什么使用功能类优先:为什么我在 css 里使用 ...

  9. 在Visual C++ 6.0中无法使用gets()函数的解决办法

    问题 昨晚遇到一个有意思的问题,明明在Visual Studio 2019运行好好的C语言代码,Copy到Visual C++ 6.0中就无法编译通过了,错误提示信息如下: error C2143: ...

  10. Jmeter(五十四) - 从入门到精通高级篇 - 如何在linux系统下运行jmeter脚本 - 上篇(详解教程)

    1.简介 上一篇宏哥已经介绍了如何在Linux系统中安装Jmeter,想必各位小伙伴都已经在Linux服务器或者虚拟机上已经实践并且都已经成功安装好了,那么今天宏哥就来介绍一下如何在Linux系统下运 ...