フレンドオペレーティングシステムによるキャッシュ汚染がアプリケーションのパフォーマンスに及ぼす影響を調べたいと思います。
このために私は小さなカスタムベンチマークプログラムを作成しました。システムコールを使用したキャッシュ汚染
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データキャッシュから多くのユーザーデータ行を削除します。どうすればこれを達成できますか?
私は、システムコールがファイル関連またはストリーム関連であると仮定します。
完璧です...私はオープン、書き込み、クローズシステムコールを使用しました。私は各繰り返しの後にファイルに32kの配列を書き込もうとしています。しかし、その効果は驚くべきことでした... l1データキャッシュは、l1命令キャッシュよりも効果が低いことを示していました。何か案は ??私は、コールごとの命令数、コールごとのロード数などを記述した正確な統計を再掲載します。投稿を検討していただきありがとうございます。 –
私の直接の推測では、実際に触れられているのはユーザバッファからの書き込みのみ)、したがって、小さなdキャッシュの影響。私は多くのカーネルデータ構造を操作するシステムコールを探してみます--- 'fork()'のようなものかもしれません(コピーオンライト効果に注意してください)。 – kch
fwriteは通常、ユーザバッファからカーネルバッファが空のときにカーネルバッファをディスクに書き込みます。私の理解はここで正しいのですか?カーネルはユーザバッファからディスクに直接DMAを実行しますか?私はそうは思わない。 –