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.

Se även

externa länkar