BogoMips
From Wikipedia, the free encyclopedia
BogoMips (from "bogus" and MIPS) is an unscientific measurement of CPU speed made by the Linux kernel when it boots, to calibrate an internal busy-loop. An oft-quoted definition of the term is "the number of million times per second a processor can do absolutely nothing."
BogoMips can be used to see whether it is in the proper range for the particular processor, its clock frequency, and the potentially present CPU cache. It is not usable for performance comparison between different CPUs.
[edit] Proper BogoMips ratings
As a very approximate guide, the BogoMips can be pre-calculated by the following table. The given rating is typical for that CPU with the then current and applicable Linux version. The index is the ratio of "BogoMips per clock speed" for any CPU to the same for an Intel 386DX CPU, for comparison purposes.
System | Rating | Index |
---|---|---|
Intel 8088 | clock * 0.004 | 0.02 |
Intel/AMD 386SX | clock * 0.14 | 0.8 |
Intel/AMD 386DX | clock * 0.18 | 1 (definition) |
Motorola 68030 | clock * 0.25 | 1.4 |
Cyrix/IBM 486 | clock * 0.34 | 1.8 |
Intel Pentium | clock * 0.40 | 2.2 |
Intel 486 | clock * 0.50 | 2.8 |
AMD 5x86 | clock * 0.50 | 2.8 |
MIPS R4000/R4400 | clock * 0.50 | 2.8 |
ARM9 | clock * 0.50 | 2.8 |
Motorola 8081 | clock * 0.65 | 3.6 |
Motorola 68040 | clock * 0.67 | 3.7 |
PowerPC 603 | clock * 0.67 | 3.7 |
Intel StrongARM | clock * 0.66 | 3.7 |
NexGen Nx586 | clock * 0.75 | 4.2 |
PowerPC 601 | clock * 0.84 | 4.7 |
Alpha 21064/21064A | clock * 0.99 | 5.5 |
Alpha 21066/21066A | clock * 0.99 | 5.5 |
Alpha 21164/21164A | clock * 0.99 | 5.5 |
Intel Pentium Pro | clock * 0.99 | 5.5 |
Cyrix 5x86/6x86 | clock * 1.00 | 5.6 |
Intel Pentium II/III | clock * 1.00 | 5.6 |
AMD K7/Athlon | clock * 1.00 | 5.6 |
Intel Celeron | clock * 1.00 | 5.6 |
Intel Itanium | clock * 1.00 | 5.6 |
MIPS R4600 | clock * 1.00 | 5.6 |
Hitachi SH-4 | clock * 1.00 | 5.6 |
Intel Itanium 2 | clock * 1.49 | 8.3 |
Alpha 21264 | clock * 1.99 | 11.1 |
VIA Centaur | clock * 1.99 | 11.1 |
AMD K5/K6/K6-2/K6-III | clock * 2.00 | 11.1 |
AMD Duron/Athlon XP | clock * 2.00 | 11.1 |
UltraSparc II | clock * 2.00 | 11.1 |
Pentium MMX | clock * 2.00 | 11.1 |
Pentium 4 | clock * 2.00 | 11.1 |
Intel Core Duo | clock * 2.00 | 11.1 |
Intel Core 2 Duo | clock * 2.00 | 11.1 |
Centaur C6-2 | clock * 2.00 | 11.1 |
PowerPC 604/604e/750 | clock * 2.00 | 11.1 |
Intel Pentium III Xeon | clock * 2.00 | 11.1 |
Motorola 68060 | clock * 2.01 | 11.2 |
Intel Xeon MP (32-bit) (hyper-threading) | clock * 3.97 | 22.1 |
IBM S390 | not enough data (yet) | |
Intel ARM | not enough data (yet) |
With the 2.2.14 Linux kernel, a caching setting of the CPU state was moved from behind to before the BogoMips calculation. Although the BogoMips algorithm itself wasn't changed, from that kernel onward the BogoMips rating for then current Pentium CPUs was twice that of the rating before the change. The changed BogoMips outcome had no effect on real processor performance.
[edit] How are BogoMIPS computed?
With current kernel (2.6.x), Bogomips are implemented in /usr/src/linux/init/calibrate.c
kernel source file. It computes loops_per_jiffy
value. Explanation from source code:
/* * A simple loop like * while ( jiffies < start_jiffies+1) * start = read_current_timer(); * will not do. As we don't really know whether jiffy switch * happened first or timer_value was read first. And some asynchronous * event can happen between these two events introducing errors in lpj. * * So, we do * 1. pre_start <- When we are sure that jiffy switch hasn't happened * 2. check jiffy switch * 3. start <- timer value before or after jiffy switch * 4. post_start <- When we are sure that jiffy switch has happened * * Note, we don't know anything about order of 2 and 3. * Now, by looking at post_start and pre_start difference, we can * check whether any asynchronous event happened or not */
loops_per_jiffy
is used to implement udelay
(delay in microseconds) and ndelay
(delay in nanoseconds) functions. These functions are needed by some drivers to wait for hardware. Please note that it's using busy waiting technique so kernel is effectively blocked when executing ndelay/udelay
functions. For i386 architecture delay_loop
is implemented in /usr/src/linux/arch/i386/lib/delay.c
as:
/* simple loop based delay: */ static void delay_loop(unsigned long loops) { int d0; __asm__ __volatile__( "\tjmp 1f\n" ".align 16\n" "1:\tjmp 2f\n" ".align 16\n" "2:\tdecl %0\n\tjns 2b" :"=&a" (d0) :"0" (loops)); }
which can rewritten to C-pseudocode
static void delay_loop(unsigned long loops) { int d0 = loops; do { --d0; } while { do >= 0 } }
Full and complete information and details about BogoMips, and hundreds of reference entries can be found in the (unfortunately outdated) BogoMips mini-Howto below.
[edit] External links
This article was originally based on material from the Free On-line Dictionary of Computing, which is licensed under the GFDL.