MIPS, DMIPS i DMIPS/MHz – co naprawdę mierzą te metryki wydajności komputerów?

W świecie komputerów, a szczególnie systemów wbudowanych i procesorów pracujących pod kontrolą Linuksa, często spotykamy się z różnymi jednostkami opisującymi wydajność: MIPS, DMIPS czy DMIPS/MHz. Na pierwszy rzut oka wszystkie brzmią podobnie, ale w praktyce oznaczają zupełnie różne rzeczy. Warto wiedzieć, czym się różnią i dlaczego nie można ich bezpośrednio porównywać.

Czym jest MIPS?

MIPS (Million Instructions Per Second) – milion instrukcji na sekundę.
To najstarsza i najprostsza metryka wydajności procesora. Informuje, ile instrukcji CPU może wykonać w ciągu sekundy.

  • Zalety: łatwa do zrozumienia i zmierzenia.
  • Wady: instrukcja instrukcji nierówna. Różne procesory mają różne zestawy instrukcji (ISA), a te mogą być bardziej lub mniej złożone. Jeden CPU może potrzebować kilku instrukcji do wykonania operacji, którą inny robi jedną. Dlatego porównywanie dwóch różnych architektur tylko na podstawie MIPS jest mylące.

Przykład: procesor A wykonuje 200 MIPS, procesor B tylko 150 MIPS – ale jeśli B ma bardziej złożone instrukcje, może być w praktyce szybszy.

DMIPS – czyli Dhrystone MIPS

Aby uniezależnić pomiar od „prostego liczenia instrukcji”, wprowadzono Dhrystone benchmark – syntetyczny test oparty na typowych operacjach wykonywanych przez programy.

DMIPS (Dhrystone MIPS) to wynik testu Dhrystone przeliczony na ekwiwalent MIPS.
Wzór wygląda tak:

DMIPS = (wynik benchmarku Dhrystone / 1757)

gdzie 1757 to liczba iteracji testu odpowiadająca 1 MIPS na procesorze VAX 11/780 (klasyczny punkt odniesienia z lat 80.).

  • Zalety: lepiej odzwierciedla wydajność „rzeczywistą” niż MIPS.
  • Wady: nadal jest to benchmark syntetyczny – nie uwzględnia np. wydajności w obliczeniach zmiennoprzecinkowych (floating point) czy wielowątkowości.

DMIPS/MHz – wydajność na takt zegara

Kolejny krok to urealnienie porównania między CPU o różnych częstotliwościach.
Tu pojawia się metryka DMIPS/MHz, która mówi: ile jednostek DMIPS procesor uzyskuje na każdy MHz swojego zegara.

  • Jeśli procesor ma 1,2 DMIPS/MHz i taktowanie 500 MHz, jego wydajność teoretyczna wynosi: 1,2 × 500 = 600 DMIPS
  • Dzięki temu możemy porównywać różne architektury w sposób bardziej uczciwy, niezależnie od taktowania.

Przykładowe porównanie

  • ARM Cortex-M3: ok. 1,25 DMIPS/MHz
  • ARM Cortex-A9: ok. 2,5 DMIPS/MHz
  • Cortex-A72: nawet powyżej 10 DMIPS/MHz

Jak widać, nowsze architektury są znacznie bardziej wydajne przy tym samym zegarze.

Zróbmy ćwiczenie praktyczne na Linuksie z pomiarów wydajności komputerów!

Na ruszt przychodzą nam dwie architektury, które są pod ręką:

  • x86_64
  • ARMv7

Oto metodyka zwana Dhrystone Benchmark, która wymaga zainstalowanych pakietów wget i gcc do działania przykładowej implementacji testu. Testy te mierzą wydajność stałoprzecinkowych operacji.

Oto jak zainstalować wymagane pakiety w Linux Debian i Ubuntu:

$ apt install wget gcc

Pobieramy kod skryptu testującego:

$ wget https://homepages.cwi.nl/~steven/dry.c

Uruchomienie i auto-kompilacja:

$ sh dry.c

Wykonajmy kilka testów na architekturze x86_64 (Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz)

$ sh dry.c
cc -c dry.c -o dry1.o
cc -DPASS2 dry.c dry1.o -o dry2

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register’ attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.05
Dhrystones per Second: 18518518

cc -c -DREG dry.c -o dry1.o
cc -DPASS2 -DREG dry.c dry1.o -o dry2r

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled with 'register’ attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.05
Dhrystones per Second: 21645022

cc -c -O dry.c -o dry1.o
cc -DPASS2 -O dry.c dry1.o -o dry2o

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register’ attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs: too few
Trying 500000000 runs:
Microseconds for one run through Dhrystone: 0.02
Dhrystones per Second: 40916528

Wykonajmy kilka testów na architekturze ARMv7 (Luckfox Lyra Zero W)

sh dry.c
cc -c dry.c -o dry1.o
cc -DPASS2 dry.c dry1.o -o dry2

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register' attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs:
Microseconds for one run through Dhrystone: 0.73
Dhrystones per Second: 1377410

cc -c -DREG dry.c -o dry1.o
cc -DPASS2 -DREG dry.c dry1.o -o dry2r

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled with 'register' attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs:
Microseconds for one run through Dhrystone: 0.64
Dhrystones per Second: 1562500

cc -c -O dry.c -o dry1.o
cc -DPASS2 -O dry.c dry1.o -o dry2o

Dhrystone Benchmark, Version C, Version 2.2a
Program compiled without 'register' attribute
Using times(), HZ=100

Trying 50000 runs: too few
Trying 500000 runs: too few
Trying 5000000 runs: too few
Trying 50000000 runs:
Microseconds for one run through Dhrystone: 0.28
Dhrystones per Second: 3571428

Whetstone – pomaga sprawdzić kalulację zmiennoprzecinkową

Istnieje też inny znany algorytm Whetstone Benchmark stosowany do pomiaru wydajności komputerów z Linuxem.

Wersja kodu performance zaproponowana przez Netlib bez autokalibracji

$ mkdir whetstone
$ cd whetstone
$ wget http://www.netlib.org/benchmark/whetstone.c
$ gcc whetstone.c -o whet -lm
$ ./whet -c 1000000

Wynik przykładowych testów na architekturze x86_64

$ ./whet -c 1000000

Loops: 1000000, Iterations: 1, Duration: 31 sec.
C Converted Double Precision Whetstones: 3225.8 MIPS

Wynik przykładowych testów na architekturze ARMv7

$ ./whet -c 1000000

Loops: 1000000, Iterations: 1, Duration: 219 sec.
C Converted Double Precision Whetstones: 456.6 MIPS

Wersja kodu performance zaproponowana przez Roy Longbottom z autokalibracją

$ mkdir whetstone
$ cd whetstone
$ wget http://www.roylongbottom.org.uk/whets.c
$ gcc -DUNIX whets.c -o whets -lm
$ ./whets

Wynik przykładowych testów na architekturze x86_64

$ ./whets

##########################################
Single Precision C/C++ Whetstone Benchmark

Calibrate
0.01 Seconds 1 Passes (x 100)
0.06 Seconds 5 Passes (x 100)
0.10 Seconds 25 Passes (x 100)
0.31 Seconds 125 Passes (x 100)
1.57 Seconds 625 Passes (x 100)
7.79 Seconds 3125 Passes (x 100)

Use 40117 passes (x 100)

Single Precision C/C++ Whetstone Benchmark

Loop content Result MFLOPS MOPS Seconds

N1 floating point -1.12475013732910156 894.742 0.861
N2 floating point -1.12274742126464844 813.679 6.626
N3 if then else 1.00000000000000000 1422.078 2.920
N4 fixed point 12.00000000000000000 2194.227 5.759
N5 sin,cos etc. 0.49911010265350342 226.600 14.730
N6 floating point 0.99999982118606567 469.947 46.046
N7 assignments 3.00000000000000000 633.781 11.697
N8 exp,sqrt etc. 0.75110864639282227 116.338 12.828

MWIPS 3953.713 101.467

Wynik przykładowych testów na architekturze ARMv7

$ ./whets

##########################################
Single Precision C/C++ Whetstone Benchmark

Calibrate
0.02 Seconds 1 Passes (x 100)
0.11 Seconds 5 Passes (x 100)
^C
root@luckfox:~# ./whets

##########################################
Single Precision C/C++ Whetstone Benchmark

Calibrate
0.02 Seconds 1 Passes (x 100)
0.10 Seconds 5 Passes (x 100)
0.52 Seconds 25 Passes (x 100)
2.61 Seconds 125 Passes (x 100)

Use 4786 passes (x 100)

Single Precision C/C++ Whetstone Benchmark

Loop content Result MFLOPS MOPS Seconds

N1 floating point -1.12475013732910156 267.256 0.344
N2 floating point -1.12274742126464844 132.456 4.856
N3 if then else 1.00000000000000000 163.928 3.022
N4 fixed point 12.00000000000000000 229.596 6.566
N5 sin,cos etc. 0.49911010265350342 17.760 22.420
N6 floating point 0.99999982118606567 74.134 34.823
N7 assignments 3.00000000000000000 53.326 16.586
N8 exp,sqrt etc. 0.75110864639282227 15.648 11.378

MWIPS 478.624 99.995

Tabelka z podsumowaniem testów wydajności mierzonymi różnymi metodami

Jak widać ARMv7 to nowoczesny jednopłytkowy mikrokomputer i jego wydajność w porównaniu z klasycznym (kilkuletnim laptopem na procesorze Intel i7) to różnica pomiędzy 7x … 11x (na korzyść laptopa z i7). Rozrzut wyników w liczbowej skali porównawczej jest naturalny w metrykach wydajności, dlatego warto wykonywać więcej testów i stosować kilka narzędzi, aby ewentualne różnice były czytelne we wnioskach pomiarowych! Dodatkowo pokazany został wycinek test runów, które służyły do zaokrąglenia ostatecznych wyników. Mimo poczynionych starań wyniki na referencyjnej architekturze zawsze będą posiadały różnice kilku procentową, to normalne zjawisko w prowadzeniu pomiarów wydajności złożonych systemów.

ArchitekturaKomputerDhrystones na sekundęDMIPS = (wynik benchmarku Dhrystone / 1757)C Converted Double Precision Whetstones: MIPSMWIPS
x86_64Intel(R) Core(TM) i7-8850H CPU40 916 52823 287.723225.83 953.713
ARMv7Luckfox Lyra Zero W3 571 4282 032.68456.6478.624

Jak to się ma do Linuksa?

W systemach linuksowych, szczególnie w świecie embedded Linux, producenci często podają wydajność swoich SoC w DMIPS lub DMIPS/MHz.
Dzięki temu łatwiej jest programistom ocenić, czy dana platforma sprosta wymaganiom (np. obsługa grafiki, algorytmów kryptograficznych, routera czy analizy danych w czasie rzeczywistym).

Jednocześnie trzeba pamiętać, że:

  • MIPS to dziś raczej ciekawostka historyczna.
  • DMIPS to uproszczony wskaźnik wydajności, ale nadal nie pokazuje wszystkiego.
  • DMIPS/MHz najlepiej nadaje się do porównań międzyarchitektur, ale też ma ograniczenia – nie powie nam nic o wydajności w specyficznych zadaniach, takich jak AI, multimedia czy I/O.

Podsumowanie

  • MIPS → liczba instrukcji na sekundę (mało precyzyjne).
  • DMIPS → wynik testu Dhrystone, lepsze przybliżenie wydajności ogólnej.
  • DMIPS/MHz → stosunek wydajności do częstotliwości, umożliwia porównanie architektur.

Na Linuksie spotkamy te jednostki głównie w dokumentacjach SoC i procesorów wbudowanych. W praktyce, aby realnie ocenić wydajność systemu, najlepiej uruchomić benchmarki odpowiadające naszym zastosowaniom – np. sysbench, phoronix-test-suite czy własne testy.

Warto dodać, iż współczesne architektury komputerowe posiadają na pokładzie oprócz CPU również GPU i NPU/TPU, czego powyższy artykuł nie wyczerpuje w temacie dokładnych pomiarów wydajności wszystkich komponentów obliczeniowych. W tym art. skupiamy się wyłącznie na procesorze CPU – taka była intencja tego artykułu!

Dla chętnych – w tym repozytorium znajdziecie różne benchmarki oraz przykładowe zestawienia testów.

TUX - maskotka systemu Linux

About the author

Autor "BIELI" to zapalony entuzjasta otwartego oprogramowania, który dzieli się swoją pasją na blogu poznajlinuxa.pl. Jego wpisy są skarbnicą wiedzy na temat Linuxa, programowania oraz najnowszych trendów w świecie technologii. Autor "BIELI" wierzy w siłę społeczności Open Source i zawsze stara się inspirować swoich czytelników do eksplorowania i eksperymentowania z kodem.