OKを、。私は後であなたの質問の下にあなたのフォローアップのコメントを読んだので、私は今あなたがあなたのプログラムをテストするときにあなたのプログラム(またはその一部)をキャッシュから起動するためにインストラクションキャッシュをフラッシュしたいと思います。主メモリから命令キャッシュへの初期ロード時間。また、データとコードの両方が新しくなるように、コードがメインメモリに使用するデータをフラッシュする必要がありますか?
何よりも先に、メインメモリ自体もキャッシュの一種であり、ハードディスク(ディスク上のプログラム、またはディスク上のスワップ領域)がプログラムの最も遅く、最も遅い場所です指示が出てくる可能性があります。つまり、最初にルーチンを実行したときに、すでに実行されている他のコードの近くにあるためにディスクからメイン・メモリにまだロードされていない場合は、そのCPU命令を最初にロードする必要がありますディスクから。これはメインメモリからキャッシュにロードするよりも長い時間がかかります。その後、メインメモリにロードされると、キャッシュからCPUの命令フェッチャにロードするよりも、メインメモリからキャッシュにロードするのに長い時間がかかります。だから、コードのコールドスタート性能をテストしたいのであれば、コールドスタートが何を意味するのかをディスクから取り出すか、メインメモリから引き出すかを決める必要があります。私は、メインメモリから命令/データをスワップ空間に「フラッシュする」命令を知らないので、メインメモリにフラッシュすることはできる限り多くのことがわかっていますが、心に留めておいてください命令キャッシュをフラッシュしたとしても、テスト結果が最初の実行(ディスクから取り出される可能性があります)から後続の実行までの実行結果と異なる場合があります。
ここで、自分のコードがメインメモリにフラッシュされるように命令キャッシュをフラッシュする方法はありますか?
これを行う必要がある場合(私の意見では非常に奇妙なことです)、私はおそらく、長さ&の私の関数をメモリに近似的に配置することから始めます。私はLinuxを使っているので、コマンド "objdump -d {myprogram}> myprogram.dump.txt"を発行して、myprogram.dump.txtをエディタで開き、フラッシュする機能を探しますそれらの開始アドレスから16進計算機を使用してエンドアドレスを減算することによってどれくらい時間がかかるかを計算します。私はそれぞれのサイズを書き留めます。後で私のコードでcacheflush()呼び出しを追加し、 'addr'と 'nbytes'として見つけた長さ、ICACHEとしてフラッシュしたい各関数のアドレスを与えます。ちょうど安全のために私はおそらくちょっと&のサイズを約10%増やしただけです。ちょっとしたコードを修正して、nbytesを調整するのを忘れてしまった場合に備えてください。 cacheflush()を呼び出すと、フラッシュしたい各関数が呼び出されます。次に、データをフラッシュする必要がある場合、グローバル/静的データを使用している場合は、それらをフラッシュすることもできます(DCACHE)が、スタックまたはヒープデータの場合、フラッシュすることができるかどうか、現実的には何もありませんそれはキャッシュから外れています。それをやろうとすると、通常の実行で決して存在しないか、まれにしか存在しない状態を作り出すので、愚かさの練習になるでしょう。 ところで
#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).
...あなたは、Linuxを使っていると仮定すると、クラスのこの宿題はありますか?
なぜあなたは*キャッシュをフラッシュする*必要がありますか? –
私のプロジェクトにはロジックの時間を計算する必要があるため、キャッシュをフラッシュする必要があります。 –
可能な複製http://stackoverflow.com/questions/1756825/cpu-cache-flush – Tudor