BogoMips
BogoMips (från "falsk" och MIPS ) är en grov mätning av CPU-hastighet som görs av Linux-kärnan när den startar för att kalibrera en intern upptaget-loop . En ofta citerad definition av termen är "antalet miljoner gånger per sekund som en processor kan göra absolut ingenting".
BogoMips är ett värde som kan användas för att verifiera om processorn i fråga är i rätt intervall för liknande processorer, dvs BogoMips representerar en processors klockfrekvens såväl som den potentiellt närvarande CPU- cachen . Det är inte användbart för prestandajämförelser mellan olika processorer.
Historia
1993 postade Lars Wirzenius ett Usenet -meddelande som förklarade skälen till dess introduktion i Linux-kärnan på comp.os.linux:
- [...]
- MIPS är en förkortning för Millions of Instructions Per Second. Det är ett mått på beräkningshastigheten för en processor. Liksom de flesta sådana åtgärder missbrukas den oftare än används på rätt sätt (det är mycket svårt att rättvist jämföra MIPS för olika typer av datorer).
- BogoMips är Linus egen uppfinning. Linux-kärnversionen 0.99.11 (daterad 11 juli 1993) behövde en tidsslinga (tiden är för kort och/eller måste vara för exakt för en väntemetod utan upptagen loop), som måste kalibreras till processorn maskinens hastighet. Därför mäter kärnan vid uppstart hur snabbt en viss typ av upptagen loop körs på en dator. "Bogo" kommer från "falsk", dvs något som är falskt. Därför ger BogoMips-värdet en viss indikation på processorhastigheten, men det är alldeles för ovetenskapligt för att kallas något annat än BogoMips.
- Anledningarna (det finns två) att den skrivs ut under uppstart är att a) den är lite användbar för felsökning och för att kontrollera att datorns cacher och turboknapp fungerar, och b) Linus älskar att skratta när han ser förvirrade människor på nyheterna.
- [...]
Korrekt BogoMips-betyg
Som en mycket ungefärlig guide kan BogoMips förberäknas i följande tabell. Det givna betyget är typiskt för den processorn med den då aktuella och tillämpliga Linux- versionen. Indexet är förhållandet mellan "BogoMips per klockhastighet" för vilken CPU som helst till samma för en Intel 386DX CPU, för jämförelseändamål.
Systemet | Betyg | Index |
---|---|---|
Intel 8088 | klocka × 0,004 | 0,02 |
Intel/AMD 386SX | klocka × 0,14 | 0,8 |
Intel/AMD 386DX | klocka × 0,18 | 1 (definition) |
Motorola 68030 | klocka × 0,25 | 1.4 |
Cyrix / IBM 486 | klocka × 0,34 | 1.8 |
Intel Pentium | klocka × 0,40 | 2.2 |
Intel 486 | klocka × 0,50 | 2.8 |
AMD 5x86 | klocka × 0,50 | 2.8 |
MIPS R4000/R4400 | klocka × 0,50 | 2.8 |
ARM9 | klocka × 0,50 | 2.8 |
Motorola 68040 | klocka × 0,67 | 3.7 |
PowerPC 603 | klocka × 0,67 | 3.7 |
Intel StrongARM | klocka × 0,66 | 3.7 |
NexGen Nx586 | klocka × 0,75 | 4.2 |
PowerPC 601 | klocka × 0,84 | 4.7 |
Alpha 21064 /21064A | klocka × 0,99 | 5.5 |
Alpha 21066 /21066A | klocka × 0,99 | 5.5 |
Alpha 21164 /21164A | klocka × 0,99 | 5.5 |
Intel Pentium Pro | klocka × 0,99 | 5.5 |
Cyrix 5x86 / 6x86 | klocka × 1,00 | 5.6 |
Intel Pentium II / III | klocka × 1,00 | 5.6 |
AMD K7/Athlon | klocka × 1,00 | 5.6 |
Intel Celeron | klocka × 1,00 | 5.6 |
Intel Itanium | klocka × 1,00 | 5.6 |
R4600 | klocka × 1,00 | 5.6 |
Hitachi SH-4 | klocka × 1,00 | 5.6 |
Raspberry Pi (modell B) | klocka × 1,00 | 5.6 |
Intel Itanium 2 | klocka × 1,49 | 8.3 |
Alpha 21264 | klocka × 1,99 | 11.1 |
VIA Centaur | klocka × 1,99 | 11.1 |
AMD K5/K6/K6-2/K6-III | klocka × 2,00 | 11.1 |
AMD Duron / Athlon XP | klocka × 2,00 | 11.1 |
AMD Sempron | klocka × 2,00 | 11.1 |
UltraSparc II | klocka × 2,00 | 11.1 |
Intel Pentium MMX | klocka × 2,00 | 11.1 |
Intel Pentium 4 | klocka × 2,00 | 11.1 |
Intel Pentium M | klocka × 2,00 | 11.1 |
Intel Core Duo | klocka × 2,00 | 11.1 |
Intel Core 2 Duo | klocka × 2,00 | 11.1 |
Intel Atom N455 | klocka × 2,00 | 11.1 |
Centaur C6-2 | klocka × 2,00 | 11.1 |
PowerPC 604/604e/750 | klocka × 2,00 | 11.1 |
Intel Pentium III Coppermine | klocka × 2,00 | 11.1 |
Intel Pentium III Xeon | klocka × 2,00 | 11.1 |
Motorola 68060 | klocka × 2,00 | 11.1 |
Intel Xeon MP (32-bitars) ( hypertrådning ) | klocka × 3,97 | 22.1 |
IBM S390 | inte tillräckligt med data (ännu) | |
ÄRM | inte tillräckligt med data (ännu) |
Med 2.2.14 Linux-kärnan flyttades en cachningsinställning för CPU-tillståndet bakifrån till före BogoMips-beräkningen. Även om själva BogoMips-algoritmen inte ändrades, från den kärnan och framåt var BogoMips-betyget för dåvarande Pentium-processorer dubbelt så högt som betyget före ändringen. Det ändrade BogoMips-resultatet hade ingen effekt på verklig processorprestanda. [ citat behövs ]
I Linux kan BogoMips enkelt erhållas genom att söka i cpuinfo -filen:
$ grep -i bogomips /proc/cpuinfo
Beräkning av BogoMIPS
Med kernel 2.6.x implementeras BogoMIPS i /usr/src/linux/init/calibrate.c
kärnkällfilen. Den beräknar värdet för timingparametern för Linux-kärnan loops_per_jiffy
(se jiffy ). Förklaringen från källkoden:
/* * En enkel loop som * while ( jiffies < start_jiffies+1) * start = read_current_timer(); * kommer inte att göra. Eftersom vi inte riktigt vet om jiffy switch * hände först eller om timer_value lästes först. Och någon asynkron * händelse kan inträffa mellan dessa två händelser som introducerar fel i lpj. * * Så, vi gör * 1. pre_start <- När vi är säkra på att jiffy switch inte har hänt * 2. check jiffy switch * 3. start <- timervärde före eller efter jiffy switch * 4. post_start <- När vi är säkra på att jiffy switch har hänt * * Notera att vi inte vet något om ordning 2 och 3. * Nu, genom att titta på skillnaden mellan post_start och pre_start, kan vi * kontrollera om någon asynkron händelse hände eller inte */
loops_per_jiffy
används för att implementera funktionerna udelay
(fördröjning i mikrosekunder) och ndelay (fördröjning i nanosekunder).
Dessa funktioner behövs av vissa drivrutiner för att vänta på hårdvara. Observera att en busy waiting- teknik används, så kärnan blockeras effektivt när ndelay
/ udelay
-funktioner körs. För i386-arkitekturen delay_loop
implementerad i /usr/src/linux/arch/i386/lib/delay.c
som:
/* enkel loop baserad fördröjning: */ 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" ( slingor )); }
motsvarar följande assemblerkod
; ingång: eax = d0 ; output: eax = 0 jmp start .align 16 start: jmp body .align 16 body: decl eax jns body
som kan skrivas om till C-pseudokod
0
static void delay_loop ( long loops ) { long d0 = loops ; gör { -- d0 ; } while ( d0 >= ); }
Fullständig och fullständig information och detaljer om BogoMips, och hundratals referensposter finns i (föråldrade) BogoMips mini-Howto.
Timerbaserade förseningar
Under 2012 bidrog ARM med en ny udelay
-implementering som gjorde att systemtimern som var inbyggd i många ARMv7-processorer kunde användas istället för en upptaget-vänte-loop. Denna implementering släpptes i version 3.6 av Linux-kärnan . Timerbaserade fördröjningar är mer robusta på system som använder frekvensskalning för att dynamiskt justera processorns hastighet under körning, eftersom loops_per_jiffies
-värden inte nödvändigtvis skalas linjärt. Dessutom, eftersom timerfrekvensen är känd i förväg, behövs ingen kalibrering vid uppstart.
En bieffekt av denna förändring är att BogoMIPS-värdet kommer att återspegla timerfrekvensen, inte CPU:ns kärnfrekvens. Normalt är timerfrekvensen mycket lägre än processorns maximala frekvens, och vissa användare kan bli förvånade över att se ett ovanligt lågt BogoMIPS-värde när man jämför med system som använder traditionella busy-wait loopar.