12

メモリをフラッシュする必要がある C プログラムを作成しています。CPU キャッシュをフラッシュする UNIX システム コマンドがあれば教えてください。

これは、ロジックにかかる時間を計算するプロジェクトの要件です。

関数について読んだことがありcacheflush(char *s, int a, int b)ますが、それが適切かどうか、およびパラメーターに何を渡すかについてはわかりません。

4

4 に答える 4

11
  1. メモリキャッシュではなく、「CPUキャッシュ」を意味していると思います

  2. 上記のリンクは良いです:「CPU経由で大量のデータを書き込む」という提案はWindows固有ではありません

  3. 同じテーマの別のバリエーションを次に示します。

  4. Linux と CPU キャッシュに関する記事は次のとおりです。

ノート:

この (非常に低い) レベルでは、"Linux" != "Unix"

于 2012-06-30T22:03:54.433 に答える
4

ユーザー モード (カーネル モードではない) プログラムを作成していて、それがシングル スレッドである場合、最初からわざわざキャッシュをフラッシュする必要はありません。ユーザー モード プログラムは、それが存在することすら忘れてしまう可能性があります。プログラムの実行を高速化するためだけに存在し、OS はプロセッサの MMU を介してそれを管理します。

ユーザー モード アプリケーションから実際にキャッシュをフラッシュする必要があると考えられる理由は、次の 2 つだけです。

  1. あなたのアプリは、対称型マルチプロセッサ システムで実行することを意図しているか、外部ハードウェアとのデータ トランザクションを持っています)。
  2. ある種のパフォーマンス テストのためにキャッシュをテストしているだけです (この場合、おそらくドライバーとして、カーネル モードで動作するようにテストを作成する必要があります)。

いずれにせよ、Linuxを使用していると仮定して...

#include <asm/cachectl.h>

int cacheflush(char *addr, int nbytes, int cache);

これは、書き込み先のメモリ ブロックがあり、キャッシュからフラッシュしてメイン メモリに戻すことを確認したい場合を想定しています。ブロックは addr で始まり、長さは nbytes で、2 つのキャッシュのいずれか (または両方) にあります。

   ICACHE Flush the instruction cache.
   DCACHE Write back to memory and invalidate the affected valid cache lines.
   BCACHE Same as (ICACHE|DCACHE).

通常は DCACHE をフラッシュするだけで済みます。これは、データを「メモリ」(つまりキャッシュ) に書き込む場合、通常は命令ではなくデータであるためです。

奇妙なテスト上の理由で「すべてのキャッシュ」をフラッシュしたい場合は、CPU のキャッシュよりも大きいことがわかっている大きなブロックを malloc() して (撃ち、8 倍の大きさにします!)、古いガベージを書き込みます。その中に、そのブロック全体をフラッシュするだけです。

参照: C++ でキャッシュ操作を実行するには?

于 2012-06-30T22:22:59.113 に答える
2

OK、最初の回答で申し訳ありません。私は後であなたの質問の下にあなたのフォローアップコメントを読んだので、INSTRUCTION CACHE をフラッシュしてプログラム (またはその一部) をキャッシュから起動し、そのパフォーマンスをテストするときにテストする必要があることに気付きました。メインメモリから命令キャッシュへの初期ロード時間。また、コードが使用するデータをメイン メモリにフラッシュして、データとコードの両方を新たにロードする必要がありますか?

何よりもまず、メイン メモリ自体も一種のキャッシュであり、ハード ディスク (ディスク上のプログラム、またはディスク上のスワップ領域) は、プログラムの命令が到達する可能性がある最も低く、最も遅い場所であることに言及したいと思います。から。つまり、初めてルーチンを実行するときに、すでに実行されている他のコードの近くにあるためにディスクからメイン メモリにまだロードされていない場合は、その CPU 命令を最初にロードする必要があります。ディスクから。これには、メイン メモリからキャッシュにロードするよりも 1 桁以上時間がかかります。次に、メインメモリにロードされると、メインメモリからキャッシュにロードするのに、キャッシュからCPUの命令フェッチャーにロードするよりも桁違いに長い時間がかかります。したがって、コードのコールド スタートのパフォーマンスをテストする場合は、コールド スタートが何を意味するのかを判断する必要があります。ディスクから引き出すか、メイン メモリから引き出すかです。メインメモリから命令/データを「フラッシュ」してスペースをスワップするコマンドを知らないので、メインメモリにフラッシュすることは、できる限りのことです(私が知っていることです)が、覚えておいてください命令キャッシュをフラッシュしたとしても、最初の実行 (ディスクからデータを取得している可能性がある場合) とその後の実行ではテスト結果が異なる可能性があることに注意してください。

では、命令キャッシュをフラッシュして、自分のコードがメイン メモリに確実にフラッシュされるようにするにはどうすればよいでしょうか。

これを行う必要がある場合 (私の意見では非常に奇妙なことです)、メモリ内の関数の長さとおおよその配置を見つけることから始めます。私は Linux を使用しているので、「objdump -d {myprogram} > myprogram.dump.txt」というコマンドを発行してから、エディターで myprogram.dump.txt を開き、フラッシュする関数を検索します。 16 進計算機を使用して、開始アドレスから終了アドレスを差し引いて、それらの長さを計算します。それぞれのサイズを書いておきます。後でコードに cacheflush() 呼び出しを追加し、フラッシュする各関数のアドレスを「addr」として指定し、見つけた長さを「nbytes」として指定し、ICACHE を指定します。安全のために、おそらく少しごまかして、サイズに約10%追加します。コードにいくつかの調整を加えて、nbytes を調整するのを忘れた場合に備えて。フラッシュしたい関数ごとに、このように cacheflush() を呼び出します。次に、データもフラッシュする必要がある場合、グローバル/静的データを使用している場合は、それらもフラッシュできますが (DCACHE)、スタックまたはヒープ データの場合、フラッシュするためにできる (またはすべき) 現実的なことは何もありません。キャッシュから。そうしようとすると、通常の実行では存在しない、またはほとんど存在しない状態が作成されるため、愚かな行為になります。Linuxを使用していると仮定して... それをキャッシュからフラッシュするために私ができる(またはすべき)ことは、本当に現実的ではありません。そうしようとすると、通常の実行では存在しない、またはほとんど存在しない状態が作成されるため、愚かな行為になります。Linuxを使用していると仮定して... それをキャッシュからフラッシュするために私ができる(またはすべき)ことは、本当に現実的ではありません。そうしようとすると、通常の実行では存在しない、またはほとんど存在しない状態が作成されるため、愚かな行為になります。Linuxを使用していると仮定して...

#include <asm/cachectl.h>

int cacheflush(char *addr, int nbytes, int cache);

...where cache is one of:
   ICACHE Flush the instruction cache.
   DCACHE Write back to memory and invalidate the affected valid cache lines.
   BCACHE Same as (ICACHE|DCACHE).

ところで、これはクラスの宿題ですか?

于 2012-06-30T22:51:33.873 に答える