cpuset の人は、どの番号がどの処理装置にマップされているかを理解する方法を明確にリストしていないようです。私の現在のマシンには2つの Intel Xeon E5645 sがあり、それぞれに6つのコアとハイパースレッディングが有効になっているため、CPUセットで参照できる合計24の処理ユニットがあります。私の課題は、1)どのCPUセットID番号がどのプロセッサにマップされているかを判断する2)どのCPUセットID番号がペアになっているのかを判断することです(例:コア上の兄弟)
lscpu
が出力する数値は、CPUセットプロセッサを参照するために使用する必要があるのと同じ識別子ですか?もしそうなら、ここでは数字が交互になっているようで、これは(1)「偶数は一方のプロセッサ、オッズはもう一方のプロセッサ」と答えますが、正しく読んでいるかどうかはわかりません。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 44
Stepping: 2
CPU MHz: 2393.964
BogoMIPS: 4788.01
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 12288K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23
lstopo
パッケージのhwloc
は、(2)の答えを示しているようです。マニュアルページを正しく読んでいれば、P#...
ビットは「OSによって使用される」識別子であり、CPUセットに渡す必要があるものであると私は信じています。したがって、プロセスをcpus 0と12に制限すると、同じコアで2つのスレッドを使用できるようになり、cpus 0と2に制限すると、2つの異なるコアで2つのスレッドになります。それは正しいようですか?
$ lstopo
Machine (35GB)
NUMANode L#0 (P#0 18GB) + Socket L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#12)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
PU L#2 (P#2)
PU L#3 (P#14)
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
PU L#4 (P#4)
PU L#5 (P#16)
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
PU L#6 (P#6)
PU L#7 (P#18)
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
PU L#8 (P#8)
PU L#9 (P#20)
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
PU L#10 (P#10)
PU L#11 (P#22)
NUMANode L#1 (P#1 18GB) + Socket L#1 + L3 L#1 (12MB)
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
PU L#12 (P#1)
PU L#13 (P#13)
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
PU L#14 (P#3)
PU L#15 (P#15)
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
PU L#16 (P#5)
PU L#17 (P#17)
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
PU L#18 (P#7)
PU L#19 (P#19)
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
PU L#20 (P#9)
PU L#21 (P#21)
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
PU L#22 (P#11)
PU L#23 (P#23)
HostBridge L#0
PCIBridge
PCI 14e4:163a
Net L#0 "eth0"
PCI 14e4:163a
Net L#1 "eth1"
PCIBridge
PCI 102b:0532
PCI 8086:2921
Block L#2 "sda"
PCI 8086:2926
使用する
cat /proc/cpuinfo
そこに、次のようにリストされた各ハイパースレッドが表示されます。
processor : 0
physical id : 0
core id : 1
「プロセッサ」は「論理プロセッサ」の略で、オペレーティングシステムにプロセッサとして提示されます。ハイパースレッディングをオンにしている場合は、コアごとに2つの「論理プロセッサ」が表示されます。 「物理ID」は、タッチできるプロセッサになります(2つあります)。
これは、ハイパースレッディングを備えた1プロセッサ4コアシステムのリストです。
# cat /proc/cpuinfo|egrep "processor|core id|physical id"
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 0
core id : 2
processor : 3
physical id : 0
core id : 3
processor : 4
physical id : 0
core id : 0
processor : 5
physical id : 0
core id : 1
processor : 6
physical id : 0
core id : 2
processor : 7
physical id : 0
core id : 3
lstopo --cpuset
各論理プロセッサをマスク形式で含めるために使用する必要があるCPUセットを示します。
これをプロセッサリスト形式に変換して、プロセッサ番号が一致することを確認できます。
または、あなたが私のようで怠惰な場合は、次のようなことができます
taskset 0x00800000 grep -i Cpus_allowed /proc/self/status
そして、次のような出力が得られます
Cpus_allowed: 000,00800000
Cpus_allowed_list: 23
テストマシンでlstopo --cpuset
を使用するとどれが一致しますか
PU L#46 (P#23) cpuset=0x00800000
したがって、リスト形式を使用してcpusetを設定する場合は、(P#nn)の数字を使用する必要があります。