BogoMIPSの計算
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/02 08:53 UTC 版)
「BogoMips」の記事における「BogoMIPSの計算」の解説
Linuxカーネル (2.6.x) での BogoMips は /usr/src/linux/init/calibrate.c というソースファイルで実装されている。Linuxカーネルが使用するタイミングパラメータ loops_per_jiffy (Jiffy についてはジフィを参照)を計算で求めている。まず、ソースコードのコメントを示す。 /* * 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 はudelay関数(μ秒単位の遅延)とndelay関数(ナノ秒単位の遅延)の実装で使われている。これらの関数は一部のドライバがハードウェアを待つのに必要としている。これらはビジーウェイトを採用しているので、使用するとカーネルは実質的にブロックされる。i386アーキテクチャの場合 /usr/src/linux/arch/i386/lib/delay.c にて delay_loop が次のように実装されている。 /* 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 にある。
※この「BogoMIPSの計算」の解説は、「BogoMips」の解説の一部です。
「BogoMIPSの計算」を含む「BogoMips」の記事については、「BogoMips」の概要を参照ください。
- BogoMIPSの計算のページへのリンク