BogoMips (「bogus」とMIPS を組み合わせた造語)は、Linux カーネルが起動時に内部のビジー ループを補正するために行うCPU 速度の大まかな測定値です。[1]この用語のよく引用される定義は、「プロセッサが 1 秒間にまったく何もできない回数の百万倍数」です。[2] [3]
BogoMipsは、問題のプロセッサが類似プロセッサの適切な範囲内にあるかどうかを確認するために使用できる値です。つまり、BogoMipsはプロセッサのクロック周波数と、存在する可能性のあるCPUキャッシュを表します。異なるCPU間のパフォーマンス比較には使用できません。[4]
歴史
1993年、Lars Wirzeniusはcomp.os.linuxにLinuxカーネルに導入された理由を説明する Usenetメッセージ[5]を投稿しました。
- [...]
- MIPS は Millions of Instructions Per Second (1 秒あたりの命令数百万) の略です。プロセッサの計算速度の尺度です。他の多くの尺度と同様に、適切に使用されるよりも乱用されることが多いです (異なる種類のコンピュータの MIPS を公平に比較するのは非常に困難です)。
- BogoMips はLinus自身の発明です。Linux カーネル バージョン 0.99.11 (1993 年 7 月 11 日) では、タイミング ループ (非ビジー ループの待機方法では時間が短すぎる、または正確すぎる必要がある) が必要でした。このループは、マシンのプロセッサ速度に合わせて調整する必要がありました。そのため、カーネルは起動時に、コンピュータ上で特定の種類のビジー ループがどのくらい速く実行されるかを測定します。"Bogo" は "bogus" (偽物) から来ています。したがって、BogoMips 値はプロセッサ速度の指標となりますが、BogoMips 以外の名前で呼ぶには非科学的すぎます。
- 起動時にこれが印刷される理由 (2 つあります) は、a) デバッグやコンピュータのキャッシュとターボ ボタンの動作確認に多少役立つこと、b) Linus がニュースで混乱している人々を見るとくすくす笑うのが大好きだからです。
- [...]
適切なBogoMips評価
非常におおよその目安として、BogoMips は次の表で事前に計算できます。この表は、その時点で最新のLinuxバージョンでそのCPUに適用される標準的な値です。この指標は、比較のために、任意の CPU の「クロック速度あたりの BogoMips」と Intel 386DX CPU の「クロック速度あたりの BogoMips」の比率を示しています。[6] [7]
Linux カーネル 2.2.14 では、 CPU 状態のキャッシュ設定が BogoMips 計算の後ろから前へ移動されました。BogoMips アルゴリズム自体は変更されていませんが、このカーネル以降、当時の Pentium CPU の BogoMips 評価は変更前の 2 倍になりました。変更された BogoMips の結果は、実際のプロセッサ パフォーマンスには影響しませんでした。[引用が必要]
シェルでは、BogoMipsはcpuinfoファイルを検索することで簡単に取得できます: [7]
$ grep -i bogomips /proc/cpuinfo
BogoMipsの計算
カーネル 2.6.x では、BogoMips は/usr/src/linux/init/calibrate.cカーネル ソース ファイルに実装されています。これは、Linux カーネルのタイミング パラメータloops_per_jiffy( jiffyを参照) 値を計算します。ソース コードからの説明:
/* * 次のような単純なループ * while (jiffies < start_jiffies+1) の場合 * 開始 = read_current_timer(); *はダメです。Jiffy Switchが * が最初に発生したか、timer_valueが最初に読み取られました。また、非同期 * イベントはこれら 2 つのイベントの間に発生する可能性があり、lpj にエラーが発生します。 * * だから私たちは * 1. pre_start <- jiffyスイッチが発生していないことが確実な場合 * 2. ジフィースイッチを確認する * 3. start <- jiffyスイッチの前または後のタイマー値 * 4. post_start <- jiffyスイッチが確実に実行されたとき * * 注意: 2 と 3 の順序については何もわかりません。 * さて、post_startとpre_startの違いを見ると、 * 非同期イベントが発生したかどうかを確認します */
loops_per_jiffyudelay(マイクロ秒単位の遅延) および(ナノ秒単位の遅延) 関数を実装するために使用されますndelay。これらの関数は、一部のドライバがハードウェアを待機するために必要です。ビジー待機ndelayテクニックが使用されるため、 /関数の実行時にカーネルが効果的にブロックされることに注意してくださいudelay。i386 アーキテクチャでは、次のようdelay_loopに実装されます/usr/src/linux/arch/i386/lib/delay.c。
/* 単純なループベースの遅延: */
static void delay_loop ( unsigned long loops ) { int d0 ;
__asm__ __volatile__ ( " \t jmp 1f \n " ".align 16 \n " "1: \t jmp 2f \n " ".align 16 \n " "2: \t decl %0 \n\t jns 2b" : "=&a" ( d0 ) : "0" (ループ)); }
次のアセンブラコードと同等
; 入力: eax = d0
; 出力: eax = 0
jmp start .align 16 start: jmp body .align 16 body: decl eax jns body
C疑似コードに書き直すことができる
static void delay_loop ( long loops ) { long d0 = loops ; do { -- d0 ; } while ( d0 >= 0 ); }
BogoMips に関する完全な情報と詳細、および数百の参考エントリは、(古い) BogoMips mini-Howto に記載されています。[4]
タイマーベースの遅延
2012年、ARMは、udelayビジーウェイトループの代わりに、多くのARMv7 CPUに組み込まれているシステムタイマーを使用できるようにする新しい実装を提供しました。この実装は、 Linuxカーネルのバージョン3.6でリリースされました。[8]タイマーベースの遅延は、値が必ずしも線形にスケーリングされるとは限らないため、実行時にプロセッサの速度を動的に調整するために周波数スケーリングをloops_per_jiffies使用するシステムではより堅牢です。また、タイマー周波数は事前にわかっているため、起動時に調整する必要はありません。
この変更による副作用の 1 つは、BogoMIPS 値が CPU のコア周波数ではなくタイマー周波数を反映することです。通常、タイマー周波数はプロセッサの最大周波数よりもはるかに低いため、従来のビジー ウェイト ループを使用するシステムと比較すると、BogoMIPS 値が異常に低いことに驚くユーザーもいるかもしれません。
参照
参考文献
- ^ ヴァン・ドースト、ヴィム (1996 年 1 月)。 「典型的な Linux ベンチマーク」。Linux ジャーナル。2008 年 8 月 22 日に取得。
- ^ Eric S Raymondと Geoff Mackenzie が1990 年代初頭にインターネット上で公開したもので、出典は不明です。
- ^ レイモンド、エリック S.「ハッカー専門用語ファイル」。
- ^ ab Van Dorst、Wim (2006 年 3 月 2 日)。 「BogoMips Mini-Howto」 (V38 版) 。2008 年 8 月 22 日に取得。
- ^ Wirzenius, Lars. 「Re: 印刷と BogoMips」。
- ^ Bekman, Stas. 「BogoMip とは何か?」
- ^ ab "BogoMips mini-Howto"。
- ^ Deacon, Will. 「ARM: 7452/1: delay: タイマーベースの遅延実装を選択できるようにする」
外部リンク
- BogoMips ミニハウツー、V38
- 古典的なスタンドアロンベンチマークのソース
