Ho scoperto il semplice trucco per fare ciò di cui ho bisogno.
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
Se il primo numero è uguale al numero della CPU (0 in questo esempio), allora è un core reale, altrimenti è un core hyperthreading.
Esempio di base reale:
# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13
Esempio di base di hyperthreading
# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13
L'output del secondo esempio è esattamente lo stesso del primo. Comunque stiamo controllando cpu13
e il primo numero è 1
, quindi CPU 13 questo è un core hyperthreading.
Sono sorpreso che nessuno abbia menzionato lscpu
ancora. Ecco un esempio su un sistema single-socket con quattro core fisici e hyper-threading abilitato:
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,0,0,0,,0,0,0,0
5,1,0,0,,1,1,1,0
6,2,0,0,,2,2,2,0
7,3,0,0,,3,3,3,0
L'output spiega come interpretare la tabella degli ID; gli ID CPU logici con lo stesso ID Core sono fratelli.