Descubrí el truco simple para hacer lo que necesito.
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
Si el primer número es igual al número de CPU (0 en este ejemplo), entonces es un núcleo real, si no, es un núcleo de hiperprocesamiento.
Ejemplo de núcleo real:
# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13
Ejemplo básico de Hyperthreading
# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13
El resultado del segundo ejemplo es exactamente el mismo que el primero. Sin embargo, estamos comprobando cpu13
, y el primer número es 1
, por lo que CPU 13 es un núcleo de hiperprocesamiento.
Me sorprende que nadie haya mencionado lscpu
aún. Este es un ejemplo de un sistema de un solo socket con cuatro núcleos físicos e hiperprocesamiento habilitado:
$ 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
El resultado explica cómo interpretar la tabla de ID; los ID de CPU lógicos con el mismo Core ID son hermanos.