Бенчмаркингом я занимаюсь уже более 10 лет (заинтересовался, когда приобрёл первый одноплатный компьютер Odroid X2 в 2012 году, тогда только зарождалась субкультура по одноплатным компьютерам), а также мне всегда было интересно сравнить производительность современных процессоров с процессорами 80-х годов (конечно же я использую и современные бенчмарки). Для меня важно, чтобы у бенчмарков был доступен исходный код (особенно на языке C и без заморочек компиляции), легко собираемый и понятный в интерпретации результатов.

В тестах процессоров я применяю следующие бенчмарки: Dhrystone, Whetstone, Linpack 100, Coremark, MP MFLOPS, Scimark 2, STREAM, TLB, HPL. А также Geekbench, Cpu-z bench, Crystal Mark 2004, 7z и другие.

В данной статье рассмотрим Dhrystone.

Что такое Dhrystone?

Dhrystone (Сухой Камень) разработан в 1984 Dr. Reinhold P. Weicker для измерения целочисленной производительности различных компьютерных систем, в 1988 году вышла версия 2.1. Имя Dhrystone было выбрано как противопоставление бенчмарку Whetstone (Влажный камень) измеряющему производительность с плавающей точкой.

Достоинства бенчмарка:

  • Простой;

  • Можно сравнить результаты процессоров разных архитектур;

  • Легко компилируется и переносится (работает даже на микроконтроллерах).

Недостатки:

  • Использует ограниченный набор функций;

  • Не позволяет задействовать все возможности процессора;

  • Странный код;

  • Результаты очень зависят от оптимизации компилятора;

  • Оценки версии 1.1 и 2.1 несовместимы;

  • Не развивается с 1988 года;

  • Помещается в кэш процессора (снижается нагрузка на подсистему памяти).

Кстати, бенчмарк Dhrystone часто используют для замера производительности ядер ARM.

Пример вывода результатов:

Dhrystone Benchmark, Version 2.1 (Language: C or C++)
Optimisation    amd64 x86-64 optimized
Register option not selected
   10000 runs   0.00 seconds 
  100000 runs   0.00 seconds 
 1000000 runs   0.02 seconds 
10000000 runs   0.12 seconds 
20000000 runs   0.23 seconds 
40000000 runs   0.45 seconds 
80000000 runs   0.90 seconds 

160000000 runs   1.80 seconds
320000000 runs   3.66 seconds
Final values (* implementation-dependent):
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.   320000010
Ptr_Glob->              Ptr_Comp:       *    0x55b8eb3fa2a0
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:       *    0x55b8eb3fa2a0 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
Nanoseconds one Dhrystone run:        11.43
Dhrystones per Second:             87460726
VAX  MIPS rating =                 49778.44

Важные данные результатов:

  • Dhrystones per Second - Число Dhrystone в секунду

  • VAX MIPS rating - Производительность относительно машины DEC VAX 11/780 result с результатом 1 MIPS. Получается путём деления Dhrystones per Second на 1757. Иногда результаты называют как DMIPS.

Как работает Dhrystone?

  • Арифметические операции;

  • Сравнение строк (Задействует функции strcmp() и strcpy());

  • Операции с указателями и структурами;

  • Операции с массивами;

  • Операции с switch, циклы.

Бенчмарк проверяет результаты выполнения на валидность, а результаты могут быть невалидны, если компилятор сломал код при сильных флагах компиляции. Как сказано выше, результаты могут варьироваться от флагов оптимизаций. Например, лаборатория EEMBC рекомендует отказаться от тестов Dhrystone и использовать бенчмарк Coremark.

Кстати, я портировал бенчмарк Dhrystone на другие языки программирования: Python, JavaScript, PHP, Lua, C#, Java. Код здесь: https://github.com/entityfx/entityfx-bench.

Таблица с результатами тестов некоторых процессоров

Таблицы с различными результатами
Dhry1  Dhry1  Dhry2  Dhry2
                        Opt  NoOpt    Opt  NoOpt
                        VAX    VAX    VAX    VAX
CPU              MHz   MIPS   MIPS   MIPS   MIPS

AMD 80386         40   17.5   4.32   13.7   4.53
IBM 486D2         50   26.6   7.89   22.4   7.89
80486 DX2         66   45.1   12.0   35.3   12.4
IBM 486BL        100   53.9   12.0   40.9   11.8
AMD 5X86         133   84.5   9.37   84.5   9.42
Pentium           75    112   19.3   87.1   18.9
Cyrix P150       120    175   27.9    160   28.3
Pentium          100    169   31.8    122   32.2
Cyrix PP166      133    219   38.4    180   39.8
IBM 6x86         150    234   44.1    188   43.9
Pentium          133    239   38.3    181   39.0
Pentium          166    270   43.6    189   43.9
Cyrix PR233      188    286   46.4    232   45.8
Pentium          200    353   47.4    269   48.1
Pentium MMX      200    352   51.4    276   51.0
AMD K6           200    349   43.1    289   43.3
Pentium Pro      200    373   92.4    312   91.9
Celeron A        300    553    133    484    136
Pentium II       300    544    132    477    136
AMD K62          500    778   77.8    606   76.8
AMD K63          450    804   76.3    645   77.4
Pentium II       450    813    199    713    204
Celeron A        450    828    198    720    202
Pentium III      450    846    197    722    203
Pentium III      600   1105    263    959    270
Athlon           600   1316    321    942    316
Duron            600   1382    350    999    349
Pentium III     1000   1858    461   1595    465
PIII Tualatin   1200   2205    546   1907    571
Pentium 4       1700   2262    239   1843    242
Athlon Tbird    1000   2282    634   1659    602
Duron           1000   2288    576   1674    587
Celeron M       1295   2440    640   2273    645
Atom            1600   2462    717   1828    728
Pentium 4       1900   2593    261   2003    269
Atom            1666   2600    772   1948    780
P4 Xeon         2200   3028    300   2265    309
Atom Z8300      1840   3203    904   2686    927
Athlon 4        1600   3707    956   2830   1004
Pentium M       1862   4082    954   3933    975
Ath4 Barton     1800   4181   1061   3172   1099
Pentium 4E      3000   4379    566   3553    566
Athlon XP       2080   4826   1228   3700   1312
Turion 64 M     1900   4972   1186   3742   1150
Pentium 4       3066   5052    432   4012    434
Opteron         1991   5077   1268   3985   1223
Core 2 Duo M    1830   5379    892   4952    966
Athlon XP       2338   5433   1400   4160   1482
Athlon 64       2150   5658   1312   4288   1355
Pentium 4       3678   5787    511   4227    480
Athlon 64       2211   5798   1348   4462   1312
Celeron C2 M    2000   5804    932   5275   1050
Core 2 Duo 1 CP 2400   7145   1198   6446   1251
Core i5 2467M   @@@@   8338   1183   4752   1148
Phenom II 1 CP  3000   9462   2250   7615   2253
Core i7 930     ****   9826   1662   8684   1661
Core i7 860     ####  10094   1789   9978   1847
Core i7 3930K   &&&&  13871   1960  11197   1972
Core i7 4820K   $$$1  14136   1958  11867   1981
Core i7 4820K   $$$2  14776   2006  11978   2014
Core i7 3930K   OC    17269   2444  13877   2432

 ####  Rated as 2800 MHz but running at up to   
       3460 MHz using Turbo Boost               
 ****  Rated as 2800 MHz but running at up to   
       3066 MHz using Turbo Boost               
 @@@@  Rated as 1600 MHz running at up to       
       2300 MHz using Turbo Boost               
 &&&&  Rated as 3200 MHz but running at up to   
       3800 MHz, OC OverClocked ~4730 MHz       
 $$$1  Rated as 3700 MHz but running at up to   
       3900 MHz, using Turbo Boost              
 $$$2  Performance not Balanced Power Setting   
       for 3900 MHz                             
   M = Mobile CPU                               

To Start

                      Dhry1  Dhry1  Dhry2  Dhry2
                        Opt  NoOpt    Opt  NoOpt
                        VAX    VAX    VAX    VAX
CPU              MHz   MIPS   MIPS   MIPS   MIPS

Later Results 32 and 64 Bit MS Compilers       

Pentium 4  32b1 1900   2613          1795       

Athlon 64  32b1 2211   6104          3720       
Athlon 64  64b1 2211   8668          5214       
Athlon 64  64b2 2211   8549          4654       

Core 2 Duo 32b1 2400   8094          5476       
Core 2 Duo 64b1 2400  12600          8550       
Core 2 Duo 64b2 2400  11726          6248       

Core i7    64b1 &&&&  33048         18355       
Core i7    64b2 &&&&  27873         15753       

Core i7    32b1 $$$1  15470         10302       
Core i7    64b1 $$$1  27113         15580       
Core i7    64b2 $$$1  22362         13279       
Core i7    32b1 $$$2  15587         10347       
Core i7    64b1 $$$2  29291         15756       
Core i7    64b2 $$$2  23652         13364       

Phenom II  32b1 3000   9768          6006       
Phenom II  64b1 3000   9862          6878       
Phenom II  64b2 3000  11837          8006       

 b1 = 32 bit integers, b2 = 64 bit integers    
 &&&& overclocked i7-3930K see above           
 $$$1  Turbo Boost < 3900 MHz see above        
 $$$2  Turbo Boost at 3900 MHz see above       

Later MS Compilers  Version 18.00              

Atom Z8300 32b1 1840                 3044       
Atom Z8300 64b1 1840                 3201       

Core 2 Mob 32b1 1830                 4546       

Core 2 Duo 32b1 2400                 6587       
Core 2 Duo 64b1 2400                 5946       

Core i7    32b1 $$$1                12090       
Core i7    64b1 $$$1                11686       

Phenom II  32b1 3000                 7321       
Phenom II  64b1 3000                 8137       

To Start


,B.32 Bit and 64 Bit Linux Results from Ubuntu GCC 

                             Dhry1  Dhry1  Dhry2  Dhry2
                               Opt  NoOpt    Opt  NoOpt
                              VAX    VAX    VAX    VAX
CPU                OS   MHz   MIPS   MIPS   MIPS   MIPS

Atom N455     32b  Ub  1666   5485   1198   2055   1194
Atom N455     64b  Ub  1666   5926   1065   2704   1098

Core 2 Mob    32b  Ub  1830   9876   2602   4833   2584
Core 2 Mob    64b  Ub  1830  15382   2265   8241   2502
 
Athlon 64     32b  Ub  2211   9034   2286   4580   2347
Athlon 64     64b  Ub  2211  14783   2243   6873   2580

Core 2 Duo    32b  Ub  2400  13599   3428   5852   3348
Core 2 Duo    64b  Ub  2400  18738   3643  12265   3288

Phenom II     32b  Ub  3000  13406   3368   6676   3470
Phenom II     64b  Ub  3000  21996   3908  11982   3826
Phenom II     64b  Fe  3000  21841   3882  12000   3798

Core i7 930   64b  Ub  ****  24396   5361  16435   5302

Core i7 4820K 32b  Ub  $$$1  29277   7108   16356  7478
Core i7 4820K 64b  Ub  $$$1  32659   8436   23607  8481

       Ub = Ubuntu Linux,   Fe = Fedora Linux   
 ****  Rated as 2800 MHz but running at up to   
       3066 MHz using Turbo Boost               
 $$$1  Rated as 3700 MHz but running at up to   
       3900 MHz, using Turbo Boost              

To Start



 Android Results Compiled By Native Development Kit
 Also results for Raspberry Pi & Linux

                                     Opt     NoOpt
 System   ARM    MHz   Android       Vax       Vax
                                    MIPS      MIPS

  T5  MIPS CPU  1000     4.0.1        56 E        
  T1    926EJ    800       2.2       356       196
  T2    v7-A9    800     2.3.4       962       458
  P13   v7-A9   1200     4.1.2      1491          
  T7    v7-A9   1300a    4.1.2      1610       810
  T4    v7-A9   1500a    4.0.3      1650       786
  P11   v7-A9v3 1400     4.0.4      1937       866
  T11*I v7-A15  2000b    4.2.2      2533          
  T11   v7-A15  2000b    4.2.2      3189      1504
  T21*I QU-800  2150     4.4.3      3319          
  T21   QU-800  2150     4.4.3      3854      1628

  A1*C  Z3745   1866     4.4.2      1840      1310
  A1*I  Z3745   1866     4.4.2      2451          
  A1*I  Z8300   1840     5.1.1      2430          

  ARM   v8-A53  1300     5.0.2      1683          
  ARM*I v8-A53  1300     5.0.2      1423          
  ARM*I v8-A53  1300     5.1        1493          
  ARM*I v8-A53  1500     6.0.1      1649          
  R1=Atom Z8300 1840     6.0.1      2390          
  R2    Core i7 3900     6.0.1     10489          

  64 Bit Version                                  
  ARM  v8-A53*I 1300     5.0.2      2569          
  ARM  v8-A53*I 1300     5.1        2658          
  R1=Atom Z8300 1840     6.0.1      3769          
  R2    Core i7 3900     6.0.1     17003          

   System - T = Tablet, P = Phone, E = Emulator?  
   a running at 1500, b at 1700                   
  *I Atom Native Intel/ARM version                
  *C Atom using Intel to ARM conversion           
  QU = Qualcomm CPU                               
  R1, R2 Android via REMIX for PC                 

 Raspberry Pi           Linux                   
  ARM  1176      700     3.6.11      847          
  ARM  1176     1000     3.6.11     1226          

  Raspberry Pi 2                                  
  ARM V7A       900      3.18.5     1538          
  ARM v7A      1000      3.18.5     1694          
 gcc 4.8                                        
  ARM V7A       900      3.18.5     1667          
  ARM V7A      1000      3.18.5     1852          

  Raspberry Pi 3, 32 Bit                          
  ARM v8-A53   1200      4.1.19     2201          
  gcc 4.8                                         
  ARM v8-A53   1200      4.1.19     2469          

  Raspberry Pi 3, 64 Bit                          
  OpenSuse                                        
  ARM v8-A53   1200      4.4.36     3536          
  Gentoo                                          
  ARM v8-A53   1200      4.10.0     3475          

NOTE: ARM's own results are much faster than these
- different compiler and optimisation?

To Start


16 Bit Results

                      Dhry1  Dhry1  Dhry2  Dhry2
                        Opt  NoOpt    Opt  NoOpt
                        VAX    VAX    VAX    VAX
CPU              MHz   MIPS   MIPS   MIPS   MIPS

80486 DX2         66     29     14     18      8
Pentium          100     89     41     78     42
Pentium Pro      200    176     95    164     94
Celeron M       1295    705                     
Pentium 4E      3000    754                     
Athlon 4        2080   1256                     
Core i7 4820K   3700   1832                     

OS/2 Results

80486             75     37      9     35      9
IBM 80486BL      100     54     12     41     12
80486 DX2         66     59     12     48     12
Cyrix P150       120    175     28    160     28
Pentium Pro      150    276     53    218     52
Pentium Pro      166    307     59    242     57
Pentium Pro      200    362     69    285     67

Ссылки

P. S.

Для Windows бенчмарк можно скачать отсюда: http://www.roylongbottom.org.uk/benchnt.zip
Для Linux собираете из исходников: https://github.com/sifive/benchmark-dhrystone или из моего репозитория: https://github.com/EntityFX/anybench

Комментарии (4)


  1. kovserg
    25.06.2023 19:14
    +5

    Так и что такое Dhrystone? И как его можно использовать в эпоху спекулятивных вычислений, предсказаний переходов, многоядерности, векторных инструкций и многоуровневых кэшей?


    1. EntityFX Автор
      25.06.2023 19:14
      +1

      Конечно же не рекомендуется использовать,хотя его часто упоминают в тестах ядер ARM Cortex. Рекомендуют Coremark и другие.


  1. BareDreamer
    25.06.2023 19:14
    +1

    лаборатория EEMBC рекомендует отказаться от тестов Dhrystone и использовать бенчмарк Coremark

    Я не понял, зачем нужен Dhrystone, когда есть более совершенный аналог – Coremark.


    1. EntityFX Автор
      25.06.2023 19:14
      +1

      Для истории: можно сравнить с процессорами из 80х, 90х. А так не нужен.