【ARM Cortex-M 系列 4 番外篇 -- 常用 benchmark 介绍】

news2024/9/25 23:22:10

文章目录

    • 1.1 CPU 性能测试 MIPS 计算
      • 1.1.1 Cortex-M7 CPI
    • 1.2 benchmark 小节
      • 1.3.1 Geekbenck 介绍
    • 1.3 编译参数配置

1.1 CPU 性能测试 MIPS 计算

每秒百万指令数 (MIPS):在数据压缩测试中,MIPS 每秒测量一次 CPU 执行的低级指令的数量。越高越好,但是在比较不同代的 CPU 时,则要对得分持保留态度,因为执行指令的方式有所不同。比如CoreMark或者Dhrystone之类,然后用处理器自带的PMU(Performance Monitor Unit)计算下某段函数实际跑了多少指令周期,然后除以这段函数有多少条指令。这就计算出来了。原理很简单,操作起来可能有点费劲。

1.1.1 Cortex-M7 CPI

关于Cortex-M7 CPI 的计算,系统有一个专门的系统外设 DWT(Data Watchpoint and Trace Unit),这个外设提供了一个Clock Cycle Counter(CYCCNT),可以方便的用来计算CPI(ARMv7-M Architecture Reference Manual)。

DWT 中除了 CYCCNT 外的 counter,都只有 8bit 的 register。所以如果一段程序稍长一点的话就溢出了,既然 CPI 是统计的话,一段一端的测程序好像会不太准的样子。需要知道的是这个 overflow DWT 本身就是个低成本的东西,设计目的就是应对局部。大程序(运行时间长的)要用高精度的示波器(或者逻辑分析仪)配合IO口翻转来测量时间(在测量开始的时候拉低电平,在测量结束的时候拉高电平,最终计算的时候,由拉低电平引入的误差基本忽略不计)。
关于 DWT 见文章:【ARM Coresight 系列文章 14 - Cortex-M DWT 详细介绍】

Cortex-M7 就无法提供准确的指令执行周期信息,因为 Cortex-M7的 流水线是超标量的(Super-scalar),对于前后满足条件的两条指令来说,Cortex-M7的流水线可以同时执行。在这种情况下,如何计算指令的平均周期呢?

实际上,这个问题比想象的要略微复杂一点。因为前后两条指令还可能存在数据依赖(Data Dependency)或者是资源竞争(Structural Hazard)的情况。所以,指令执行周期的平均值也是根据前后指令的组合不同而变动的。

两条指令之所以安排他们同时执行,就是因为两条指令同时的执行时间小于二者之和啊。应该说,和最长的那条指令执行时间一样长——你会发现,双发射的流水线连回答“他的执行时间与一条指令单独执行相比如何?”都是不容易做到的。

如果你从MIPS过来,应该更多接触过超标量,甚至是 Out of Order 的流水线。超标量,甚至是Out of Order 的流水线理论上都无法精确的标注一条指令的执行周期,这种情况下,为了评估系统吞吐量,往往用另外一个概念,也就是CPI(Cycle per Instruction)或者IPC(Instruction per Cycle)。对于Cortex-M0这种顺序执行的流水线来说,CPI一定是 >= 1的,但是对于超标量以及OOO的流水线来说,CPI是可以做到 < 1的。

1.2 benchmark 小节

项目预研和产品开发中经常有性能评估的需求,性能benchmark是评估性能最常用的手段。本文小结下之前用过的 benchmark。

工具名称测试项目summary项目地址
coremarkcpu测评cpu的整体性能(列举、矩阵运算、状态机、CRC)https://github.com/eembc/coremark
coremark_procpucoremark的升级版,测评cpu整体性能
super PIcpu测评PI的计算ftp://pi.super-computing.org/Linux/
SPECcpu测评cpu性能http://www.spec.org/spec/
dhrystonecpu测评CPU整形计算
whetstonecpu测评CPU浮点运算
stressapptestcpu&mem主要ddr压力测试,也可以提高cpu负载https://github.com/stressapptest/stressapptest
nbenchcpu&mem测评CPU运算性能(整数运算、双精度浮点运算)/mem指数主要体现处理器总线、cache和存储器性能http://www.tux.org/~mayer/linux/bmark.html
utest_memmem测评mem bandwidth
cachebenchmem测评mem&cache bandwidthhttp://icl.cs.utk.edu/projects/llcbench/cachebench.html
copybwmem测评mem bandwidthhttp://www.tux.org/pub/benchmarks/CPU/copybw.c
ramspeedmem测评cache有效带宽
bonnieIO测评IO性能http://www.textuality.com/bonnie/
FioIO测评文件系统IO性能http://freshmeat.net/projects/fio/
iozoneIO测评文件系统IO性能http://www.iozone.org/
lmbenchCPU/mem/IO测评cpu/mem/IO bandwidth & latencyhttp://lmbench.sourceforge.net/
sysbenchCPU/mem/IO多线程性能测试https://github.com/akopytov/sysbench
cyclictest实时性git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git

芯片厂商发布SOC时评估算力习惯与Geekbench 数据库中测评结果进行比较,国内安卓手机厂商一般都会在Antutu跑个分。除这两个之外,还有3DMark,PCMark等,这些会更关注GPU和其它多媒体处理的性能了。

1.3.1 Geekbenck 介绍

Geekbench是一个广泛使用的跨平台处理器基准测试工具,由Primate Labs开发。它可以对单核和多核性能进行全面的测量和评估,为用户提供一个快速而准确的衡量和比较计算设备(如桌面,笔记本电脑,手机,平板电脑等)性能的方法。

以下是Geekbench的主要特性:

  • 跨平台:Geekbench可在各种设备和操作系统上运行,包括Windows,Mac,Linux,iOS,Android等。

  • 单核和多核性能测试:Geekbench可以同时测试处理器的单核和多核性能,从而提供全面的处理器性能评估。

  • 实际场景测试:Geekbench采用的是实际应用场景的模拟测试,比如图像处理,文本压缩等,以模拟实际使用情况中的设备性能。

  • 结果比较:Geekbench提供了一个在线的测评结果数据库,用户可以将自己设备的得分与全球其他设备进行比较,更好地理解设备性能。

下图是Geekbench 6 排行
在这里插入图片描述
详情见:
https://browser.geekbench.com/v6/cpu/singlecore
https://browser.geekbench.com/v6/cpu/singlecore

1.3 编译参数配置

GCC编译参数可以对程序的性能产生显著的影响,因此也就影响了跑分测试的结果。一些GCC编译参数可以对程序的执行速度,内存使用情况等进行优化。

以下是一些GCC编译参数及其对跑分测试可能产生的影响:

  • -O1、-O2、-O3:这些参数用于控制编译器优化级别,级别越高,编译器会尝试进行更多的代码优化,以提高程序的运行速度。这些优化可能包括循环展开、常量折叠等。但是级别越高,编译时间也越长。

  • -march=native:这个参数告诉GCC产生优化以适应本地机器类型的代码。如果你在本地运行跑分测试,这个参数将使GCC生成针对你的CPU特性进行优化的代码。

  • -ffast-math:这个参数让GCC对浮点数学运算做一些假设(即假设不会出现NaN,Inf和Denorms等),使其可以进行更多的优化。如果你的程序大量使用浮点运算,这个参数可能会带来性能的提升。

  • -funroll-loops:这个参数让GCC对较小的循环进行循环展开,以减少循环开销。这可能会提高程序的性能,但也可能会增加程序的大小。

  • -fprefetch-loop-arrays:如果目标平台支持,则使用该选项将导致预取循环数组以减少缓存未命中的数量。这可能会提高程序的性能。

这里需要注意的是,虽然这些编译参数可能会影响程序的性能,但具体影响取决于很多因素,包括程序的具体代码、硬件环境等。并且,并非所有的优化都会带来性能提升,有时候甚至会导致性能下降。因此,使用这些参数时需要根据具体情况进行测试和调整。

关于编译参数的详细介绍见:ARM GCC 编译系列学习

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

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

相关文章

二十、设计模式之迭代器模式

目录 二十、设计模式之迭代器模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景角色 实现迭代器模式定义迭代器容器实现可迭代接口迭代器实现使用 总结 二十、设计模式之迭代器模式 所属类型定义行为型提供一种方法顺序访问一…

uni-app:解决异步请求返回值问题

可以使用 Promise 或者回调函数来处理异步请求的返回值。 方法一&#xff1a; Promise处理异步请求的返回值 使用 Promise 可以将异步请求的结果通过 resolve 和 reject 返回&#xff0c;然后通过 .then() 方法获取成功的结果&#xff0c;通过 .catch() 方法获取错误信息。 …

ES Nested解释

参考博客 参考博客 nested类型是对象数据类型的专用版本&#xff0c;它允许对象数组以可以彼此独立查询的方式进行索引

React之diff原理

一、是什么 跟Vue一致&#xff0c;React通过引入Virtual DOM的概念&#xff0c;极大地避免无效的Dom操作&#xff0c;使我们的页面的构建效率提到了极大的提升 而diff算法就是更高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处 传统diff算法通过循环递归对节点进行依…

为什么亚马逊卖家一定要有独立站?新手低成本快速搭建跨境电商独立站完整图文教程

效果展示 翻译助手 一、购买域名 二、购买主机托管 三、搭建独立网站 四、网站装修设计 五、网站迁移 六、补充 前言&#xff1a;为什么亚马逊卖家一定要有独立站&#xff1f; 先来谈谈为什么亚马逊卖家一定得有独立站&#xff0c;从我一些个人经历来看&#xff0c;有独…

C语言程序设计——题目:用*号输出字母C的图案。程序分析:可先用‘*‘号在纸上写出字母C,再分行输出。

题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 #include<stdio.h> int main() {printf(" *****\n");printf(" *\n");printf("*\n");printf("*\n");printf(&…

如何一键核实验证身份证的真伪?

据报道&#xff0c;今年10月10日&#xff0c;广东省佛山市朱某因生活琐事与丈夫发生争吵&#xff0c;民警发现她的身份证有问题。 在民警打算进一步了解情况&#xff0c;查看夫妻二人的身份证件时&#xff0c;朱某的身份证引起了民警的注意。这张身份证表面很光滑&#xff0c;…

【JAVA学习笔记】34 - 房屋出租系统(综合性强)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_chapter09/src/com/yinhai/houserent 一、项目需求说明 实现基于文本界面的房屋出租系统&#xff0c;能够实现对房屋信息的添加、修改和删除&#xff08;用数组实现&#xff09;&#xff0c;并能够…

大学兼职教师管理系统 用JAVA语言开发

一、项目介绍 基于VueSpringBootMySQL的大学兼职教师管理系统包含学生管理、教师管理、课程档案管理、课程评价管理、课程考勤管理、授课管理、课程成绩管理教龄/薪资分析可视化图表&#xff0c;还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管…

canal五部曲-canal是如何处理insert幂等性的

canal使用了Rocketmq来接收mysql采集的binlog的事件&#xff0c;做到采集和处理的解耦。同时满足一次采集多方消费的需求。那么既然使用到Rocketmq就一定会存在MQ消费超时或是处理失败MQ重发的问题。 那么canal是如何处理MQ重复消费幂等性问题的呢 一般&#xff0c;在业务上我…

网络安全保险行业面临的挑战与变革

保险业内大多数资产类别的数据可以追溯到几个世纪以前&#xff1b;然而&#xff0c;网络安全保险业仍处于初级阶段。由于勒索软件攻击、高度复杂的黑客和昂贵的数据泄漏事件不断增加&#xff0c;许多网络安全保险提供商开始感到害怕继续承保更多业务。 保险行业 根据最近的路…

电脑每过几天就要自动更新,一键教你解决

windows更新&#xff0c;暂停更新最多只能选5个周&#xff0c;还是很麻烦&#xff0c;那么看下图&#xff0c;教你如何改为10年后&#xff1b; 建立一个txt文件&#xff0c;复制下述内容&#xff0c;然后保存&#xff0c;再把后缀名改为.reg,运行一下就可以轻松改为10年了&…

Python爬虫网易云音乐,Tkinter制作音乐播放器

目录 一、效果展示 二、环境 三、实现过程 四、源码 一、效果展示 页面的美化以及功能还有待升级~ 先来说一下已有功能吧&#xff1a; 可以在搜索框中通过歌曲或歌手名称进行搜索&#xff0c;效果和在网易云官网搜索一样。 点击开始下载&#xff0c;就会将搜索结果的第一…

小程序实现圆环进度

一&#xff1a;需求 小程序中要展示进度&#xff0c;要求类似示例图&#xff0c;用圆环形式展示进度&#xff0c;那这该如何实现呢&#xff1f;这一篇文章主要讲的就是这样一个功能。 二&#xff1a;实现 实现的大致流程是把圆环进度条封装成一个组件&#xff0c;然后在需要使…

【开源框架】Glide的图片加载流程

引入依赖 以下的所有分析都是基于此版本的Glide分析 //引入第三方库glide implementation com.github.bumptech.glide:glide:4.11.0 annotationProcessor com.github.bumptech.glide:compiler:4.11.0分析 Glide的使用就是短短的一行代码 Glide.with(this).load("xxx&q…

Dell R720服务器已有win10系统下安装Ubuntu10.04双系统

先在win10下进磁盘管理&#xff0c;分配空间 重启电脑&#xff0c;开机时按F11进入BIOS。 one-shot boot&#xff0c;选U盘 datatraveler 我原来装的是ubuntu18&#xff0c;ubuntu18升级成了ubuntu20&#xff0c;但是apt-get upgrade有很多问题&#xff0c;所以只能重装。 …

数据结构与算法之矩阵: Leetcode 134. 螺旋矩阵 (Typescript版)

螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示…

第19章 Dubbo

本文中所有的原理及流程都是针对Dubbo3.0.2.1版本 19.1 谈谈你对Dubbo的理解 难度:★★★★ 重点:★★ 白话解析 1、背景:参考18.13题,这里不在赘述。 2、简介:Dubbo在3.x版本之前都只是一个高性能的RPC框架,但是在3.x版本之后,官网的描述变了,Dubbo已经升级成一个等…

ke8学校陈老师H5

目录 例一&#xff1a; 1label for与表单元素建立关联 2鼠标选中区域 3classlist属性&#xff1a;更换类选择器。添加、删除、切换和查询一个元素上的类。 4nextElementSibling属性 5title属性&#xff1a;鼠标放上去会有提示信息 6placeholder属性&#xff1a;填了就有…

Linux常用命令——cksum命令

在线Linux命令查询工具 cksum 检查文件的CRC是否正确 补充说明 cksum命令是检查文件的CRC是否正确&#xff0c;确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来&#xff0c;在目的系统中又被计算一次&#xff0c;两个数字进行…