50

WindowsでCPUキャッシュフラッシュを強制することに興味があります(ベンチマークの理由から、CPUキャッシュにデータがない状態でエミュレートしたい)、できれば基本的なC実装またはWin32呼び出し。

システムコールでこれを行う既知の方法はありmemcpyますか?

Intel i686 プラットフォーム (P4 以降でも問題ありません)。

4

4 に答える 4

55

幸いなことに、キャッシュを明示的にフラッシュする方法は複数あります。

命令「wbinvd」は、変更されたキャッシュ コンテンツを書き戻し、キャッシュを空としてマークします。バスサイクルを実行して、外部キャッシュにデータをフラッシュさせます。残念ながら、それは特権的な命令です。しかし、DOS などでテスト プログラムを実行できる場合は、この方法を使用することをお勧めします。これには、「OS」のキャッシュ フットプリントを非常に小さく保つという利点があります。

さらに、キャッシュをメインメモリにフラッシュバックせずに無効化する「invd」命令があります。これはメイン メモリとキャッシュの一貫性に違反するため、自分で処理する必要があります。あまりお勧めしません。

ベンチマーク目的での最も簡単な解決策は、WB ではなく WC (書き込み結合) でマークされた領域に大きなメモリ ブロックをコピーすることでしょう。グラフィック カードのメモリ マップ領域が適切な候補です。または、MTRR レジスタを使用して自分で領域を WC としてマークすることもできます。

クロック サイクルとパフォーマンスの監視を測定するためのテスト プログラムで、短いルーチンのベンチマークに関するリソースを見つけることができます。

于 2009-11-18T16:20:52.187 に答える
9

CPUに特定のキャッシュライン( CLFLUSHなど)を強制的にフラッシュさせるx86アセンブリ命令がありますが、それらはかなりあいまいです。特にCLFLUSHは、すべてのレベルのキャッシュ(L1、L2、L3)から選択されたアドレスのみをフラッシュします。

大きなmemcopyと言うのと同じくらい卑劣な何か?

はい、これは最も簡単なアプローチであり、CPUがすべてのレベルのキャッシュを確実にフラッシュします。ベンチメーカーからキャッシュフラッシュ時間を除外するだけで、キャッシュプレッシャーの下でプログラムがどのように実行されるかを知ることができます。

于 2009-11-18T15:43:25.663 に答える
2

残念ながら、キャッシュを明示的にフラッシュする方法はありません。オプションのいくつかは次のとおりです。

1.) ベンチマークしているコードの繰り返しの間に非常に大きなメモリ操作を実行して、キャッシュをスラッシュします。

2.) x86 Control Registersで Cache Disable を有効にし、それをベンチマークします。これにより、おそらく命令キャッシュも無効になりますが、これは望ましくない場合があります。

3.) Non-Temporal instructionsを使用して、コードの一部をベンチマーク (可能であれば) 実装します。ただし、これらはキャッシュの使用に関するプロセッサへのヒントにすぎませんが、プロセッサは必要なことを自由に行うことができます。

1 がおそらく最も簡単で、目的には十分です。

編集:おっと、x86キャッシュを無効にする命令があることを修正しました。drhirschの回答を参照してください

于 2009-11-18T15:50:57.237 に答える