BogoMips

BogoMips (od „fałszywych” i MIPS ) to prymitywny pomiar szybkości procesora dokonywany przez jądro Linuksa podczas uruchamiania w celu kalibracji wewnętrznej pętli zajętości . Często cytowana definicja tego terminu to „liczba milionów razy na sekundę, gdy procesor nie może zrobić absolutnie nic”.

BogoMips to wartość, której można użyć do sprawdzenia, czy dany procesor należy do odpowiedniego zakresu podobnych procesorów, tj. BogoMips reprezentuje częstotliwość zegara procesora, jak również potencjalnie obecną pamięć podręczną procesora . Nie nadaje się do porównywania wydajności różnych procesorów.

Historia

W 1993 roku Lars Wirzenius opublikował wiadomość Usenetu wyjaśniającą powody wprowadzenia go do jądra Linuksa na comp.os.linux:

[...]
MIPS to skrót od Millions of Instructions Per Second (Miliony instrukcji na sekundę). Jest miarą szybkości obliczeniowej procesora. Jak większość tego typu środków, jest on częściej nadużywany niż używany właściwie (bardzo trudno jest sprawiedliwie porównać MIPS dla różnych typów komputerów).
BogoMips to własny wynalazek Linusa . Wersja jądra Linuksa 0.99.11 (datowana na 11 lipca 1993) wymagała pętli czasowej (czas jest za krótki i/lub musi być zbyt dokładny dla metody oczekiwania bez pętli zajętości), którą należy skalibrować do procesora prędkość maszyny. W związku z tym jądro mierzy w czasie rozruchu, jak szybko na komputerze działa określony rodzaj zajętej pętli. „Bogo” pochodzi od „fałszywego”, czyli czegoś, co jest fałszywe. W związku z tym wartość BogoMips daje pewne wskazówki dotyczące szybkości procesora, ale jest zbyt nienaukowa, aby można ją było nazwać inaczej niż BogoMips.
Powody (są dwa) wyświetlania tego komunikatu podczas uruchamiania są następujące: a) jest nieco przydatny do debugowania i sprawdzania, czy pamięć podręczna komputera i przycisk turbo działają, oraz b) Linus uwielbia chichotać, gdy widzi zdezorientowani ludzie w wiadomościach.
[...]

Właściwe oceny BogoMips

Jako bardzo przybliżoną wskazówkę, BogoMips można wstępnie obliczyć na podstawie poniższej tabeli. Podana ocena jest typowa dla tego procesora z aktualną i odpowiednią wersją systemu Linux . Indeks to stosunek „BogoMips na prędkość zegara” dla dowolnego procesora do tego samego dla procesora Intel 386DX, dla celów porównawczych.

System Ocena Indeks
Intel 8088 zegar × 0,004 0,02
Intel/AMD 386SX zegar × 0,14 0,8
Intel/AMD 386DX zegar × 0,18 1 (definicja)
Motorolę 68030 zegar × 0,25 1.4
Cyrix / IBM 486 zegar × 0,34 1.8
Intel Pentium zegar × 0,40 2.2
Intel 486 zegar × 0,50 2.8
AMD5x86 zegar × 0,50 2.8
MIPS R4000/R4400 zegar × 0,50 2.8
ARM9 zegar × 0,50 2.8
Motorola 68040 zegar × 0,67 3.7
Power PC 603 zegar × 0,67 3.7
Intel StrongARM zegar × 0,66 3.7
NexGen Nx586 zegar × 0,75 4.2
Power PC 601 zegar × 0,84 4.7
alfa 21064 /21064A zegar × 0,99 5.5
alfa 21066 /21066A zegar × 0,99 5.5
Alfa 21164 /21164A zegar × 0,99 5.5
Intel Pentium Pro zegar × 0,99 5.5
Cyrix 5x86 / 6x86 zegar × 1.00 5.6
Intel Pentium II / III zegar × 1.00 5.6
AMD K7/Athlon zegar × 1.00 5.6
Intel Celeron zegar × 1.00 5.6
Intel Itanium zegar × 1.00 5.6
4600 R zegar × 1.00 5.6
Hitachi SH-4 zegar × 1.00 5.6
Raspberry Pi (model B) zegar × 1.00 5.6
Intel Itanium 2 zegar × 1,49 8.3
Alfa 21264 zegar × 1,99 11.1
VIA Centaur zegar × 1,99 11.1
AMD K5/K6/K6-2/K6-III zegar × 2.00 11.1
AMD Duron / Athlon XP zegar × 2.00 11.1
AMD Sempron zegar × 2.00 11.1
UltraSparc II zegar × 2.00 11.1
Intel Pentium MMX zegar × 2.00 11.1
Intel Pentium 4 zegar × 2.00 11.1
Intel Pentium M zegar × 2.00 11.1
Intel Core Duo zegar × 2.00 11.1
Intel Core 2 Duo zegar × 2.00 11.1
Intel Atom N455 zegar × 2.00 11.1
Centaur C6-2 zegar × 2.00 11.1
PowerPC 604/604e/750 zegar × 2.00 11.1
Intel Pentium III Coppermine zegar × 2.00 11.1
Intel Pentium Xeon zegar × 2.00 11.1
Motorolę 68060 zegar × 2.00 11.1
Intel Xeon MP (32-bitowy) ( hiperwątkowość ) zegar × 3,97 22.1
IBM S390 za mało danych (jeszcze)
RAMIĘ za mało danych (jeszcze)

W jądrze Linuksa 2.2.14 ustawienie buforowania stanu procesora zostało przeniesione z tyłu na stan przed obliczeniem BogoMips. Chociaż sam algorytm BogoMips nie został zmieniony, począwszy od tego jądra ocena BogoMips dla ówczesnych procesorów Pentium była dwukrotnie wyższa niż przed zmianą. Zmieniony wynik BogoMips nie miał wpływu na rzeczywistą wydajność procesora. [ potrzebne źródło ]

W systemie Linux BogoMips można łatwo uzyskać, przeszukując plik cpuinfo :

 $  grep -i bogomips /proc/cpuinfo 

Obliczanie BogoMIPS

W jądrze 2.6.x BogoMIPS są zaimplementowane w pliku źródłowym jądra /usr/src/linux/init/calibrate.c . Oblicza wartość parametru taktowania jądra Linuksa loops_per_jiffy (patrz jiffy ). Wyjaśnienie z kodu źródłowego:

/* * Prosta pętla jak * while ( jiffies < start_jiffies+1) * start = read_current_timer(); * nie zrobie. Ponieważ tak naprawdę nie wiemy, czy jiffy switch * zdarzyło się jako pierwsze, czy wartość timer_value została odczytana jako pierwsza. Pomiędzy tymi dwoma zdarzeniami może wystąpić jakieś asynchroniczne * zdarzenie wprowadzające błędy w lpj. * * Więc robimy * 1. pre_start <- Gdy jesteśmy pewni, że przełączenie jiffy nie nastąpiło * 2. sprawdź przełączenie jiffy * 3. start <- wartość timera przed lub po przełączeniu jiffy * 4. post_start <- Kiedy jesteśmy pewni, że nastąpiło przełączenie jiffy * * Uwaga, nie wiemy nic o kolejności 2 i 3. * Teraz, patrząc na różnicę post_start i pre_start, możemy * sprawdzić, czy wystąpiło jakieś zdarzenie asynchroniczne, czy nie */

loops_per_jiffy służy do implementacji funkcji udelay (opóźnienie w mikrosekundach) i ndelay (opóźnienie w nanosekundach). Te funkcje są potrzebne niektórym sterownikom, aby czekać na sprzęt. Należy zauważyć, że oczekiwania zajętości , więc jądro jest skutecznie blokowane podczas wykonywania funkcji ndlay / udelay . Dla architektury i386 pętla_opóźnienia jest zaimplementowana w /usr/src/linux/arch/i386/lib/delay.c jako:


    

   

   
    
    
    
    
    
     
     
 /* proste opóźnienie oparte na pętli: */  static  void  delay_loop  (  unsigned  long  loops  )  {  int  d0  ;  __asm__  __volatile__  (  "  \t  jmp 1f  \n  "  ".align 16  \n  "  "1:  \t  jmp 2f  \n  "  ".align 16  \n  "  "2:  \t  decl %0  \n\t  jns 2b"  :  "=&a"  (  d0  )  :  "0"  (  pętle  ));  } 

odpowiednik następującego kodu asemblera



         
 
   
 
   
          ; wejście: eax = d0   ; wyjście: eax = 0   jmp  start  .align  16  start:  jmp  body  .align  16  body:  decl  eax  jns  body 

który można przepisać na C-pseudokod

   

     
   
    
      0
 static  void  delay_loop  (  długie  pętle  )  {  długie  d0  =  pętle  ;  zrób  {  --  d0  ;  }  podczas gdy  (  d0  >=  );  } 

Pełne i kompletne informacje i szczegóły dotyczące BogoMips oraz setki wpisów referencyjnych można znaleźć w (nieaktualnym) mini-Howto BogoMips.

Opóźnienia oparte na timerze

W 2012 roku firma ARM wniosła nową implementację udelay , umożliwiającą użycie zegara systemowego wbudowanego w wiele procesorów ARMv7 zamiast pętli zajętości oczekiwania. Ta implementacja została wydana w wersji 3.6 jądra Linuksa . Opóźnienia oparte na zegarze są bardziej niezawodne w systemach, które wykorzystują skalowanie częstotliwości do dynamicznego dostosowywania szybkości procesora w czasie wykonywania, ponieważ wartości loops_per_jiffies niekoniecznie muszą skalować się liniowo. Ponadto, ponieważ częstotliwość zegara jest znana z góry, nie jest wymagana kalibracja podczas uruchamiania.

Jednym z efektów ubocznych tej zmiany jest to, że wartość BogoMIPS będzie odzwierciedlać częstotliwość zegara, a nie częstotliwość rdzenia procesora. Zwykle częstotliwość zegara jest znacznie niższa niż maksymalna częstotliwość procesora, a niektórzy użytkownicy mogą być zaskoczeni, widząc niezwykle niską wartość BogoMIPS w porównaniu z systemami wykorzystującymi tradycyjne pętle zajętości oczekiwania.

Zobacz też

Linki zewnętrzne