- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny Listopad 1997

39.94 BogoMIPS ?

Pavel Janík ml, 27. října 1997

Co jsou to BogoMIPS? MIPS je zkratka "Millions of Instructions Per Second". Je to míra "rychlosti" procesoru (Lars Wirzenius napsal v BogoMIPS mini-HOWTO, že jde o "computation speed of program", tedy o výpočetní rychlost programu, což není pravda.) Vydělíme-li hodnotu, kterou nám test BogoMIPS poskytl, číslem 2, dostaneme číslo udávající kolik miliónů prázdných smyček dokáže náš procesor provést během jedné sekundy.

Stejně jako mnoho jiných "benchmarků" jsou i BogoMIPS velmi často interpretovány špatně. Je velmi obtížné porovnávat např. procesory i386 s procesory Sparc apod.

BogoMIPS jsou Linusovým nápadem. Kernel (nebo spíše jeho ovladače zařízení) potřebují ke své činnosti časovací smyčku, která je závislá na rychlosti procesoru. Proto kernel vždy na začátku své činnosti (při bootování) změří, jak "rychle" proběhne prázdná smyčka a tuto hodnotu si uloží do proměnné loops_per_sec. Tuto proměnnou potom používají některé ovladače zařízení pro své časovací smyčky a hlavně pro čekání. Např. funkce, která čeká zadaný počet milisekund je řešena v ovladači multiportové karty Digiboard v souboru drivers/char/pcxx.c takto:

static void pcxxdelay(int msec)
{
        while(msec- > 0)
                __delay(loops_per_sec/1000);
}

Bogo pochází z americké angličtiny z výrazu "bogus", což znamená falešný, nepravý. Proto by nebylo správné interpretovat BogoMIPS jinak, než je výše uvedeno.

Existují prý dva důvody, proč jsou BogoMIPS vypisovány při každém bootování Linuxu:

  1. podle BogoMIPS poznáme, zda náhodou nemáme omylem stisknuto tlačítko TURBO
  2. Linus se rád baví nad příspěvky zmatených lidí v newsech

BogoMIPS jsou počítány jednoduchým algoritmem, který je v souboru init/main.c. Tento algoritmus používá funkci delay, která je napsána v assembleru a proto ji najdete v souboru include/asm/delay.h.

Zdrojový text z výpisu BogoMIPS pro i386 Linux by po kompilaci libovolným ANSI-C kompatibilním kompilerem měl dělat totéž, co jádro Linuxu při bootování. Je v něm použito algoritmů ze zdrojových textů jádra (© Linus Torvalds, 1991 - 3). Po spuštění se vypíše např.:

Calibrating delay loop.. ok - 39.94 BogoMIPS

Samozřejmě tento program nemůže dát stejné výsledky jako jádro, protože soutěží s ostatními uživatelskými procesy o čas procesoru.


 #include <stdio.h>
 #include <time.h> /* CLOCKS_PER_SEC*/
 #include <asm/param.h> /* HZ */

 static __inline__ void
        __delay(int loops)
 {
    __asm__ volatile (
       ".align 2,0x90
       1:	decl %0
       		jns 1b":
       :"a" (loops)
       :"ax");
 }
 void main()
 {
    unsigned long ticks, loops_per_sec = 1;
    printf("Calibrating delay loop.. ");
    fflush(stdout);
    while ((loops_per_sec <<= 1))
    {
       ticks = clock();
       while (ticks == clock())
          ;
       ticks = clock();
       __delay(loops_per_sec);
       ticks = clock() - ticks;
       if (ticks >= CLOCKS_PER_SEC)
       {
         loops_per_sec = (loops_per_sec /
                          ticks) * HZ;
         printf("ok - %lu.%02lu BogoMIPS\n",
         loops_per_sec/500000,
         (loops_per_sec/5000) % 100);
 	 return;
       }
    }
    printf("failed\n");
 }

Výpis 1: BogoMIPS pro i386 Linux


 #include <stdio.h>
 #include <time.h>
 #include <asm/param.h>

 static __inline__ void
        __delay(unsigned long loops)
 {
 	__asm__ __volatile__("cmp %0, 0\n\t"
 			     "1: bne 1b\n\t"
 			     "subcc %0, 1, %0\n" :
 			     "=&r" (loops) :
 			     "0" (loops));
 }

 void main()
 {
    unsigned long ticks, loops_per_sec = 1;

    printf("Calibrating delay loop.. ");
    fflush(stdout);

    while ((loops_per_sec <<= 1))
    {
       ticks = clock();
       while (ticks == clock())
 	 ;
       ticks = clock();
       __delay(loops_per_sec);
       ticks = clock() - ticks;
       if (ticks >= CLOCKS_PER_SEC)
       {
 	 loops_per_sec = (loops_per_sec /
                           ticks) * HZ;
 	 printf("ok - %lu.%02lu BogoMIPS\n",
 	    loops_per_sec/500000,
 	    (loops_per_sec/5000) % 100);
 	 return;
       }
    }
    printf("failed\n");
 }

Výpis 2: BogoMIPS pro Sparc Linux

Zajímavé by mohlo být porovnání výsledků na stejném počítači pod Linuxem a pod MS-DOSem, ale jak jsem již napsal, BogoMIPS primárně neslouží k porovnávání rychlosti počítačů ani operačních systémů.

Viz tabulka Orientační hodnoty BogoMIPS.

Typ procesoruBogoMIPS
386SX/162.05 - 2.49
386SX/202.70
386SX/252.90 - 3.71
386SX/334.06 - 4.71
386SX/406.03
386DX/162.49
386DX/203.00 - 3.67
386DX/253.91 - 4.53
386DX/335.86 - 6.70
386DX/406.99 - 8.06
486SX/209.98
486SX/2512.24 - 12.52
486DX/3316.33 - 16.77
486DX/4019.80 - 20.09
486DX/5024.48 - 25.40
486DX2/6632.00 - 34.06
486DX4/7537.47
486DX2/8039.93 - 40.18
486DX2/10049.14 - 50.66
486DX4/12059.1 - 60.45
5x86/13366.15 - 67.10
5x86/15074.75
5x86/16079.87 - 80.36
Pentium/6023.00 - 24.13
Pentium/6625.00 - 26.84
Pentium/7529.50 - 30.22
Pentium/9032.73 - 36.90
Pentium/10039.52 - 40.18
Pentium/12047.80 - 49.27
Pentium/13353.04 - 53.68
Pentium/15059.80 - 60.21
Pentium/16666.16 - 67.10
SMP Pentium/9071.98 - 72.08
SMP Pentium Pro/200398.6 - 398.98
Pentium Pro/133132.88
Pentium Pro/180179.61
Pentium Pro/200197.42 - 200.32

Tabulka 1: Orientační hodnoty BogoMIPS

*


- předchozí článek - následující článek - obsah - úvodní stránka -