オペレーティング システムは、メモリのページが DRAM にあるかスワップにあるかを判断できます。たとえば、単純にアクセスしようとして、ページ フォールトが発生した場合はそうではありません。
ただし、CPUキャッシュでも同じことが可能ですか?
特定のメモリ位置がキャッシュ ラインにロードされているかどうか、またはいつロードされたかを知る効率的な方法はありますか?
一般的に、これは不可能だと思います。DRAMとページファイルはOSが管理するリソースであり、キャッシュはCPU自体によって管理されるため、機能します。
OS は、メモリ読み取りのタイトなタイミング ループを実行し、キャッシュに入れるのに十分な速さで完了するかどうか、またはメイン メモリに移動する必要があるかどうかを確認しようとしますが、これは非常にエラーが発生しやすくなります。
マルチコア/マルチプロセス システムでは、プロセッサ間で使用されるキャッシュ コヒーレンシ プロトコルがあり、プロセッサが互いのキャッシュをいつ無効にする必要があるかを判断します。OS が照会するこのプロトコルをスヌープするカスタム デバイスを使用できると思います。 .
あなたは何をしようとしているのですか?何かを強制的にメモリに格納したい場合、現在の x86 プロセッサは、ノンブロッキングな方法でメモリをキャッシュにプリフェッチすることをサポートしています。たとえば、Visual C++ を使用_mm_prefetch
して行をキャッシュにフェッチすることができます。
編集:私はこれを自分で行っていないので、自己責任で使用してください。プロファイリングのキャッシュ ミスを判断するために、アーキテクチャ固有のレジスタを使用できる場合があります。 http://download.intel.com/design/processor/manuals/253669.pdf、付録 A に「パフォーマンス チューニング イベント」が記載されています。これは、個々のアドレスがキャッシュにあるかどうか、またはいつキャッシュにロードされたかを判断するために使用することはできませんが、全体的な統計には使用できます。これが、vTune (このレベルの驚異的なプロファイラー) が使用するものだと思います。
これを自分で判断しようとすると、プログラムを実行するだけで関連するキャッシュラインが無効になり、測定値が役に立たなくなる可能性があります。
これは、測定対象に影響を与えずに何かを測定することはできないという科学的原則を反映した事例の1つです。
X86はアドレスがキャッシュにあるかどうかを確認する方法を知りませんが、アドレスがキャッシュにあったかどうかを確認する方法は次のとおりです
rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache
しきい値は、ドキュメントから、または経験的に決定する必要があります
一部のマシンには、同様に機能するキャッシュ ヒット/ミス カウンターがあります。