2

QEMU を使用する Marss cycle-accurate シミュレーターを使用しています。これは完全なシステム シミュレータであり、ユーザーとカーネルの両方の統計情報を提供します。ただし、ユーザー統計のみを取得したとしても、統計は実行ごとに大きく異なります。marss サイトでこの質問をしましたが、良い回答が得られませんでした。それがqemuと関係があるのだろうかと思っていました。または、シミュレーションを決定論的にすることができるqemuオプション/バリエーション。-icount auto を使用してみましたが、まだいくつかのバリエーションがあります。単純なスカラーの eio ファイルでは、変化を観察したことはありません。助けていただければ幸いです。

4

2 に答える 2

3

私はMARSS/QEMUを使用していませんが、この問題、一般的なシミュレーター、およびSimpleScalarに精通しています。

一般に、完全なシステムシミュレータを決定論的にすることは非常に困難です。たとえば、プログラムが時刻を出力し、時刻が変更された場合、異なるコードパスがたどられます。より一般的には、完全なシステムシミュレーションと時間lsを実行している場合、OSとユーザーコードの正確なインターリーブは、ディスクヘッドの位置、ディスクキャッシュにあるデータの量などに基づいて異なります。他のプロセスがシステムで実行されています。

SimpleScalar eio(および業界のシミュレーター)は、外部I / Oイベントのトレースを記録して、以前の実行とまったく同じ命令数でシミュレーションに適用することにより、決定論を提供します。基本的に、記録するときは完全なシステムシミュレーションのみを実行します

MARSS/QEMUの同様のオプションを探す必要があります。残念ながら、私はそのようなものを見つけていません。

これらが欠けている...

しかし、「私のプログラムは時刻を読み取らない。毎回まったく同じように実行するべきではないか」と言うのを聞くことができます。多分そうです...しかし(1)多くのLinuxライブラリは、時間を読むことと道徳的に同等です。(2)ユーザーコードを実行している他のプロセスがあります。

したがって、実行を制御する必要があります。仮想マシン(ハードウェア仮想マシンではなく、シミュレータで実行しているOSのみを意味します)を完全に起動しないでください。シングルユーザーで停止します。/ etc / rcを編集して、実行中のプロセスをできるだけ多く停止します。フルシステムシミュレーションは、実際のマシンでのベンチマークと同じです。また、実際のマシンでは、ベンチマークを実行するたびにマシンを再起動することもあります。(仮想)ネットワークを無効にします。等。

可能であれば、実際のOSではなく、最小限のモニターで実行してください。

ただし、I/Oトレース再生機能を見つけるのが本当に最善です。これらはデバッガオプションの下に隠れることがあります。


これは、2008年にqemuでのI/Oリプレイのパッチについて説明している参考文献です。

http://wiki.qemu.org/Features/FaultTolerance-信頼性/フォールトトレランスのためにI/Oリプレイを実行します。

QEMUユーザースペースエミュレーションの方が再現性が高い場合があります。MARSSと連動するかどうかわかりません


ちなみに、再現性の問題はシミュレーターだけに関係するものではありません。また、信頼性とデバッグにも関連しています。

QEMU/MARSS上でシステムの再現性を高めるために使用できる汎用のLinux再生機能を見つけることができる場合があります。


MARSS内では、ptlcallチェックポイント機能を使用して、ベンチマーク(SPECなどを実行していると仮定)が多くの初期I / Oを実行した直後、および次のIOの前にチェックポイントを取得できる場合があります。ベンチマークは、多くの初期I / Oを実行し、しばらくの間ユーザーコードで実行してから、最終I/Oを実行します。これらのチェックポイントを使用することにより、時変システムコールを回避できる場合があります。

同様にSimpoints、http://www.marss86.org/~marss86/index.php/Simpoints


ちなみに、プログラムが非決定論的である可能性がある別の方法を思い出しました(誤って時間に依存したり、マルチプロセッサの相互作用を除いて):明示的かつ本質的に時間に依存する可能性があります。

たとえば、リバモアループのベンチマークのlanger98バージョンは、ループにかかった時間を掛け、十分な時間が費やされていない場合は、ループ数を増やします。ここで時間やシステムコールなどの外部インタラクションを記録でき、プログラムの再現性が向上する可能性がありますが、新しい、より高速なコンピューターで何が行われるかを正確に測定することはできません。

逆に、「この非常に高価な最適化を2時間以内に適用してから、停止する...」という形式のコンパイラ最適化スイッチがあるとします。

于 2012-05-02T01:50:09.523 に答える