查看: 4131|回复: 0

[分享] 微处理器CPU性能测试基准(Dhrystone)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2021-6-17 12:47:32 | 显示全部楼层 |阅读模式
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是微处理器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
    11.png
    细心的朋友应该会注意到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语言版)。
    1. 核心程序下载 http://www.roylongbottom.org.uk/classic_benchmarks.tar.gz
    复制代码
    核心程序包下载后,在\classic_benchmarks\source_code\dhrystone2\下可找到源代码。详细文件目录如下:
    1. \classic_benchmarks\source_code\dhrystone2
    2.                                           \dhry.h          --关于兼容性的原型定义
    3.                                           \dhry_1.c        --主程序入口
    4.                                           \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:
    1. void main (int argc, char *argv[])
    2. {
    3.           One_Fifty   Int_1_Loc;
    4.     REG   One_Fifty   Int_2_Loc;
    5.           One_Fifty   Int_3_Loc;
    6.     REG   char        Ch_Index;
    7.           Enumeration Enum_Loc;
    8.           Str_30      Str_1_Loc;
    9.           Str_30      Str_2_Loc;
    10.     REG   int         Run_Index;
    11.     REG   int         Number_Of_Runs;
    12.           int         endit, count = 10;
    13.     // ...

    14.     // 定义和初始化关键buffer
    15.     Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
    16.     Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
    17.     Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob;
    18.     // ...

    19.     // 设置循环跑Dhrystone核心算法程序次数
    20.     Number_Of_Runs = 5000;

    21.     do
    22.     {
    23.         Number_Of_Runs = Number_Of_Runs * 2;
    24.         count = count - 1;

    25.         // 开始循环跑Dhrystone核心算法程序且记录累计消耗时间
    26.         start_time();
    27.         for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
    28.         {
    29.             Proc_5();
    30.             Proc_4();
    31.             // ...
    32.         }
    33.         end_time();
    34.         User_Time = secs;

    35.         printf ("%12.0f runs %6.2f seconds \n",(double) Number_Of_Runs, User_Time);
    36.         if (User_Time > 2)
    37.         {
    38.             count = 0;
    39.         }
    40.         else
    41.         {
    42.             if (User_Time < 0.05)
    43.             {
    44.                 Number_Of_Runs = Number_Of_Runs * 5;
    45.             }
    46.         }
    47.     }
    48.     while (count >0);

    49.     // ...
    50. // 最终信息的打印
    51.     if (User_Time < Too_Small_Time)
    52.     {
    53.         printf ("Measured time too small to obtain meaningful results\n");
    54.         printf ("Please increase number of runs\n");
    55.         printf ("\n");
    56.     }
    57.     else
    58.     {
    59.         Microseconds = User_Time * Mic_secs_Per_Second / (double) Number_Of_Runs;
    60.         Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time;
    61.         Vax_Mips = Dhrystones_Per_Second / 1757.0;

    62.         printf ("Microseconds for one run through Dhrystone: ");
    63.         printf ("%12.2lf \n", Microseconds);
    64.         printf ("Dhrystones per Second:                      ");
    65.         printf ("%10.0lf \n", Dhrystones_Per_Second);
    66.         printf ("VAX  MIPS rating =                          ");
    67.         printf ("%12.2lf \n",Vax_Mips);
    68.         printf ("\n");
    69. }
    70.     // ...
    71. }
    复制代码
    2.4 结果格式
    当移植好Dhrystone程序后,便可以开始跑起来了,下面是一个主频100MHz的Pentium处理器跑分结果:
    1. Dhrystone Benchmark  Version 2.1 (Language: C)

    2. Final values:

    3. Int_Glob:      O.K.  5
    4. Bool_Glob:     O.K.  1
    5. Ch_1_Glob:     O.K.  A
    6. Ch_2_Glob:     O.K.  B
    7. Arr_1_Glob[8]: O.K.  7
    8. Arr_2_Glob8/7: O.K.     1600010
    9. Ptr_Glob->
    10.    Ptr_Comp:       *  98008
    11.    Discr:       O.K.  0
    12.    Enum_Comp:   O.K.  2
    13.    Int_Comp:    O.K.  17
    14.    Str_Comp:    O.K.  DHRYSTONE PROGRAM, SOME STRING
    15. Next_Ptr_Glob->
    16.    Ptr_Comp:       *  98008 same as above
    17.    Discr:       O.K.  0
    18.    Enum_Comp:   O.K.  1
    19.    Int_Comp:    O.K.  18
    20.    Str_Comp:    O.K.  DHRYSTONE PROGRAM, SOME STRING
    21. Int_1_Loc:     O.K.  5
    22. Int_2_Loc:     O.K.  13
    23. Int_3_Loc:     O.K.  7
    24. Enum_Loc:      O.K.  1
    25. Str_1_Loc:     O.K.  DHRYSTONE PROGRAM, 1'ST STRING
    26. Str_2_Loc:     O.K.  DHRYSTONE PROGRAM, 2'ND STRING

    27. Register option      Selected.

    28. Microseconds 1 loop:          4.53
    29. Dhrystones / second:      220690
    30. VAX MIPS rating:            125.61
    复制代码
    其中最核心的数据便是Dhrystones / second的数值。


    2.5 跑分榜
    Roy Longbottom的网站收集记录了很多款处理器的Dhrystone跑分结果,可移步他的网站链接查看 http://www.roylongbottom.org.uk/ ... s.htm#anchorAndroid


    至此,微处理器CPU性能测试基准Dhrystone痞子衡便介绍完毕了,掌声在哪里~~~





    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 13:26 , Processed in 0.104646 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表