BogoMips

BogoMips ("bogus"與MIPS，偽MIPS) 是一種衡量CPU速度的不科學方法。當電腦內核啟動時，將執行一個計數循環。

對於特定的CPU，BogoMips可用來查看它是否個合適的值。它的時鐘頻率和它潛在的CPU緩存。但是它不可在不同的CPU間進行比較演示。

## 合適的BogoMips比率

作為一個參考嚮導，BogoMips可以用下列的表格進行預計算。給出的比率是以應用到LINUX版本的CPU作為例子。指數是指其它CPU同Intel 386DX CPU的BogoMips/clock speed比率.

CPU｜比率｜指數

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

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

AMD Sempron｜clock、2.00｜11.1

UltraSparc II｜clock、2.00｜11.1

Intel Pentium MMX｜clock、2.00｜11.1

Intel Pentium 4｜clock、2.00｜11.1

Intel Pentium M｜clock、2.00｜11.1

Intel Core Duo｜clock、2.00｜11.1

Intel Core 2 Duo｜clock、2.00｜11.1

Intel Atom N455｜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 Coppermine｜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)

ARM｜not enough data (yet)

## BogoMIPS 怎麼計算的?

在當前內核(2.6.x),BogoMIPS實現在內核源文件`/usr/src/linux/init/calibrate.c`。它計算了Linux內核定時參數`loops_per_jiffy` (see ) 值。源碼解釋如下：

```
<nowiki>
 /*
   * 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
   */
</nowiki>
```

`loops_per_jiffy` 用於實現 `udelay`（微秒級延時）和 `ndelay`（納秒級延時）函數。某些驅動程序需要這些函數來等待硬體操作完成。這裡採用了忙等待（busy waiting）方法，所以在執行 `ndelay` 或 `udelay` 函數期間，內核實際上處於阻塞狀態。對於i386結構，`delay_loop` 的實現在 `/usr/src/linux/arch/i386/lib/delay.c` 中，如下所示：

```c
/* 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));
}
```

用C語言重寫的代碼如下：

```c
static void delay_loop(long loops)
{
  long d0 = loops;
  do {
    --d0;
  } while (d0 >= 0);
}
```

關於BogoMips更豐富更全的資訊和數百篇相關文章可參見 BogoMips mini-Howto.

## 外部連結

- BogoMips Mini-Howto, V38