MegEngine 使用小技巧:用 mperf 进行安卓 opencl 算子的 roofline 分析

news2024/12/24 22:12:07

前言

  • roofline 分析是一种简单评估当前计算任务对当前平台计算/访存能力的利用情况的方法,可以帮助分析算子的优化方向和优化潜力。mperf 实现了安卓 mali/adreno 两种 gpu 平台的 roofline 分析能力,下面以 mali 平台为例,简单介绍一下操作步骤。

编译和集成

  • 下载 repo 代码

git clone https://github.com/MegEngine/mperf.gitgit submodule update --init --recursive
  • 编译安装

./android_build.sh -g malicmake --build <mperf_build_dir> --target install
  • 项目集成

set(mperf_DIR /path/to/your/installed/mperfConfig.cmake)find_package(mperf REQUIRED)target_link_libraries(your_target mperf::mperf)

关于编译和集成部分,详见 mperf readme (https://github.com/MegEngine/mperf#readme)

获取 roofline 数据

  • 获取 opencl 算子执行过程的 GFLOPs 和 GBPs

// define the measurement setmperf::GpuCounterSet gpu_set = {    mperf::GpuCounter::GFLOPs,    mperf::GpuCounter::GBPs,};mperf::XPMU xpmu(gpu_set);xpmu.run();... // add your opencl kernel calls

详细测试样例,参见 mali_gpu_pmu_test (https://github.com/MegEngine/mperf/blob/master/apps/gpu_mali_pmu_test.cpp)

  • 获取当前 gpu 平台的峰值计算能力和访存带宽

    • 将编译阶段得到的 build_dir/apps 目录下的 gpu_inst_gflops_latency 和 gpu_spec_dram_bw 拷贝到手机上执行,即可拿到 gpu 的实际峰值算力和峰值带宽。

峰值性能测试的详细逻辑,参见 gpu_inst_gflops_latency(https://github.com/MegEngine/mperf/blob/master/apps/gpu_inst_gflops_latency.cpp) 和 gpu_spec_dram_bw(https://github.com/MegEngine/mperf/blob/master/apps/gpu_spec_dram_bw.cpp

绘制 roofline

  • 上一步拿到了 opencl 算子执行过程的 GFLOPs 和 GBPs 和 gpu 的实测峰值算力和峰值带宽,现在可以借助 mperf plot_roofline (https://github.com/MegEngine/mperf/blob/master/apps/scripts/roofline/plot_roofline.py)脚本绘制 roofline 曲线:

    • 编辑 roofline_data.txt:

# params for plotting roofs, gpu peak calculation and memory ability
memroofs 26.3
mem_roof_names 'DRAM' 
comproofs 1159         
comp_roof_names 'FMA'   


# omit the following if only plotting roofs
# the measured data for your opencl kernel call, AI is measured_GFLOPs/measrured_GBPs
AI 15.5                 
FLOPS 261               
labels 'FMA, DRAM'
    • 执行 python 脚本:

python3 plot_roofline.py ./roofline_data.txt

9e10bb2bc5955bc665fe72920a8de22b.png

      • 比如上面得到的 roofline 曲线中,算子的计算访存比小于机器平衡点(通常将屋檐和屋顶转折点的横坐标称为机器平衡点),所以可以初步判断该算子在该平台上主要 bound 在访存部分,平台的算力资源对于该算子来说还是有富裕的。并且可以根据算子的实际带宽跟机器的峰值带宽的比值,来评估后续访存优化的空间有多大。

      • 同时提醒一点,在获取算子 GBPs 的时候,我们是拿到了算子实际发生的 ddr 访存量的,这个访存量可以跟算子输入输出变量总的内存占用大小做一个比较,从而衡量出算子有多少重复访存没有被 cache 和寄存器 cover 住,而产生的对 ddr 的重复访问。如果观察到 ddr 访存量显著大于输入输出总的内存占用,那么我们就需要去审视算子的访存逻辑是不是不够 cache 友好,是不是有些重复访存可以通过加一些缓存逻辑来避免等等。

拓展思考

  • 通过上面的步骤,我们获取了 roofline 数据,这可以帮助我们判断当前算子在当前平台是计算 bound 还是访存 bound,以及相对峰值算力和峰值带宽的 gap 大小。但是,单单依靠 roofline 分析又很难进一步具化瓶颈的位置和缓解的对策,比如访存 bound 的原因是因为哪一级存储的访存效率低下?计算 bound 是因为指令依赖还是某一类 alu 硬件资源紧张?

  • 为了解决这些问题,mperf 还做了一些硬件参数探测、PMU 数据加工分析、opencl kernel 的动静态代码分析(动静态代码分析的功能,还在内部迭代开发中,尚未推到开源 repo 中)等尝试,尽可能让算子性能分析和优化更加有迹可循,或者说心智负担更低。

附:更多 MegEngine 信息获取,您可以:查看GitHub 项目(https://github.com/MegEngine),或加入 MegEngine 用户交流 QQ 群:1029741705。欢迎参与 MegEngine 社区贡献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。

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

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

相关文章

【操作系统】什么是用户态和内核态?用户态和内核态是如何切换的?

【操作系统】什么是用户态和内核态&#xff1f;用户态和内核态是如何切换的&#xff1f; 参考资料&#xff1a; 用户态到内核态切换 什么是用户态和内核态&#xff1f; 「操作系统」什么是用户态和内核态&#xff1f;为什么要区分 一、什么是用户态和内核态&#xff1f; 1.1、…

案例23:基于Java宿舍管理系统设计和实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Echarts的x轴调整间隔,可以用 xAxis数组子项的axisLabel.interval

Echarts的x轴调整间隔,可以用 xAxis数组子项的axisLabel.interval https://echarts.apache.org/zh/option.html#xAxis.axisLabel.interval xAxis.axisLabel.interval auto 默认值是’auto’ 可设置为 : number 或 Function 数字或函数 坐标轴刻度标签的显示间隔&#xff0c;…

逍遥自在学C语言 | for循环详解

前言 C语言中的循环结构时&#xff0c;for循环是最常用的一种。它允许重复执行一段代码&#xff0c;直到满足特定条件为止。 本文将详细介绍for循环的用法&#xff0c;并提供相关的可编译运行的C代码示例。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语…

生产·成本

短期生产成本 给定生产技术&#xff0c;管理者必须选择如何生产&#xff08;即使用什么样的要素组合&#xff09;使生产成本最小。 衡量成本 边际成本 长期成本与规模 长期平均成本&#xff08;LAC&#xff09;和长期边际成本&#xff08;LMC&#xff09; 规模经济 随着产…

【Web网站服务】Apache网页优化

Apache网页优化 一、网页压缩1.1网页压缩步骤 二、网页缓存三、隐藏版本信息五、Apache防盗链 一、网页压缩 在企业中&#xff0c;部署Apache后只采用默认的配置参数&#xff0c;会引发网站很多问题&#xff0c;换言之默认配置是针对以前较低的服务器配置的&#xff0c;以前的…

chatgpt赋能python:Python如何拆分list

Python如何拆分list 在Python编程中&#xff0c;我们经常需要对list进行拆分操作。拆分list可以帮助我们更好地处理数据&#xff0c;以便进一步进行分析、计算或可视化呈现。本文将介绍Python中如何拆分list&#xff0c;并且提供一些常用的拆分方式。 按固定大小进行拆分 我…

【AIGC】12、DINO | 针对 DETR-like 检测器的提升

文章目录 一、背景二、方法2.1 Contrastive DeNoising Training2.3 Mixed Query Selection2.4 Look Forward Twice 三、效果 论文&#xff1a;DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 代码&#xff1a;https://github.com/IDEACVR/…

【JUC基础】15. Future模式

目录 1、前言 2、什么是Future 2.1、传统程序调用 3、JDK中的Future 3.1、Future相关API 3.2、FutureTask 3.2.1、FutureTask实现 3.2.2、FutureTask相关API 3.3、CompletableFuture 3.3.1、thenApply 3.3.2、异步任务编排之thenCompose() 3.3.3、异步任务编排之th…

南京市某高校计算机科学与技术专业性能测试与Loadrunner—考试试卷分析

XXX科技学院试卷 20 /20 学年 第 学期 课程所属部门&#xff1a; 课程名称&#xff1a; 课程编号&#xff1a; 考试方式&#xff1a;&#xff08;A、B、开、闭&#xff09;卷 使用班级&#xff1a; …

数据安全--16--数据采集阶段安全防护措施

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/131033616 一、引子 数据安全采集阶段的防护措施主要是从三个方面来开展的&#xff0c;第一个是从个人数据主体采集方面&#xff0c;第二个是从外部机构采集方面&#xff0c;以上两个方面基本涵盖了数…

读改变未来的九大算法笔记05_数字签名

1. 数字签名”&#xff08;Digital Signature&#xff09; 1.1. 单词数字化&#xff08;digital&#xff09;意味着其“由数字字符串组成” 1.2. 任何数字化的东西都能被拷贝 1.3. “签名”的全部意义在于能被读取&#xff0c;但不能被除了作者的任何人拷贝&#xff08;也就…

linux(信号产生中)理论部分

1.实际执行信号的处理动作称为信号递达 2.信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09; 3.进程可以选择阻塞某个信号的 ----------------------------------------------------------------------------------------------------------…

【JavaSE】Java(五十一):核心要点总结

文章目录 1. String str "love"; 和 String str new String("love);一样吗&#xff1f;2. 如何将字符串反转3. String类的常用方法有哪些?4. new String("sn") new String("ow")会创建几个对象&#xff1f; 1. String str “love”; 和…

「C/C++」C/C++ Lamada表达式

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C程序设计 相关术语 Lambda表达式&#xff1a;是C11引入的一种函数对象&#xff0c;可以方便地创建匿名函数。与传统的函数不同&#xff0c;Lambda表达式可以在定义时直接嵌入代码&#xff…

JSON与storage

JSON JSON由来 ◼ 在目前的开发中&#xff0c;JSON是一种非常重要的数据格式&#xff0c;它并不是编程语言&#xff0c;而是一种可以在服务器和客户端之间传输的数据格式。 ◼ JSON的全称是JavaScript Object Notation&#xff08;JavaScript对象符号&#xff09;&#xff1a…

苹果震撼发布首款头显,搭配强悍Mac和iOS 17等全新产品,价值25000元!

&#x1f337; 博主 libin9iOak带您 Go to New World.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《IDEA开发…

随机过程与排队论(一页纸总结)

参数为 λ 的泊松过程的点间间距是相互独立的随机变量&#xff0c;且服从均值为 1/λ 的 指数 分布。 病人以每小时3人的泊松流到达医院&#xff0c;设该医院只有一个医生服务且容量为无穷&#xff0c;医生服务的时间服从指数分布&#xff0c;并且平均服务一个病人为30分钟&am…

内联函数 C/C++

代码&#xff1a; file1.c #include<stdio.h>void spam(double v); void masp(double w);inline static double square(double); double square(double x) { printf("%s %s %d\n", __FILE__, __func__, __LINE__);return x * x; } int main() {double q …

chatgpt赋能python:Python如何将图片Resize

Python如何将图片Resize 在网页设计和开发过程中&#xff0c;图片大小和质量对于网站性能和用户体验至关重要。网站图片过大会影响页面加载时间&#xff0c;降低用户体验&#xff1b;同时&#xff0c;过小的图片也会影响网站排名&#xff0c;因为搜索引擎的排名算法很重视网站…