Linuxで正確なCPUキャッシュ階層情報をプログラムで取得する


9

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のスクリーンショットの「キャッシュ」セクションは、基本的に私が探しているものです。

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キャッシュサイズが正しくないようです。

lstopoスクリーンショット


1
これは役立つかもしれません... askubuntu.com/a/214302
Mark Setchell

私はlstopoを見ました、このプロジェクトは素晴らしいですが、私のニーズにとってはやり過ぎです。私が本当に混乱しているのは、によって返されるコアごとのキャッシュサイズとコアごとではないキャッシュサイズの混合sysconf()です。キャッシュが共有されているかどうかがわからない場合、それらを理解するにはどうすればよいですか?
フランソワ・ボーヌ

プログラムにこれを使用して、開始するスレッドの数、または設定するCPUアフィニティマスクについて何かを決定させたいですか?または、ユーザーに情報を表示しますか?どちらの方法でもcpuid、そのISAで自分でx86 命令を使用する必要があり、モデルごとのキャッシュレイアウトの詳細を埋め込む必要がある場合もあります。sandpile.org/x86/cpuid.htm#level_0000_0004hのようなさまざまなCPUID リーフが表すことができる詳細のIDK 。
Peter Cordes

1
lstopoベアメタルのLinux を試すことができますか?(たとえば、ライブUSBを起動します)。偽の結果はVMの障害である可能性があるため、除外する必要があります。当然のことながら、これは私のi7-6700kデスクトップで期待どおりに動作し、L3キャッシュを共有する同じパッケージ内のすべての4つのコアを示しています。しかし、Intel Sandybridgeファミリは最も広く使用されており、最近変更されていない一連のx86 CPUです。
Peter Cordes

1
lstopoWindowsでも利用できることに注意してくださいlstopo使用cpuid命令(そしておそらくACPIのSRATテーブルを)。cpuid比較的使いやすいですが、IntelとAMDはこの点で大きく異なります。hwloclstopo所属する)には、WindowsとLinuxの両方でキャッシュトポロジを取得するために使用できるAPIインターフェイスがあります。
マーガレットブルーム

回答:


3

キャッシュ階層の全体像は、/sys(sysfs)でファイルを開くことにより、プログラムで見つけることができます。

各「スレッド」または「論理プロセッサ」は、のサブディレクトリで表され/sys/devices/system/cpu/ます。そのディレクトリ内には、キャッシュディレクトリがあります。たとえば、最初の論理プロセッサのキャッシュ情報は次の場所にあります。

$ ls /sys/devices/system/cpu/cpu0/cache/
index0
index1
index2
index3
power
uevent

その論理プロセッサに関連付けられている各キャッシュエンティティは、index[0-9]*ディレクトリで表されます。インデックスの後の数字はレベルを表していません。同じキャッシュエンティティが、異なる論理プロセッサで複数回リストされることがあります。これらのディレクトリ内には、キャッシュエンティティのすべてのプロパティ(レベル、セット、ラインサイズなど)があります。

$ ls /sys/devices/system/cpu/cpu0/cache/index0
coherency_line_size
level
number_of_sets
physical_line_partition
power
shared_cpu_list
shared_cpu_map
size
type
uevent
ways_of_associativity

完全なドキュメントはここにあります

最も重要なことは、あなたが望む出力を得るために、あなたは検査する必要があるでしょうshared_cpu_list

$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list
0,28

これにより、このキャッシュエンティティを共有する論理プロセッサが表示されます。すべてのエンティティ(/sys/devices/system/cpu/cpu*/cache/index*/)を検査しshared_cpu_list、を使用して重複を排除することで、必要なすべてのデータにプログラムでアクセスできます。

ハイパーバイザーは正確な情報を渡す必要がないことに注意してください。これは、ゲストカーネルが認識しているキャッシュ階層のみを表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.