-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathcpuinfo.py
executable file
·86 lines (67 loc) · 2.39 KB
/
cpuinfo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#! /usr/bin/env python3
import sys
import subprocess
import re
import collections
class CPUInfo(object):
def __init__(self, socket = None, model = None):
self.socket = socket
self.model = model
self.nodes = {}
self.cores = {}
self.hardware_threads = []
self.physical_processors = []
def add_core(self, node, core, thread):
if not node in self.nodes:
self.nodes[node] = []
if not core in self.cores:
self.nodes[node].append(core)
self.cores[core] = []
self.cores[core].append(thread)
def finalise(self):
for cores in self.cores.values():
self.physical_processors.append(min(cores))
self.hardware_threads.extend(cores)
self.physical_processors.sort()
self.hardware_threads.sort()
# cache results across calls
__cache = None
# return a mapping between sockets and CPUInfo objects
def get_cpu_info(cache = True):
global __cache
if cache and __cache:
return __cache
cpus = collections.OrderedDict()
model = 'Unknown CPU'
description = subprocess.Popen(['lscpu', ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).communicate()[0]
for line in description.splitlines():
if 'Model name:' in line:
model = line.split(':')[1].strip()
break
devices = subprocess.Popen(['lscpu', '-b', '-p=SOCKET,NODE,CORE,CPU'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).communicate()[0]
for line in devices.splitlines():
if '#' in line:
continue
sock, numa, core, proc = line.split(',')
sock = int(sock) if sock else 0
numa = int(numa) if numa else sock
core = int(core) if core else 0
proc = int(proc) if proc else 0
if not sock in cpus:
cpus[sock] = CPUInfo(sock, model)
cpus[sock].add_core(numa, core, proc)
for cpu in cpus.values():
cpu.finalise()
if cache:
__cache = cpus
return cpus
if __name__ == "__main__":
cpus = get_cpu_info()
print('%d CPUs:' % len(cpus))
for cpu in cpus.values():
print(' %d: %s (%d NUMA nodes, %d cores, %d threads)' % (cpu.socket, cpu.model, len(cpu.nodes), len(cpu.physical_processors), len(cpu.hardware_threads)))
for node, cores in cpu.nodes.items():
print(' NUMA node %d' % node)
print(' cores: %s' % ', '.join(map(str, cores)))
threads = sorted(thread for core in cores for thread in cpu.cores[core])
print(' SMTs: %s' % ', '.join(map(str, threads)))