lscpu 物理CPUやら論理CPUやらCPUトポロジーまで
lscpuでCPU情報を取得しましょう
CPU(s):論理CPU = (Thread per core) * (Core per socket) * (Socket)
Thread(s) per core: 1物理コアあたりの論理コア数 各物理コアがいくつの論理コアに相当するかを確認できます(値が2であれば、CPUはハイパースレッド化されていることになります)。
Core(s) per socket: 1CPUあたりの物理コア数 各物理CPUは1つ以上の物理コアを持つことができる
Socket(s):物理CPU マザーボードに実際に挿入されているCPUの数
$ LANG=C lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 46 bits physical, 48 bits virtual
CPU(s): 72
On-line CPU(s) list: 0-71
Thread(s) per core: 2
Core(s) per socket: 18
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 79
Model name: Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz
Stepping: 1
CPU MHz: 1199.396
CPU max MHz: 3600.0000
CPU min MHz: 1200.0000
BogoMIPS: 4589.42
Virtualization: VT-x
L1d cache: 1.1 MiB
L1i cache: 1.1 MiB
L2 cache: 9 MiB
L3 cache: 90 MiB
NUMA node0 CPU(s): 0-17,36-53
NUMA node1 CPU(s): 18-35,54-71
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat p
se36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdp
e1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xto
pology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds
_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1
sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rd
rand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpci
d_single pti intel_ppin ssbd ibrs ibpb stibp tpr_shadow vnmi flexpr
iority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2
erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_ll
c cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
md_clear flush_l1d
論理CPUは72。ちゃんと合っていますね。
72 = 2 * 18 * 2
lscpu(util-linuxパッケージ)のソースを読んでみた。
基本情報(cpu family, model, CPU part, model nameなど)は/proc/cpuinfoから取得している。
以下はそれぞれ取得している。カーネル変数から取得しているかと思ったら違った。
CPU(s): /sys/devices/system/cpu/present
On-line CPU(s) list: /sys/devices/system/cpu/online
Thread(s) per core: /sys/devices/system/cpu/cpu[N]/topology/thread_siblings 計算して求める
Socket(s): /sys/devices/system/cpu/cpu[N]/topology/core_siblings 計算して求める
$ls /sys/devices/system/cpu
cpu0 cpu16 cpu23 cpu30 cpu38 cpu45 cpu52 cpu6 cpu67 cpufreq offline
cpu1 cpu17 cpu24 cpu31 cpu39 cpu46 cpu53 cpu60 cpu68 cpuidle online
cpu10 cpu18 cpu25 cpu32 cpu4 cpu47 cpu54 cpu61 cpu69 hotplug possible
cpu11 cpu19 cpu26 cpu33 cpu40 cpu48 cpu55 cpu62 cpu7 intel_pstate power
cpu12 cpu2 cpu27 cpu34 cpu41 cpu49 cpu56 cpu63 cpu70 isolated present
cpu13 cpu20 cpu28 cpu35 cpu42 cpu5 cpu57 cpu64 cpu71 kernel_max smt
cpu14 cpu21 cpu29 cpu36 cpu43 cpu50 cpu58 cpu65 cpu8 microcode uevent
cpu15 cpu22 cpu3 cpu37 cpu44 cpu51 cpu59 cpu66 cpu9 modalias vulnerabilities
$ cat /sys/devices/system/cpu/present
0-71
$ cat /sys/devices/system/cpu/online
0-71
Socket(s) と Thread(s) per coreの求め方を見ていきます。
論理CPUの数だけぶん回して /sys/devices/system/cpu/cpu[N]/topology/core_siblings
の値を取得します。
見ると"00,003ffff0,0003ffff" と "ff,ffc0000f,fffc0000"の2種類しかありません。
つまりソケット数Socket(s)が2個ということになります。
Thread(s) per coreも同じ仕組みで取得しています
$ grep . /sys/devices/system/cpu/cpu*/topology/core_siblings | tr : \\t | sed 's,^, ,'
/sys/devices/system/cpu/cpu0/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu1/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu10/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu11/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu12/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu13/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu14/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu15/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu16/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu17/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu18/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu19/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu2/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu20/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu21/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu22/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu23/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu24/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu25/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu26/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu27/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu28/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu29/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu3/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu30/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu31/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu32/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu33/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu34/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu35/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu36/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu37/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu38/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu39/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu4/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu40/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu41/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu42/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu43/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu44/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu45/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu46/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu47/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu48/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu49/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu5/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu50/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu51/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu52/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu53/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu54/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu55/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu56/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu57/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu58/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu59/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu6/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu60/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu61/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu62/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu63/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu64/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu65/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu66/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu67/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu68/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu69/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu7/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu70/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu71/topology/core_siblings ff,ffc0000f,fffc0000
/sys/devices/system/cpu/cpu8/topology/core_siblings 00,003ffff0,0003ffff
/sys/devices/system/cpu/cpu9/topology/core_siblings 00,003ffff0,0003ffff
C言語をイメージで書きます。
read_topology() {
//ソケット数カウント
fopen("/sys/devices/system/cpu/cpu[N]/topology/core_siblings");
if(新規なら) {
nsocket++;
}
//スレッド数カウント
fopen("/sys/devices/system/cpu/cpu[N]/topology/thread_siblings");
if(新規なら) {
nthreads++;
}
}
for (i = 0; i < desc->ncpuspos; i++) { //論理CPUの数だけループ
read_topology(desc, i);
}
CPU TOPOLOGYというそうです。
/Documentation / cputopology.txtからの抜粋です。
2) /sys/devices/system/cpu/cpuX/topology/core_id:
cpuX の CPU コア ID。通常、これはハードウェアプラットフォームの
識別子です(カーネルのではありません)。 実際の値は
アーキテクチャとプラットフォームに依存します。
- /sys/devices/system/cpu/cpuX/topology/thread_siblings:
cpuXと同じコアにあるcpuXのハードウェアスレッドの内部カーネルマップ。
sudo apt install numactl hwloc
$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
node 0 size: 64320 MB
node 0 free: 62635 MB
node 1 cpus: 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
node 1 size: 64500 MB
node 1 free: 62422 MB
$lstopo
Discussion