NEON优化:软件性能优化、降功耗怎么搞?
NEON优化:软件性能优化、硬件降功耗怎么搞?
- 背景
- 性能优化基础之MCPS和MIPS
- 测试工具及流程
- 小结
NEON优化系列文章:
- NEON优化1:软件性能优化、降功耗怎么搞?link
- NEON优化2:ARM优化高频指令总结, link
- NEON优化3:矩阵转置的指令优化案例,link
- NEON优化4:floor/ceil函数的优化案例,link
- NEON优化5:log10函数的优化案例,link
- NEON优化6:关于交叉存取与反向交叉存取,link
- NEON优化7:性能优化经验总结,link
- NEON优化8:性能优化常见问题QA,link
背景
为了移动端或嵌入式设备等场景也能用上前沿技术,产品往往会上一些复杂的算法模型,但由于算法开销过大,导致实时性差、功耗高
等问题,需要进行端侧的性能优化。
如何在不改变算法效果的前提下,降低算法代码的时间复杂度,成了许多工程师不得不面对的问题。
性能优化基础之MCPS和MIPS
首先,在进行性能优化前,应找到一个具体的性能衡量指标,即MIPS/MCPS
。
- MIPS:million
instructions
per second,程序运行时每秒所耗费的指令数 - MCPS:million
cycles
per second,程序运行时每秒所耗费的周期数
MIPS和MCPS的区别
- MIPS是指令数,不同平台软仿和硬仿的差距不大
- MCPS是周期数,由于有硬件优化,可能不同平台会出现MCPS不同,甚至比MIPS还小。
一般软仿结果,MIPS都比MCPS小,因为软仿工具RVDS的CPI最小才能为1,硬仿结果能直接获得MCPS数。硬仿时,好的CPU能做到CPI小于1,即1个周期多指令,具体见:link。
With a single-execution-unit processor, the best CPI attainable is 1. However, with a multiple-execution-unit processor, one may achieve even better CPI values (CPI < 1).
性能世界的单位:cycle、tick
- 性能优化常用“cycle”作为单位,cycle本质是CPU主频的倒数。这个可比time的精度高多了。
- 从硬件原理上,CPU是靠一个心跳来驱动它工作的,每次心跳就是一个cycle,硬件工程师也爱把心跳称为tick。
- 计算公式:
1 cycle = 1 tick = (1/CPU主频)秒
——引自网络
MIPS计算DEMO
目录结构:
- src
- main.c
- void test(int* arr, int len);
- vpu.h
- vpu.s
- main.c
计算代码:
#include <stdio.h>#define MIPS_COUNT_ARM_CORTEX#ifdef MIPS_COUNT_ARM_CORTEX
#include "v7_pmu.h"
#endif#ifdef MIPS_COUNT_ARM_CORTEX
#define MILLION_UNIT (1000000.f)
#define KILO_UNIT (1000.f)
#define FRAME_LEN_MS (10.f) // 10ms
#define COUNT_NUM 1000
unsigned int counter0;
unsigned int cycle_count1;
unsigned int cycle_count2;
unsigned int cur_time = 0;
long double cur_time_tmp = 0.0;
double avg_time = 0;
unsigned long avg_time_tmp = 0;
unsigned int peak_time = 0;
float cycle2mips_coef = (1 / MILLION_UNIT) / (FRAME_LEN_MS / KILO_UNIT); // unit: mipsvoid calcu_mips_start(void)
{enable_pmu(); // Enable the PMUreset_ccnt(); // Reset the CCNT (cycle counter)reset_pmn(); // Reset the configurable counterspmn_config(0, 0x03); // Configure counter 0 to count event code 0x03enable_ccnt(); // Enable CCNTenable_pmn(0); // Enable countercounter0 = read_pmn(0); // Read counter 0cycle_count1 = read_ccnt(); // Read Core cycle
}void calcu_mips_end(void)
{cycle_count2 = read_ccnt();cur_time = cycle_count2 - cycle_count1;// 10^6 => million cycle, *1000/frmeLms => secondcur_time_tmp = (float)cur_time * cycle2mips_coef; // mipsavg_time_tmp += (unsigned int)cur_time_tmp;if (cur_time > peak_time) {peak_time = cur_time;}printf("%.2f mips \n", cur_time_tmp);
}void print_mips_result(void)
{avg_time = (double)avg_time_tmp / COUNT_NUM;printf("max %.2f mips \n", (float)peak_time * cycle2mips_coef);printf("avg %.2f mips \n", avg_time);
}
#endifvoid main(void) {// set mannualint cnt = COUNT_NUM;while(cnt--) {#ifdef MIPS_COUNT_ARM_CORTEXcalcu_mips_start();
#endif// test();#ifdef MIPS_COUNT_ARM_CORTEXcalcu_mips_end();
#endif}#ifdef MIPS_COUNT_ARM_CORTEXprint_mips_result();
#endif
}
计算开销的模块函数通常放到要测试开销的相关函数如test()
前后,即可得到该函数的单独MIPS开销,当然,也可以根据总体程序运行的开销乘相关函数所占开销比例得到,但计算不便,这里不推荐。
测试工具及流程
所需工具
软仿测试工具通常采用ARM公司的RVDS
(RealView Development Suite)开发套件,模拟各种内核处理进行仿真,得到开销数据。
硬仿测试工具通常是用Andriod平台自带的simpleperf
工具,将可执行文件直接推到手机上运行,实时抓取CPU数据得到实际开销数据,并绘制出图,俗称火焰图。
软硬仿优化流程
- 软仿流程
- 安装RVDS软件
- 配置代码工程环境
- 跑通代码
- 编写开销计算代码
- 仿真Profile
- 得到热点函数和开销基线
- 进行代码优化
- 测试热点函数开销
- 硬仿流程
- 与软仿流程类似
- 建议先软仿,再硬仿
- 涉及到IO读写等开销问题,软仿无法模拟实际运行情况,以硬仿结果为准
有了热点开销函数,就可以进行相关指令集及代码优化了。
小结
本文分享了性能优化的背景及基础概念,时间复杂度计算之MCPS和MIPS,以及测试工具和软硬仿流程。下篇分享NEON优化的案例与经验。
NEON优化:软件性能优化、降功耗怎么搞?相关推荐
- 软件性能优化漫谈(一):软件性能测量与分析
引言 Amdahl 定律与局部优化 测量是第一法则 计时器精度误差 额外的测量开销 外部随机噪音 性能基线 性能评测 总结 后续 引言 你能获得的对程序最大的加速比,就是当你第一次让它工作起来的时候. ...
- 软件性能优化最佳实践
软件性能优化最佳实践 (作者:a_yu) 1 经验总结 1.1 应用程序设计优化 大业务量数据存储设计建议 当系统中业务数据量较大时,避免业务变更的历史数据和正式的业务数据同时存储,由于业务新增的数据 ...
- 天猫店群玩法,天猫无货源店群这样操作,优化宝贝不降权!
天猫店群玩法,天猫无货源店群这样操作,优化宝贝不降权! 大家好,我是电商火火. 最近我发现很多人做天猫店群无货源店铺的时候,优化宝贝很容易导致宝贝降权. 那么火火就跟大家讲一下,天猫店群操作,如何去优 ...
- 打工人一文讲清软件性能优化
性能优化是指在不影响正确性的前提下,使程序运行得更快,它是一个非常广泛的话题. 优化有时候是为了降低成本,但有时候,性能能决定一个产品的成败,比如游戏服务器的团战玩法需要单服达到一定的同时在线人数才能 ...
- 【学习笔记】多重背包相关优化——二进制优化/单调队列优化
多重背包--二进制优化/单调队列优化 二进制优化 单调队列优化 代码都是 POJ1742 的,注意,那道题二进制优化会超时. 普通的多重背包式子,物品个数限制:c[i]c[i]c[i],单个物品价值 ...
- [Nginx] – 安全优化 – 配置文件优化 [二]
[Nginx] – 安全优化 – 配置文件优化 [二] Nginx 修改时间:2016年12月26日 首先在此感谢下我的老师–老男孩专家拥有16年一线实战经验,为我们运维班28期所有成员的耐心讲解, ...
- 安卓内存优化-bitmap优化
Bitmap常用方法: public boolean compress 将位图的压缩到指定的OutputStream,可以理解成将Bitmap保存到文件中! format:格式,PNG,JPG等: q ...
- 性能优化-整体优化策略介绍
文章目录 性能优化前思考 性能与可读性/可维护性之间的权衡 性能与用户的关联,存粹的性能价值如何 性能是执行整体表现,性能优化一定要多维度分析 不要随时随地的调整代码,缺乏前瞻性,陷入细节,抓不住瓶颈 ...
- 【JVM】优化参数+优化工具
[JVM]优化参数+优化工具 (一)上线前评估的时候JVM设置合适的参数 [1]JVM参数 [2]典型JVM参数配置参考 [3]内存结构分析 (二)什么时候需要JVM调优?具体的指标? [1]如果使用 ...
最新文章
- 设置WebStorm用Ctrl+鼠标滚轮上、下调整编辑器代码字体大小
- CSS3弹性盒模型之box-orient box-direction
- Myxls导出excel报表
- @Value 注入静态变量
- 王者荣耀、QQ音乐发声明:异常登录问题已解决
- ​腾讯第一季度员工平均月薪 7.6 万元;“淘宝特价版”App 正式更名为“淘特”;Deno 1.10 正式发布|极客头条...
- linux ora 00911,python – DatabaseError:ORA-00911:无效字符
- 2018年4月计算机组成原理试题,全国2018年4月自考(02318)计算机组成原理试题及答案.pdf...
- java 运行 依赖_java – 运行时中的依赖项确定
- linux 中文 bterm fbterm 内核,Fbterm (简体中文)
- 一线实践 | 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统
- Vue开发实例(02)之将Vue项目代码导入到IDEA并运行
- 能够有效提升开发效率的 20 余款 VSCode 插件(多图带效果展示)
- 将iTunes降级到12.6版本
- python少儿编程讲师笔试题_小码王教育儿童编程教师面试:做笔试题(填空题和编程题,填空题 - 职朋职业圈...
- java递归获取树结构的指定层级、指定层级之上(向上递归(包含父集所有、爷爷集所有...)(父集单独、爷爷集单独...))、指定层级之下所有的(子集、孙子集...)和list集合转Tree树结构
- Rust: 基于 napi-rs 开发 Node.js 原生模块
- dw在php图片滑动切换效果,超简单的图片左右切换滑动
- python循环爬取页面_使用for或while循环来处理处理不确定页数的网页数据爬取
- 【Java PTA作业】当老师一口气布置八个作业( 8 / 8 )
热门文章
- ENVI: 如何添加控制点并基于控制点进行几何校正?
- Unix编程常见问题解答
- Java毕业设计_基于SSM的医院预约挂号系统设计与实现
- 定制自己的报表!7款实用开源报表工具
- cpu功耗排行_目前较低功耗的intel系cpu求推荐?
- String字符串转JSON对象(JSON的依赖)
- 怎么开启windows hypervisor platform,解决hypervisor platform消失无法安装的问题
- Java异常的根类似_Java异常(Exception)类型及处理
- 计算机组成原理笔记[哈工大]
- oracle的逻辑存储结构中由大到小的顺序,16.2 数据库逻辑存储结构