如何获取Adreno GPU数据

news2025/1/19 23:14:16

什么是GPU

        GPU(Graphic Processing Unit)是图形处理器,相当于在计算机和移动终端上做图形图像运算工作的微处理器,显示芯片。通过向量计算和并行计算等方式加速了原有的计算工作,能够更好地处理几何转换和光照计算等,更是在深度学习领域起着不可或缺的作用。

什么是Adreno GPU

        Adreno GPU为采用了骁龙处理器的移动终端提供游戏机品质的3D图形处理能力,为游戏、用户界面和高性能计算任务提供更快的图形处理。

如何获取Adreno GPU性能数据

1. 使用Adreno profiler

链接:Adreno GPU Profiler - Qualcomm Developer Network

高通官方提供了对应的Profiler 工具,不过具体的内容并没有开源,如果需要实时获取profiler性能还是推荐直接使用官方的工具。

2. 使用第三方库

链接:https://github.com/google/hardware-perfcounter

在这个Hardware-perfcounter里面,通过对一些工具的解析,能够通过cycle获取基础的GPU数据,从而帮助开发者更好地实时记录需要关注的GPU内容。

具体操作

这边只需要获取adreno gpu数据,因此对于库中所使用的mali gpu就不加赘述了。

准备工具:

cmake 版本大于3.13

g++ 或者 gcc 能够编译 c11/c++14的

ninja 

1. 先git clone GitHub - google/hardware-perfcounter: libraries and tilities for sampling hardware performance counterslibraries and utilities for sampling hardware performance counters - GitHub - google/hardware-perfcounter: libraries and utilities for sampling hardware performance countershttps://github.com/google/hardware-perfcounter.git

到本地文件夹,然后进入到third_party,这边对envytools有依赖,所以需要拉取里面的内容,同样的使用git工具 clone
GitHub - freedreno/envytoolsContribute to freedreno/envytools development by creating an account on GitHub.https://github.com/freedreno/envytools.git

2. 直接build就行了。

Android

git clone https://github.com/google/HardwarePerfCounter.git
cd HardwarePerfCounter

cmake -G Ninja -S ./ -B build-android/  \
  -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK?}/build/cmake/android.toolchain.cmake" \
  -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-30
cmake --build build-android/

Linux/macOS

git clone https://github.com/google/HardwarePerfCounter.git
cd HardwarePerfCounter

cmake -G Ninja -S ./ -B build/
cmake --build build/

 Windows

在Git网页上说明尚且不支持windows,应该是尚且不支持在windows操作系统执行获取gpu数据,编译方法同Linux/macOS,在Powershell/cmd执行对应的操作即可。

3. 具体使用方式

比如我build到android上,那么就会在build-android/examples内部出现多个example执行文件,这边adreno分为common, a5xx和a6xx三种,假设对应手机是iQOO 8,使用的是Adreno 660, 那么就执行

adb push adreno_a6xx_c_example /data/local/tmp

adb shell
cd /data/local/tmp
./adreno_a6xx_c_example

这样就能够获取示例所输出的内容。

解读示例

打开examples/adreno_a6xx_example.c文件,我们可以看到具体是如何获取的。

在a6xx.h文件中可以看到,库的作者做了不少工作,将对应内容的counter号所代表的含义已经通过enum标记好了,同时,封装好了如下几个方法:

//创建context
int hpc_gpu_adreno_a6xx_create_context(
    uint32_t num_counters, hpc_gpu_adreno_a6xx_counter_t *counters,
    const hpc_gpu_host_allocation_callbacks_t *allocator,
    hpc_gpu_adreno_context_t **out_context);


//销毁context
int hpc_gpu_adreno_a6xx_destroy_context(
    hpc_gpu_adreno_context_t *context,
    const hpc_gpu_host_allocation_callbacks_t *allocator);

//开始counter
int hpc_gpu_adreno_a6xx_start_counters(const hpc_gpu_adreno_context_t *context);


//停止counter
int hpc_gpu_adreno_a6xx_stop_counters(const hpc_gpu_adreno_context_t *context);


//获取counter
int hpc_gpu_adreno_a6xx_query_counters(hpc_gpu_adreno_context_t *context,
                                       uint64_t *values);

1. 首先定义好counter数组,数组内部对应的enum值为需要获取的数值。

2. 创建context, 并且使用对应的context开启counter

3. 通过query_counter的操作获取对应的数值,数值对应步骤1的counter数组

4. 停止counter同时销毁context.

那么,Query 又是如何获取counter的呢?还是通过查看源码,我们最终可以知道,调用的是ioctl的方法来读取对应counter数值。

int hpc_gpu_adreno_ioctl_query_counters(
    int gpu_device, uint32_t num_counters,
    hpc_gpu_adreno_ioctl_counter_read_counter_t *counters, uint64_t *values) {
  struct adreno_counter_read payload;
  memset(&payload, 0, sizeof(struct adreno_counter_read));
  payload.num_counters = num_counters;
  payload.counters = counters;

  int status = ioctl(gpu_device, ADRENO_IOCTL_COUNTER_READ, &payload);
  if (status) return status;

  for (int i = 0; i < num_counters; ++i) values[i] = counters[i].value;

  return 0;
}

linux 内核 - ioctl 函数详解 - 知乎1. 概念ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中…https://zhuanlan.zhihu.com/p/478259733具体涉及到linux内核,类似操作应该是和写驱动的方法一样,此处就不长篇大论了。

注意事项

在博主具体操作过程中发现,当我使用perfmance-counter采集骁龙处理器的gpucounter时,当counter数组中含有的enum大于6时,后续数字经常会出错或为0。这边是每次通过gpu cycle就获取counter数组量的数值速度太慢,来不及获取已经更新。因此具体使用时建议在每次调用query时获取的counter数据尽量保持在6个以内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何与意法半导体STMicro建立EDI连接?

项目背景 意法半导体STMicro是全球最大的半导体公司之一&#xff0c;2010 年净收入 103.5 亿美元&#xff0c;2011 年第二季度净收入 25.7亿美元。 以业内最广泛的产品组合著称&#xff0c;凭借多元化的技术、尖端的设计能力、知识产权组合、合作伙伴战略和高效的制造能力&…

pdf怎么编辑?分享两款pdf编辑软件,编辑pdf也很简单!

pdf怎么编辑&#xff1f;其实也很简单&#xff0c;现在跟大家分享两款pdf编辑软件&#xff0c;可以让我们对pdf实现自由编辑修改&#xff0c;有了这两款pdf编辑软件&#xff0c;编辑pdf将不再困难。 pdf编辑软件一&#xff1a;万兴pdf编辑软件 万兴pdf是一款受众广泛&#xff0…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…

【Lilishop商城】No2-5.确定软件架构搭建四(本篇包括消息中间件RocketMQ)

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑&#xff0c;具体编写看源代码就行&#xff0c;读起来也不复杂~ 谨慎&#xff…

Python:如何在 CentOS 8 服务器上运行 Selenium 代码?

前言 因项目需求&#xff0c;需要在 CentOS 8 服务器上运行 Python-Selenium 代码&#xff0c;那么该如何操作呢&#xff1f; 运行环境 CentOS Stream 8Python 3.9.13selenium4.6.0Google Chrome 107.0.5304.121 操作步骤 安装 Google Chrome 下载 Linux 版本的 Chrome 将下…

怎么合并视频?快把这些方法收好

小伙伴们平时会在通过网课来提高自己的技能吗&#xff1f;我经常会在网上保存一系列的视频进行学习&#xff0c;可是当保存的网课视频数量多起来后&#xff0c;每次想要找对应的视频&#xff0c;都得花上不少的时间。其实我们可以通过将相同系列的视频合并起来的方法&#xff0…

java word,excel,ppt转pdf

准备工作 1.下载 jacob.jar 链接&#xff1a;https://pan.baidu.com/s/1TWIGyX9A3xQ6AG9Y3mVlVg 提取码&#xff1a;abcd 2.下载安装wpsWPS Office-支持多人在线编辑多种文档格式_WPS官方网站 3.添加 jar到项目和ddl文件放在jdk的jre/bin目录下&#xff0c;记得自己系统是…

13_cgi

知识点1【cgi实现计算器案例】 2、GET的同步方式&#xff1a; index.html <html><head><title>table</title><meta charset"UTF-8"><!--这是描述 js中的函数来之哪个js文件--><script type"text/javascript" sr…

Kafka基础与核心概念

本文&#xff0c;我们将试图回答什么是apache kafka。 kafka是一个分布式流平台或者分布式消息提交日志 分布式 Kafka 由一个或多个节点组成的工作集群&#xff0c;这些节点可以位于不同的数据中心&#xff0c;我们可以在 Kafka 集群的不同节点之间分布数据/负载&#xff0c;并…

【学习笔记47】开关变量和拖拽效果

一、开关案例 <button>点击获取验证码</button>&#xff08;一&#xff09;基本功能的实现 // 获取标签对象const oBtn document.querySelector(button);// 给按钮添加点击事件oBtn.addEventListener(click, function () {// 定义变量 用于获取验证码let count 5…

javaSE- 方法的使用

一、方法的基本用法 方法就是一个代码片段. 类似于 C 语言中的 “函数”. 方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮…

04_SpringBoot整合Mybatis

文章目录SpringBoot整合Mybatis0x01_创建项目导入依赖0x02_编写配置文件0x03_编写功能代码SpringBoot整合Mybatis 欢迎关注公众号“小东方不败” 0x01_创建项目导入依赖 创建项目&#xff1a; 目前稳定的最新版本是2.7.5,勾选两个依赖&#xff1a;Lombok和Spring Web 然后需…

Nodejs -- Express 路由原理及设置模块化路由

文章目录1. 路由的概念1.1 什么是路由1.2 显示生活中的路由1.3 Express中的路由1.4 Express中路由的例子1.5 路由的匹配过程2 路由的使用2.1 最简单的用法2.2 模块化路由2.3 为路由模块添加统一前缀1. 路由的概念 1.1 什么是路由 广义上来讲&#xff0c;路由就是映射关系 1.…

yarn : 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; yarn安装好了&#xff0c;vscode报错 报错问题&#xff1a;yarn 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 具体问题&#xff1a;cmd&#xff08;管理员运行&#xff09;中安装好了yarn &…

Angular使用管道和指令进行多语言切换

工作中经常遇到需要进行多种语言切换的项目。本文记录了一种在Angular页面中通过使用管道和自定义指令实现的语言切换方案。 1、实现效果 页面显示文字根据选择的语言自动进行翻译切换&#xff0c;如下图所示&#xff1a; 此时&#xff0c;页面模板的字符串全部按照管道格式书…

2023年IB生物有什么变化?

今天我们详细了解下2023年IBDP生物新课程内容、考试评估、内容、技能发展、科学本质等详细内容。IBDP生物新课程概述 IBDP新生物课程将于2023年2月开课&#xff0c;2023年8月首次授课&#xff0c;2025年5月进行首次考试。新课程反映社会变革&#xff0c;更加关注技能和概念、背…

【iMessage苹果推群发】苹果相册推archive到appstore开发证书(Development certificate)

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

DCHP通讯协议

从通讯TCP/IP的构成传输&#xff0c;到IP地址的分类&#xff0c;再到局域网与广域网的设置。 通讯协议的构成概述IPDHCP-设定动态IPDNS数据的流动广域网 网关局域网 交换机NAT桥接模式实操概述 前景知识&#xff1a;虚拟机与工艺库管理 扩展&#xff1a;NAT模式的实操。 1、T…

yolov5量化注意事项

&#xff08;1&#xff09;使用onnxsim 0.4.1版本、ort版本1.13.1 否则使用--dynamic True时所生成的onnx就会乱掉。 &#xff08;2&#xff09;利用trtexec生成engine 所使用的命令如下&#xff1a; trtexec.exe --onnxyolov5n_ptq_detect_dynamic.onnx --saveEngineptq_int…

小白学流程引擎-FLowable(二) — 从零搭建自己的FLowable服务 — 搭建流程服务-FLowable的新手指南

一、介绍 纵览Gitee搜索Flowable开源项目&#xff0c;大多都是已开发好的项目&#xff0c;而笔者从零开始搭建属于自己的Flowable引擎&#xff0c;并且是可以拿到生产上使用的。 二、软件架构 Springboot Flowable modeler idm Mysql SrpingBoot version&#xff1a;2.7…