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


    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 编译系列学习

  • 相关阅读:
    redis的实战项目03_set点赞、Zset点赞排序
    cisco设备信息泄漏漏洞案例【二】
    案例|航海知识竞赛需求沟通整理
    Java 多线程:并发编程的三大特性
    基于PHP+MySQL公积金在线办理系统的设计与实现
    Redis搭建集群环境及容灾
    app小程序手机端Python爬虫实战13-fiddler如何抓取手机端数据包
    【.NET】聊聊 IChangeToken 接口
    图片验证码实现的几种方式
    最近找到的几个不错的手机APP
  • 原文地址:https://blog.csdn.net/sinat_32960911/article/details/134006169