valgrind の cachegrind/callgrind ツール用の小さなパッチをまとめています。これは、完全に汎用的なコード、CPU 命令、およびキャッシュ構成を使用して自動検出します (現在は x86/x64 自動構成のみで、他のアーキテクチャでは提供されません)。非特権コードへの CPUID タイプの構成)。このコードは、非特権コンテキスト、つまり純粋なユーザー モード コードで完全に実行する必要があります。また、非常に異なる POSIX 実装間で移植可能である必要があるため、目的のシステムの 1 つにそのような機能がないため、/proc/cpuinfo を調べてもうまくいきません。
CPU の周波数、キャッシュの数、それらのサイズ、さらにはキャッシュ ラインのサイズの検出はすべて、CPU 固有のオペコードをまったく持たない 100% 汎用の POSIX コードを使用して実行できますメモリまたはレジスタ依存ストールがなければ、おそらく 1 サイクルで実行されます)。この部分はかなり簡単です。
それほど簡単ではないのはなぜですか? StackOverflow に尋ねる理由は、特定のキャッシュのキャッシュ ラインの連想性を検出する方法です。連想性とは、メイン メモリからの特定のキャッシュ ラインをキャッシュ内に含めることができる場所の数です。L1 キャッシュの連想性は検出できていることがわかりますが、L2 キャッシュは? 確かにL1連想性は邪魔になりますか?
これはおそらく解決できない問題だと思います。しかし、私はそれを StackOverflow に投げて、誰かが私が知らないことを知っていることを願っています。ここで失敗した場合は、結果に大きな違いをもたらさないと仮定して、結合性の既定値である 4 つの方法で単純にハード コードすることに注意してください。
ありがとう、
ナイル