0

いくつかの正確な測定のために、コマンド ラインから RAM (メイン メモリ) までのすべてのキャッシュを無効化/フラッシュしたいと思います (メイン プログラムの実行時間の評価がこのプロセスの影響を受けないようにするため)。私は以下を見つけました(ここからの最初と最後):

1. echo 3 > /proc/sys/vm/drop_caches

そして、次のように(事前に実行された)プログラムを構築できました

2. #include <asm/cachectl.h>
int cacheflush(char *addr, int nbytes, int cache);

または私は最終的に行うことができます

3. int main() {
     const int size = 20*1024*1024; // Allocate 20M. Set much larger then L2
     char *c = (char *)malloc(size);
     for (int i = 0; i < 0xffff; i++)
       for (int j = 0; j < size; j++)
         c[j] = i*j;
 }

私の質問は次のとおりです。私がする必要があること、どのバージョンが最適か、そしてそれが #2 の場合、開始アドレスとして与えるべきアドレスは何ですか? 私uname -aは Linux 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:19:45 UTC 2012 i686 です

4

1 に答える 1

3

あなたは、背後で他のことを行うオペレーティング システム上で実行しています。オペレーティング システムは、割り込みを処理し、バックグラウンドでさまざまなデーモンを実行し、さまざまなメンテナンス タスクを実行し、実行中のプロセスを別の CPU に移動する可能性があります。

キャッシュを無効にする心配はほとんどありません。測定値がこれほど正確である必要がある場合は、テストを実行する環境を再評価する必要があります。オペレーティング システムが行うすべてのことを管理下に置くことができたとしても (基本的には、テスト対象のコードをオペレーティング システムの一部にすることを意味します)、TLB の動作と分岐予測バッファーを考慮する必要があります (キャッシュよりもパフォーマンスに影響します)。 SMM を制御し (通常、BIOS を制御しない限り制御できません)、測定に使用するクロックが実際にどのように動作するかを理解します (10 度の温度差は、クリーンキャッシュ)。

言い換えれば、忘れてください。物事を現実的に測定する典型的な方法は、それを「十分な」回数実行し、平均を取ることです (または、証明したいものに応じて、最小または最大または中央値)。

さらに追加するには:方法番号1はファイルシステムキャッシュをフラッシュし、CPUのデータキャッシュとは何の関係もありません。番号 2 私にはわかりません。私の Linux フレーバーにはそれがありません。番号 3 は、CPU に完全なキャッシュの連想性がある場合に機能する可能性がありますが、これはありません。オペレーティング システムによって割り当てられた物理ページがすべての可能なキャッシュ ラインにアクセスすることを確認する必要がありますが、これは不可能です。また、テストが実行されるのと同じ cpu で実行するか、すべての cpu で実行し、その間に何も実行するようにスケジュールされていないことを確認する必要があります。コマンドラインからこれを実行したいので、プログラムが実行されるずっと前に、シェルはキャッシュ全体を踏みにじります (そして、exec システムコールとファイルシステム操作は役に立ちません)。

アーキテクチャ上のキャッシュを確実にクリアする唯一の方法は、wbinvd 命令を使用することです。これは、カーネルではなく、キャッシュをいじることが想定されていないため、呼び出すことが許可されていません。

于 2012-11-20T13:20:35.597 に答える