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.