J'ai découvert l'astuce simple pour faire ce dont j'ai besoin.
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
Si le premier nombre est égal au nombre de CPU (0 dans cet exemple) alors c'est un vrai coeur, sinon c'est un coeur hyperthreading.
Exemple de base :
# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13
Exemple de base d'hyperthreading
# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13
La sortie du deuxième exemple est exactement la même que celle du premier. Cependant nous vérifions cpu13
, et le premier nombre est 1
, donc CPU 13 c'est un noyau hyperthreading.
Je suis surpris que personne n'ait mentionné lscpu
encore. Voici un exemple sur un système à socket unique avec quatre cœurs physiques et l'hyper-threading activé :
$ 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
La sortie explique comment interpréter le tableau des ID ; les ID CPU logiques avec le même ID Core sont frères.