Linux上の現在のCPUのデータキャッシュ階層の正確な説明を取得しようとしています。個々のL1 / L2 / L3(およびおそらくL4)データキャッシュのサイズだけでなく、それらが分割または共有される方法もコア。
たとえば、私のCPU(AMD Ryzen Threadripper 3970X)では、各コアには独自の32 KBのL1データキャッシュと512 KBのL2キャッシュがありますが、L3キャッシュはコアコンプレックス(CCX)内のコア間で共有されます。つまり、それぞれ16 MBの8つの異なるL3キャッシュがあります。
このWindows上のCPU-Zのスクリーンショットの「キャッシュ」セクションは、基本的に私が探しているものです。
Windowsでこれらの情報を取得しても問題ありませんGetLogicalProcessorInformation()
。
ただし、Linuxでは、sysconf()
L1およびL2データキャッシュのコアごとのキャッシュサイズ(_SC_LEVEL1_DCACHE_SIZE
および_SC_LEVEL2_DCACHE_SIZE
)、またはL3キャッシュの合計サイズ(_SC_LEVEL3_CACHE_SIZE
)のどちらかしか表示されないようです。
編集:VMWareでの lstopoの出力。仮想マシンには8つのコアがあります。L1およびL2キャッシュ情報は問題ありませんが、L3キャッシュサイズが正しくないようです。
sysconf()
です。キャッシュが共有されているかどうかがわからない場合、それらを理解するにはどうすればよいですか?
cpuid
、そのISAで自分でx86 命令を使用する必要があり、モデルごとのキャッシュレイアウトの詳細を埋め込む必要がある場合もあります。sandpile.org/x86/cpuid.htm#level_0000_0004hのようなさまざまなCPUID リーフが表すことができる詳細のIDK 。
lstopo
ベアメタルのLinux を試すことができますか?(たとえば、ライブUSBを起動します)。偽の結果はVMの障害である可能性があるため、除外する必要があります。当然のことながら、これは私のi7-6700kデスクトップで期待どおりに動作し、L3キャッシュを共有する同じパッケージ内のすべての4つのコアを示しています。しかし、Intel Sandybridgeファミリは最も広く使用されており、最近変更されていない一連のx86 CPUです。
lstopo
Windowsでも利用できることに注意してください。lstopo
使用cpuid
命令(そしておそらくACPIのSRAT
テーブルを)。cpuid
比較的使いやすいですが、IntelとAMDはこの点で大きく異なります。hwloc
(lstopo
所属する)には、WindowsとLinuxの両方でキャッシュトポロジを取得するために使用できるAPIインターフェイスがあります。