痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone。
在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone、MIPS、CoreMark,其中Dhrystone是一种古老的却历时30年而不衰的嵌入式系统处理器测试基准,至今仍为各大处理器生产厂商所采用。今天痞子衡就和大家详细聊一聊Dhrystone。
一、经典性能测试标准集
在讲Dhrystone之前,痞子衡想先给大家简介一下20世纪70-80年代开始流行的几个性能测试标准,它们分别是Livermore、Whetstone、Linpack、Dhrystone,这四个性能测试标准也被合称为Classic Benchmark。这个网址简单介绍了四大经典性能测试标准历史 http://www.roylongbottom.org.uk/classic.htm。
细心的朋友应该会注意到Dhrystone与另一标准Whetsone名字有点类似,其实Dhrystone就是为了与算法Whetsone区分而设计的。Whetsone于1972年所开发,主要目的是模仿60个1970年后的程序算法。其最有名的版本为Fortran版,高度反映了60年代数字计算方向。Dhrystone与Whetsone不同之处在于其并不包括浮点运算。
二、Dhrystone标准
  Dhrystone是由Reinhold P. Weicker在1984年提出来的一个基准测试程序,其主要目的是测试处理器的整数运算和逻辑运算的性能。Dhrystone首先用Ada语言发布,后来Rick Richardson为Unix开发了用C语言编写的Version 1.1,这个版本也成功的推动了Dhrystone的广泛应用。
  Dhrystone标准的测试方法很简单,就是单位时间内跑了多少次Dhrystone程序,其指标单位为DMIPS/MHz。MIPS是Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。DMIPS中的D是Dhrystone的缩写,它表示了在Dhrystone标准的测试方法下的MIPS。
  关于DMIPS有一个不得不注意的点,因为历史原因我们把在VAX-11/780机器上的测试结果1757 Dhrystones/s定义为1 DMIPS,因此在其他平台测试到的每秒Dhrystones数应除以1757,才是真正的DMIPS数值,故DMIPS其实表示的是一个相对值。
2.1 获取程序
  Dhrystone程序的最新版本是2.1,其实际上于1988年便已停更。Dhrystone并没有官网,所以想下载其源程序可能会有很多来源,有各种语言版本的实现,以及各种平台下的移植程序。
  Roy Longbottom,是一个来自英国政府计算机采购部门Central Computer and Telecommunications Agency (CCTA)的职员,他制作了一个PC性能测试结果网站,搜集了很多性能测试程序以及结果,其中便有Dhrystone,我们可以从他的网站下载Dhrystone源码(C语言版)。
核心程序下载 http://www.roylongbottom.org.uk/classic_benchmarks.tar.gz
核心程序包下载后,在\classic_benchmarks\source_code\dhrystone2\下可找到源代码。详细文件目录如下:
\classic_benchmarks\source_code\dhrystone2
                                          \dhry.h          --关于兼容性的原型定义
                                          \dhry_1.c        --主程序入口
                                          \dhry_2.c        --算法子程序
如果是移植到ARM Cortex-M平台下裸系统运行,一般只需要简单修改dhry.h和dhry_1.c文件即可,Dhrystone本身并没有太多移植工作,其源码本是用作在PC上运行的,而在嵌入式系统里运行仅需要把一些文件I/O的相关代码删除即可,此外就是计时函数和打印函数的重实现。
2.2 配置参数
Dhrystone源码几乎没有提供配置选项,唯一一个能算得上的配置就是关于REG的宏定义,即你所选用的IDE和嵌入式平台是否支持regiser关键字。
2.3 程序解析
让我们尝试分析Dhrystone主函数入口main:
void main (int argc, char *argv[])
{
          One_Fifty   Int_1_Loc;
    REG   One_Fifty   Int_2_Loc;
          One_Fifty   Int_3_Loc;
    REG   char        Ch_Index;
          Enumeration Enum_Loc;
          Str_30      Str_1_Loc;
          Str_30      Str_2_Loc;
    REG   int         Run_Index;
    REG   int         Number_Of_Runs;
          int         endit, count = 10;
    // ...
    // 定义和初始化关键buffer
    Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
    Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
    Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob;
    // ...
    // 设置循环跑Dhrystone核心算法程序次数
    Number_Of_Runs = 5000;
    do
    {
        Number_Of_Runs = Number_Of_Runs * 2;
        count = count - 1;
        // 开始循环跑Dhrystone核心算法程序且记录累计消耗时间
        start_time();
        for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
        {
            Proc_5();
            Proc_4();
            // ...
        }
        end_time();
        User_Time = secs;
        printf ("%12.0f runs %6.2f seconds \n",(double) Number_Of_Runs, User_Time);
        if (User_Time > 2)
        {
            count = 0;
        }
        else
        {
            if (User_Time < 0.05)
            {
                Number_Of_Runs = Number_Of_Runs * 5;
            }
        }
    }
    while (count >0);
    // ...
	// 最终信息的打印
    if (User_Time < Too_Small_Time)
    {
        printf ("Measured time too small to obtain meaningful results\n");
        printf ("Please increase number of runs\n");
        printf ("\n");
    }
    else
    {
        Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs;
        Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time;
        Vax_Mips = Dhrystones_Per_Second / 1757.0;
        printf ("Microseconds for one run through Dhrystone: ");
        printf ("%12.2lf \n", Microseconds);
        printf ("Dhrystones per Second:                      ");
        printf ("%10.0lf \n", Dhrystones_Per_Second);
        printf ("VAX  MIPS rating =                          ");
        printf ("%12.2lf \n",Vax_Mips);
        printf ("\n");
	}
    // ...
}
2.4 结果格式
当移植好Dhrystone程序后,便可以开始跑起来了,下面是一个主频100MHz的Pentium处理器跑分结果:
 Dhrystone Benchmark  Version 2.1 (Language: C)
 Final values:
 Int_Glob:      O.K.  5
 Bool_Glob:     O.K.  1
 Ch_1_Glob:     O.K.  A
 Ch_2_Glob:     O.K.  B
 Arr_1_Glob[8]: O.K.  7
 Arr_2_Glob8/7: O.K.     1600010
 Ptr_Glob->
   Ptr_Comp:       *  98008
   Discr:       O.K.  0
   Enum_Comp:   O.K.  2
   Int_Comp:    O.K.  17
   Str_Comp:    O.K.  DHRYSTONE PROGRAM, SOME STRING
 Next_Ptr_Glob->
   Ptr_Comp:       *  98008 same as above
   Discr:       O.K.  0
   Enum_Comp:   O.K.  1
   Int_Comp:    O.K.  18
   Str_Comp:    O.K.  DHRYSTONE PROGRAM, SOME STRING
 Int_1_Loc:     O.K.  5
 Int_2_Loc:     O.K.  13
 Int_3_Loc:     O.K.  7
 Enum_Loc:      O.K.  1
 Str_1_Loc:     O.K.  DHRYSTONE PROGRAM, 1'ST STRING
 Str_2_Loc:     O.K.  DHRYSTONE PROGRAM, 2'ND STRING
 Register option      Selected.
 Microseconds 1 loop:          4.53
 Dhrystones / second:      220690
 VAX MIPS rating:            125.61
其中最核心的数据便是Dhrystones / second的数值。
2.5 跑分榜
Roy Longbottom的网站收集记录了很多款处理器的Dhrystone跑分结果,可移步他的网站链接查看 http://www.roylongbottom.org.uk/dhrystone%20results.htm#anchorAndroid
至此,微处理器CPU性能测试基准Dhrystone痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)的更多相关文章
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性介绍(2)- RT685EVKA性能实测(Dhrystone)
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的性能. 在前面的文章 i.MXRTxxx微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2018 ... 
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU开发那些事 - 索引
		大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦i.MX RTxxx系列微控制器相关知识. 恩智浦半导体于2018年10月发布的i.MX RTxxx系列开启了ML/AI MCU ... 
- 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark)
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微控制器CPU性能测试基准CoreMark. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.Co ... 
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU特性介绍(2)- RT1052DVL6性能实测
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的性能. 在前面的文章 i.MXRT微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2017年推出的新 ... 
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性那些事(2)- RT1052DVL6性能实测(CoreMark)
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的性能. 在前面的文章 i.MXRTyyyy微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2 ... 
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU开发那些事 - 索引
		大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔i.MX RT系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2017年开始推出的i.MX RT系列开启了高性能MC ... 
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Bootable image格式与加载过程. 在i.MXRT启动系列第三篇文章 Serial Down ... 
- 痞子衡嵌入式:盘点国内车规级MCU厂商
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内车规级MCU厂商及其产品. 在汽车电子领域,MCU的应用非常广泛,大到车身控制与动力总成,小到雨刷车窗等控制单元,都离不开MCU的身 ... 
- 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ... 
随机推荐
- 性能测试--Jmeter录制、回放
			Jmeter录制.回放 在jmeter2.1版本之前,jmeter应该是不支持录制和回放功能的,那时候如果需要录制jmeter的性能测试脚本的话,就需要使用第三方工具——badboy.现在jmeter ... 
- python——进程池
			from concurrent.futures import ProcessPoolExecutor import os,random def func(name): print("%s吃了 ... 
- vue-cookies、极验滑动验证geetest、vue-router的导航守卫
			一 . vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/ ... 
- 7-4 汉密尔顿回路(25 分) 【STL】
			7-4 汉密尔顿回路(25 分) 著名的"汉密尔顿(Hamilton)回路问题"是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次).本题就要求你判断任一给定的回路是 ... 
- mvc Bundling 学习记录(一)
			参考博客:http://www.cnblogs.com/xwgli/p/3296809.html 这里要详细记录的是对于现有MVC项目进行Bundling功能 1 如果没有System.Web.Op ... 
- 杂草丛生HTML5网站模板
			杂草丛生HTML5个人网站模板是一款野草到处生长的HTML5网站模板下载. 模板地址:http://www.huiyi8.com/sc/8780.html 
- (转)C语言之原码、反码和补码
			原码.反码和补码 1).数据在内存中存储的时候都是以二进制的形式存储的. int num = 10; 原码.反码.补码都是二进制.只不过是二进制的不同的表现形式. 数据是以补码的二进制存储的. 2). ... 
- 【MFC】动态创建CMFCToolbar图标不显示问题
			最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路 ... 
- xml字符串的解析
			import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.Names ... 
- 白痴qwerta的胡言乱语(一句话日度感想?
			10.2 >我tm吹爆这个Latex插件!!!太漂亮了吧?!!! 10.3 >什么鬼气考试 还有这考试的大家也肽水了吧 >再吹一次这个Latex插件!!! 10.6 >今天在琢 ... 
