BogoMips

BogoMips（"bogus"=「いんちきの」+ MIPS）とは、Linuxカーネルのブート時にCPU速度をビジーループを使って非科学的に測定した結果である。その定義としてよく言われるのは「プロセッサが全く無駄な処理を1秒間に何百万回できるか」である。
BogoMipsは、あるプロセッサがクロック周波数やキャッシュの有無から見て妥当な性能を示しているかを判断するのに使える。異なる種類のCPU間での性能比較には使えない。
歴史.
1993年、ラルス・ビルゼニウスが comp.os.linux にLinuxカーネルにBogoMipsが導入された理由を次のように投稿している。
MIPSは Millions of Instructions Per Second（百万命令毎秒）の略だ。プロセッサの速度を求める手段である。そのような測定法の多くと同様、適切に利用されるより乱用されることが多い（異機種のコンピュータ間でMIPS値を正しく比較するのは非常に難しい）。
BogoMipsはリーナス自身の発案である。Linuxカーネル 0.99.11（1993年7月11日）はタイミングループを必要としていた（待ち時間が非常に短いのでループする以外のウェイト手段を採用できなかった）。タイミングループはプロセッサの処理速度の違いを較正しなければならない。そこでカーネルでブート時にビジーループを実際に回してみて、そのコンピュータがどの程度の速度かを測定することにした。"Bogo" は "bogus"（いんちきの）に由来し、それが一種のごまかしであることを意味している。BogoMipsの値はプロセッサ速度の一種の指標を与えるが、あまりにも非科学的なので BogoMips 以外に呼び様がない。
ブート時にその値を表示する理由は2つある。第一にそのコンピュータのキャッシュや加速手段が正しく機能しているかをチェックするのに使える。第二にリーナスはこのニュースを聞いて混乱している人々を見かけたときにくすくす笑うのが大好きである。
BogoMipsの正しい比較.
非常に大まかではあるが、BogoMipsの相対値を計算する式を以下の表で示す。この相対値は各CPUが使用されていた当時のLinuxでのBogoMips値に基づくものである。clock は、そのCPUのクロック周波数。インデックスは、クロック周波数当たりの BogoMips の係数が Intel 386DX と同じCPUを1とした相対値である。
BogoMipsの詳細な情報と数百の測定値が BogoMips Mimi-Howto にある。
Linuxカーネル 2.2.14 以降、キャッシュの設定がBogoMipsの計算前に行われるようになった。BogoMipsの計算方法は変わっていないので、当時の Pentium 系CPU以降ではBogoMips値が約2倍になっている。このBogoMips値の変化は実際のプロセッサ性能には何の効果もない。
BogoMIPSの計算.
Linuxカーネル (2.6.x) での BogoMips は codice_1 というソースファイルで実装されている。Linuxカーネルが使用するタイミングパラメータ codice_2 （Jiffy についてはジフィを参照）を計算で求めている。まず、ソースコードのコメントを示す。
codice_2 はcodice_4関数（μ秒単位の遅延）とcodice_5関数（ナノ秒単位の遅延）の実装で使われている。これらの関数は一部のドライバがハードウェアを待つのに必要としている。これらはビジーウェイトを採用しているので、使用するとカーネルは実質的にブロックされる。i386アーキテクチャの場合 codice_6 にて codice_7 が次のように実装されている。
/* 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の擬似コードで書き直すと、次のようになる。
static void delay_loop(long loops)
 long d0 = loops;
 do {
 --d0;
 } while (d0 >= 0);
BogoMipsのさらなる詳細と（ほとんどが古いが）数百のBogoMips値が BogoMips mini-Howto にある。