CPU性能测试分析MIPS、DMIPS

本文深入探讨了MIPS和DMIPS的概念,解释了它们在评估CPU性能时的不同作用。MIPS衡量每秒执行的指令数量,而DMIPS则侧重于CPU在执行特定基准测试程序时的表现。文章还对比了两种指标的区别,以及它们在不同场景下的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 what
MIPS: million instruction per second,表示每秒多少百万条指令,如 10MIPS ,表示每秒一千万条指令。

MIPS/MHz : 表示 CPU 在每 1MHz 的运行速度下可以执行多少个MIPS ,如 10MIPS/MHz,表示如果 CPU 运行在 1MHz 的频率下,每秒可执行一千万条指令,如果 CPU 运行在 5MHz 的频率下,每秒可执行五千万条指令。

DMIPS: Dhrystone MIPS,并非字面上每秒百万条指令的意思。它是CPU运行一个叫Dhrystone(整数运算)的测试程序时表现出来的相对性能高低的一个单位(很多场合人们也习惯用MIPS作为这个性能指标的单位)。

Dhrystone: 是于1984年由Reinhold P. Weicker设计的一套综合的基准程序,该程序用来测试CPU(整数)计算性能。其名“Dhrystone”是与另一算法“Whetsone”区分而设计的名字。与Whetsone不同,Dhrystone并不包括浮点运算,其输出结果为每秒钟运行Dhrystone的次数,即每秒钟迭代主循环的次数。
Dhrystone的重要性在于其能作为处理器整数计算性能的指标。很多现代的编译器应用了静态代码分析技术,会将对输出没有影响的代码忽略,这会使很多基准测试代码不能正常运行,包括早些版本的Dhrystone。之后Weicker于1988年开发出了2.0版本,并于同年五月开发出了2.1版本,基本解决了这一问题。
Dhrystone所代表的处理器分数比MIPS(million instructions per second 每秒钟执行的指令数)更有意义,因为在不同的指令系统中,比如RISC(Reduced Instruction Set Computer精简指令集计算机)系统和CISC(Complex Instruction Set Computer复杂指令集计算机)系统,Dhrystone的得分更能表现其真正性能。由于在一个高级任务中,RISC可能需要更多的指令,但是其执行的时间可能会比在CISC中的一条指令还要快。由于Dhrystone仅将每秒钟程序执行次数作为指标,所以可以让不同的机器用其自身的方式去完成任务。另一项基于Dhrystone的分数为DMIPS(DhrystoneMIPS),其含义为每秒钟执行Dhrystone的次数除以1757(这一数值来自于VAX 11/780机器,此机器在名义上为1MIPS机器,它每秒运行Dhrystone次数为1757次)。
作为一项基准程序Dhrystone具有以下缺陷:

  • 它的代码与具有代表性的实际程序代码并不相同。
  • 它易受编译器影响。举例来说,在Dhrystone中有大量的字符串复制语句,用来测量字符串复制的性能。然而Dhrystone中字符串的长度不变,并且均开始于自然对齐的边界,这两点便与真实的程序不同。因此一个优化性能好的编译器能够在去掉循环的情形下通过一连串字符的移动代替对字符串的复制,这将会块很多,可能会高达30%。所以我们在编译测试程序的时候,如果指定编译器的优化等级的话,我们会发现在不同的优化登记下,表现出来的性能指标会有差别,优化等级越高,性能指标越好,以下是一款芯片在不同的优化登记下的指标参数
    在这里插入图片描述
  • Dhrystone代码量过小,在现代CPU中,它能够被放进指令缓存中,所以它并不能严格的测量取指性能。

DMIPS/MHz: 表示 CPU 在每 1MHz 的运行速度下可以执行多少个DMIPS,由于DMIPS与CPU频率具有正相关性,所以这一分数更容易比较不同的CPU在不同的时钟频率下运行Dhrystone的结果。

从上面的几个概念来看,都是为了评估cpu的性能—cpu的计算速度,由此引申开来,在软件行业,都需要一个基准测试程序,来评估某种性能----比如CPU的运算效率或者内存效率,我们称之为benchmark。比如在评估cpu运算速度领域,就有上面提到的dhrystone,coremark,whetstone等等;在评估内存效率上,有mem_test等等;评估web功能的有Apache Benchmark,Redis-Beachmark等等
二 how

  • dhrystone软件如何测试性能呢?
    我们可以从网上搜到到dhrystone软件的source code。
    其实也就是三个文件,分别是dhry.h、dhry_1.c、dhry_2.c。如果是在linux环境下开发的话,我们需要配置好makefile,然后编译并生成可执行程序,运行即可;如果实在其他平台上,比如实在单片机ARM上开发的话,有些集成的IDE会自带这些功能,我们只需要porting过来即可,具体实现方法我没有研究过,可以在csdn上搜索查找类似的解决办法。
  • DMIPS如何测试?
    这里给一个github的代码下载地址:https://www.openwrtdl.com/wordpress/来测测路由器cpu性能跑分
    我们获取到dhrystone性能之后,如何将他转换成DMIPS,这个转换关系暂时还没有搜到

三 区别
根据以上介绍的基本概念以及知识,那么MIPS和DMIPS有什么区别呢?CPU性能的评估主要有两个方面:

  • 每秒钟能够执行的指令集数量
    显然MIPS反映的就是这方面的能力,这个能力由cpu的架构,内存memory的访问速度等硬件特性来决定
  • 每秒钟能够实现的工作数量
    DMIPS反应的就是这样的能力,这个能力除了包含第一部分的特性之外,还包括了这些指令集在实现我的测试程序的时候,是如何高效实现的呢?
    举例来说,一个PIC16xxx的cpu,运行在20MHz主频,MIPS=5;但是这些指令只能处理8bit数据,并且不能处理除法和乘法运算,另外一个是一个8088的cpu,主频是5MHz,因此我们可以说PIC16xx在某些方面的性能比8088更快(比如在只有加减法运算的场合),在另外一些场合,8088的运算速度会比PIC16xx的更快,所以仅仅看MIPS的值,并不能够有效的反映的一款cpu性能

四 转换公式
按照字面含义理解,DMIPS和MIPS之间似乎有一个转换公式,但是经过搜索相关内容,发现两者并没有一个直接的转换关系,因为两者完全是从不同角度去看待cpu性能的,参考https://www.edaboard.com/showthread.php?185429-How-to-convert-from-dmips-to-mips

### CPU 算力 60KDMIPS 的解释 对于一个具有特定配置的 CPU 来说,达到 60 KDMIPS (千 Dhrystone MIPS) 表明该处理器能够在每秒内执行大约 60,000 条 Dhrystone 指令。这种度量方法基于 Dhrystone 基准测试程序的结果来评估计算机系统的整数运算性能。 为了实现这一目标算力水平,假设有一个单核处理器运行频率为 \( f \),并且其效率因子(即每个时钟周期能够完成的有效工作量)为 \( E \) DMIPS/MHz,则可以通过调整这两个参数使得最终得到的目标算力满足: \[ \text{Target Performance} = f \times E = 60\,\mathrm{KDMIPS} \] 举例来说,如果某款 ARM 架构下的 CPU 单核主频设定为 1 GHz (\(f=1000\) MHz), 并且已知此架构下典型的核心效能约为 6 DMIPS/MHz(\(E=6\)), 那么通过简单计算可得: \[ 1000\,\mathrm{MHz}\times6\frac{\mathrm{DMIPS}}{\mathrm{MHz}}=6000\,\mathrm{DMIPS}=60\,\mathrm{KDMIPS} \] 这表明,在上述条件下工作的单一核心即可达成所需的 60 KDMIPS 性能标准[^2]。 ```python # Python code to calculate required frequency or efficiency factor given target performance and one of the variables. def calc_required_param(target_performance_kdmips, known_frequency_mhz=None, known_efficiency_dmips_per_mhz=None): """ Calculate either required frequency in MHz or efficiency factor in DMIPS/MHz based on provided information. :param target_performance_kdmips: Target performance level in KDMIPS. :param known_frequency_mhz: Known operating frequency in MHz. Optional. :param known_efficiency_dmips_per_mhz: Known core efficiency in DMIPS per MHz. Optional. :return: Required parameter value as float. """ if not any([known_frequency_mhz, known_efficiency_dmips_per_mhz]) or all([known_frequency_mhz, known_efficiency_dmips_per_mhz]): raise ValueError("Exactly one of 'known_frequency_mhz' or 'known_efficiency_dmips_per_mhz' must be specified.") if known_frequency_mhz is None: return round((target_performance_kdmips / known_efficiency_dmips_per_mhz), 2) elif known_efficiency_dmips_per_mhz is None: return round((target_performance_kdmips / known_frequency_mhz), 2) print(f"To achieve a performance of {60:.0f} KDMIPS with an efficiency of 6 DMIPS/MHz requires a clock speed of " f"{calc_required_param(60, known_efficiency_dmips_per_mhz=6):,.0f} MHz.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值