オペレーティングシステムは、メモリのページがDRAMにあるかスワップしているかを判断することができます。たとえば、単にアクセスしようとすると、ページ違反が発生した場合、それはそうではありませんでした。メモリの場所がCPUキャッシュにあるかどうかを確認する
しかし、CPUキャッシュでも同じことが可能ですか?
与えられたメモリ位置がキャッシュラインにロードされたかどうかを知る効率的な方法はありますか?
オペレーティングシステムは、メモリのページがDRAMにあるかスワップしているかを判断することができます。たとえば、単にアクセスしようとすると、ページ違反が発生した場合、それはそうではありませんでした。メモリの場所がCPUキャッシュにあるかどうかを確認する
しかし、CPUキャッシュでも同じことが可能ですか?
与えられたメモリ位置がキャッシュラインにロードされたかどうかを知る効率的な方法はありますか?
一般的に、私はこれが可能ではないと思います。これはDRAMとページファイルで動作します。これはOSが管理するリソースであり、キャッシュはCPU自身によって管理されるためです。
OSはメモリ読み込みの厳しいタイミングループを実行し、キャッシュに入るのに十分速く完了したかどうか、またはメインメモリに出なければならないかどうかを調べることができます。
マルチコア/マルチプロセッサシステムでは、お互いのキャッシュを無効にする必要があるときにプロセッサ間で使用されるcache coherency protocolsがあります。このプロトコルをスヌープするカスタムデバイスをOSクエリを実行します。
あなたは何をしようとしていますか?メモリに何かを強制したいのであれば、現行のx86プロセッサは、非ブロック的な方法でキャッシュにプリフェッチメモリをサポートしています。たとえば、Visual C++では_mm_prefetch
を使ってキャッシュに行をフェッチできます。
編集: 私はこれを自分で行っていないので、自己責任で使用してください。プロファイリングのキャッシュミスを特定するには、アーキテクチャー固有のレジスタを使用することができます。 http://download.intel.com/design/processor/manuals/253669.pdf、付録A「パフォーマンスチューニングイベント」を参照してください。これは、個々のアドレスがキャッシュにあるかどうか、またはキャッシュにロードされているかどうかを判断するために使用することはできませんが、全体の統計情報に使用できます。私はこれがvTune(このレベルの驚異的なプロファイラ)が使用するものだと信じています。
これを自分で判断しようとすると、プログラムを実行すると、関連するキャッシュラインが無効になり、測定が役に立たなくなる可能性があります。
これは、測定しているものに影響を与えずに何かを測定できないという科学的原理を反映するケースの1つです。
場所*がキャッシュ内にあることを確認するのは簡単です。それから読んだだけで、それはキャッシュに入ります。 ;) このトリックは、何かがキャッシュにないかどうかをテストすることです。 :) – jalf
コードがキャッシュ不可能なメモリから実行されていることを確認した場合、プログラムを実行するだけでキャッシュには影響しません。 –
良い点。だから、基本的に私は、キャッシュミスが問題のメモリをロードしたかどうかを知るために起こりうる他のすべてを考慮する必要があります。 –
X86 は、アドレスがキャッシュ にあるが、ここでのアドレスがキャッシュにあった場合
rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache
しきい値が文書から決定する必要があるか、経験的に
いくつかのマシン伝えるためにどのようにされているかどうかをする方法を知ってはいけませんキャッシュヒット/ミスカウンタがあり、これも同様に役立ちます。
ありがとうございました。私はカーネルを書くことを夢中にしているので興味があります。実際のハードウェアでキャッシュラインミスをプロファイリングすることに興味があります。私はHerb Sutterのスライドを見るまで、彼らが現代のCPU上でどのように非常に有害であるかわかりませんでした:http://is.gd/oWwp –
これをハードウェアでプロファイルする方法があります。 – Michael
多くの最新のCPUには、キャッシュ関連の統計情報を含むあらゆる種類の情報を提供できるパフォーマンスカウンタがあります。 – sigjuice