做网站 营业执照,梅州建设工程交易中心网站,长春市长春网站建设,jsp网站开发中js的问题NEON优化#xff1a;软件性能优化、硬件降功耗怎么搞#xff1f; 背景性能优化基础之MCPS和MIPS测试工具及流程小结 NEON优化系列文章#xff1a; NEON优化1#xff1a;软件性能优化、降功耗怎么搞#xff1f;linkNEON优化2#xff1a;ARM优化高频指令总结#xff0c; l… NEON优化软件性能优化、硬件降功耗怎么搞 背景性能优化基础之MCPS和MIPS测试工具及流程小结 NEON优化系列文章 NEON优化1软件性能优化、降功耗怎么搞linkNEON优化2ARM优化高频指令总结 linkNEON优化3矩阵转置的指令优化案例linkNEON优化4floor/ceil函数的优化案例linkNEON优化5log10函数的优化案例linkNEON优化6关于交叉存取与反向交叉存取linkNEON优化7性能优化经验总结linkNEON优化8性能优化常见问题QAlink 背景 为了移动端或嵌入式设备等场景也能用上前沿技术产品往往会上一些复杂的算法模型但由于算法开销过大导致实时性差、功耗高等问题需要进行端侧的性能优化。
如何在不改变算法效果的前提下降低算法代码的时间复杂度成了许多工程师不得不面对的问题。
性能优化基础之MCPS和MIPS 首先在进行性能优化前应找到一个具体的性能衡量指标即MIPS/MCPS。
MIPSmillion instructions per second程序运行时每秒所耗费的指令数MCPSmillion 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主频)秒 ——引自网络 性能分析中的指令周期与执行时间的关系是 先有晶振然后产生时钟周期如主频2000MHz再运行程序计算消耗一定的指令周期Cycles最后计算成百万周期数(MCPS/MIPS)来评估算法时间开销。 运行一个指令一般会消耗1个或多个周期数周期到指令的转化为CPI(Cycle per Instruction)一般大于1希望接近或小于1。 如何在代码中计算时钟周期数https://blog.csdn.net/qq_38877888/article/details/103848455时钟周期与指令周期MIPS与CPIhttps://blog.csdn.net/tuyu265/article/details/105209683 MIPS计算DEMO
目录结构
src main.c void test(int* arr, int len); vpu.hvpu.s
计算代码
#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公司的RVDSRealView Development Suite开发套件模拟各种内核处理进行仿真得到开销数据。
硬仿测试工具通常是用Andriod平台自带的simpleperf工具将可执行文件直接推到手机上运行实时抓取CPU数据得到实际开销数据并绘制出图俗称火焰图。
软硬仿优化流程
软仿流程 安装RVDS软件配置代码工程环境跑通代码编写开销计算代码仿真Profile得到热点函数和开销基线进行代码优化测试热点函数开销 硬仿流程 与软仿流程类似建议先软仿再硬仿涉及到IO读写等开销问题软仿无法模拟实际运行情况以硬仿结果为准
有了热点开销函数就可以进行相关指令集及代码优化了。
小结 本文分享了性能优化的背景及基础概念时间复杂度计算之MCPS和MIPS以及测试工具和软硬仿流程。下篇分享NEON优化的案例与经验。