- 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 -