2012-04-20 16 views
3

フレンドオペレーティングシステムによるキャッシュ汚染がアプリケーションのパフォーマンスに及ぼす影響を調べたいと思います。
このために私は小さなカスタムベンチマークプログラムを作成しました。システムコールを使用したキャッシュ汚染

1. malloc an array of size = l1 data cache-size 
2. repeat ... sweep this array from start to end (hit-rate = 1.0) 
3. *** perform a system call that thrashes l1 data cache *** 
4. sweep the array once again (expected hit-rate = ~0.7 ---> 1.0) 

アルゴリズムのステップ2は、完全な配列を繰り返し読み取ります。うまくいけば、配列はキャッシュに残り、ヒット率は1になります。

私はシステムコールを実行した後、もう一度キャッシュを読み込もうとします。しかし、私は、OSがユーザに属するいくつかのキャッシュラインを退去したと仮定します。

ご覧のとおり、プログラムはシステムコールを使用して、l1データキャッシュから多くのユーザーデータ行を削除します。どうすればこれを達成できますか?

私は、システムコールがファイル関連またはストリーム関連であると仮定します。

答えて

1

L1キャッシュへの影響は、システムコールによって異なります。 1つの方法は、いくつかの異なるシステムコールをループし、それぞれの影響を測定することである(例えば、バッファのサイズを変えることができるwrite()などのI/O関連コールを含む)。

のvsyscalls(例:gettimeofday())のようなシステムコールは、カーネルスペースに切り替える必要がないため、システムコールを避けることをお勧めします。 [1,2]を参照してください。

L1dでエフェクトを分離したいと思うように聞こえるかもしれません。もう1つ注意する必要があることは次のとおりです。ステップ2で、アレイをループした後、L1iキャッシュにデータが読み込まれます。システムコールが完了すると、L1i の両方が汚染されている可能性があります。そのため、iキャッシュミスのパフォーマンス上の影響もあります。

詳細な測定結果を得るには、アーキテクチャに応じてハードウェアパフォーマンスカウンタを使用することができます。

+0

完璧です...私はオープン、書き込み、クローズシステムコールを使用しました。私は各繰り返しの後にファイルに32kの配列を書き込もうとしています。しかし、その効果は驚くべきことでした... l1データキャッシュは、l1命令キャッシュよりも効果が低いことを示していました。何か案は ??私は、コールごとの命令数、コールごとのロード数などを記述した正確な統計を再掲載します。投稿を検討していただきありがとうございます。 –

+0

私の直接の推測では、実際に触れられているのはユーザバッファからの書き込みのみ)、したがって、小さなdキャッシュの影響。私は多くのカーネルデータ構造を操作するシステムコールを探してみます--- 'fork()'のようなものかもしれません(コピーオンライト効果に注意してください)。 – kch

+0

fwriteは通常、ユーザバッファからカーネルバッファが空のときにカーネルバッファをディスクに書き込みます。私の理解はここで正しいのですか?カーネルはユーザバッファからディスクに直接DMAを実行しますか?私はそうは思わない。 –

関連する問題