BogoMipsBogoMips("bogus"=「いんちきの」+ MIPS)とは、Linuxカーネルのブート時にCPU速度をビジーループを使って非科学的に測定した結果である[1]。その定義としてよく言われるのは「プロセッサが全く無駄な処理を1秒間に何百万回できるか」である[2][3]。 BogoMipsは、あるプロセッサがクロック周波数やキャッシュの有無から見て妥当な性能を示しているかを判断するのに使える。異なる種類のCPU間での性能比較には使えない[4][5]。 歴史1993年、ラルス・ビルゼニウスが comp.os.linux にLinuxカーネルにBogoMipsが導入された理由を次のように投稿している[6]。
BogoMipsの正しい比較非常に大まかではあるが、BogoMipsの相対値を計算する式を以下の表で示す。この相対値は各CPUが使用されていた当時のLinuxでのBogoMips値に基づくものである。clock は、そのCPUのクロック周波数。インデックスは、クロック周波数当たりの BogoMips の係数が Intel 386DX と同じCPUを1とした相対値である[7]。
BogoMipsの詳細な情報と数百の測定値が BogoMips Mimi-Howto にある。 Linuxカーネル 2.2.14 以降、キャッシュの設定がBogoMipsの計算前に行われるようになった。BogoMipsの計算方法は変わっていないので、当時の Pentium 系CPU以降ではBogoMips値が約2倍になっている。このBogoMips値の変化は実際のプロセッサ性能には何の効果もない。 BogoMIPSの計算Linuxカーネル (2.6.x) での BogoMips は /* * 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 */
/* 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[4] にある。 脚注
外部リンクこの記事は2008年11月1日以前にFree On-line Dictionary of Computingから取得した項目の資料を元に、GFDL バージョン1.3以降の「RELICENSING」(再ライセンス) 条件に基づいて組み込まれている。 |