그 사람을 위해중앙 처리 유닛어떤 숫자가 어떤 처리 장치에 매핑되는지 알아내는 방법이 명확하게 제시되어 있지 않은 것 같습니다. 내 현재 컴퓨터에는 두 개가 있습니다.인텔 제온 E5645각 코어에는 하이퍼스레딩이 활성화된 6개의 코어가 있으므로 총 24개의 처리 장치가 있으며 이를 참조용으로 cpuset을 사용할 수 있습니다. 내 과제는 1) 어떤 CPUset ID 번호가 어떤 프로세서에 매핑되는지 결정하고 2) 어떤 CPUset 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#...
비트는 "운영 체제에서 사용되는" 식별자이므로 전달해야 하는 CPU 세트라고 믿게 됩니다. . 따라서 프로세스를 CPU 0과 12로 제한하면 동일한 코어에서 두 개의 스레드를 사용할 수 있고, CPU 0과 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
답변1
사용
cat /proc/cpuinfo
여기에서 아래에 나열된 각 하이퍼스레드를 얻을 수 있습니다.
processor : 0
physical id : 0
core id : 1
"프로세서"는 "논리 프로세서"를 의미하며 운영 체제에 프로세서로 표시됩니다. 하이퍼스레딩이 켜져 있는 경우 코어당 2개의 "논리 프로세서"가 표시됩니다. "물리적 ID"는 만질 수 있는 프로세서입니다(두 개가 있습니다).
하이퍼스레딩을 사용하는 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
답변2
lstopo --cpuset
마스크 형식에 각 논리 프로세서를 포함하기 위해 어떤 CPUset을 사용해야 하는지 알려줄 것입니다.
프로세서 목록 형식으로 변환하여 프로세서 번호가 일치하는지 확인할 수 있습니다.
또는 당신이 나와 같고 게으른 경우 다음과 같은 작업을 수행할 수 있습니다.
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)에 있는 숫자를 사용해야 합니다.