¿Cómo sé qué procesadores son núcleos físicos?

15

Tengo un Intel i7 2700k aquí, y me gustaría saber cómo puedo saber qué procesadores son físicos y cuáles son virtuales (es decir, hyperthreading). Actualmente estoy ejecutando un script Conky para mostrar las temperaturas, frecuencias y cargas de mi CPU, pero no estoy seguro de haberlo hecho bien:

increíble

He escrito mi propio guión para obtener temperaturas y frecuencias i7z, pero estas solo corresponden a núcleos físicos. Actualmente estoy mostrando cada núcleo de esta manera:

${cpu cpu1} ${lua display_temp 0} ${lua display_load 0}
${cpu cpu2}
${cpu cpu3} ${lua display_temp 1} ${lua display_load 1}
${cpu cpu4}
# ...

No estoy seguro de que esto sea correcto, debido a las cargas y temperaturas que veo a veces. En /proc/cpuinfo, ¿cómo se clasifican los núcleos? ¿Primero todo físico y luego todo virtual? ¿Cada núcleo físico entonces sus núcleos virtuales? ¿Cómo se ordenan?

Naftuli Kay
fuente

Respuestas:

16

Puede conocer cada núcleo de procesador examinando cada entrada de cpuinfo:

processor       : 0
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 0

processor       : 1
[...]
physical id     : 0
siblings        : 8
core id         : 1
cpu cores       : 4
apicid          : 2 

processor       : 2
[...]
physical id     : 0
siblings        : 8
core id         : 2
cpu cores       : 4
apicid          : 4 

processor       : 3
[...]
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 6

processor       : 4
[...]
physical id     : 0
siblings        : 8
core id         : 0
cpu cores       : 4
apicid          : 1

[and so on]

physical idmuestra el identificador del procesador. A menos que tenga una configuración multiprocesador (que tenga dos procesadores físicos separados en una máquina), siempre será 0.

siblings muestra el número de procesador conectado al mismo procesador físico.

core idmuestra el identificador del núcleo actual, hasta un total de cpu cores. Puede usar esta información para correlacionar qué procesador virtual entra en un solo núcleo.

apicid(y original apicid) muestra el número del procesador (virtual), tal como lo indica la BIOS.

Tenga en cuenta que hay 8 hermanos y 4 núcleos, por lo que hay 2 procesadores virtuales por núcleo. No hay distinción entre "virtual" o "real" en hyperthreading. Pero con esta información puede asociar qué procesadores son del mismo núcleo.

BatchyX
fuente
5

El /syssistema de archivos tiene una buena descripción de esta información. Aquí hay un ejemplo de un cuadro SMP quadcore con Hyperthreading:

# grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\t | sed 's,^,    ,'
/sys/devices/system/cpu/cpu0/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu1/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu2/topology/thread_siblings   00000000,00000404
/sys/devices/system/cpu/cpu3/topology/thread_siblings   00000000,00000808
/sys/devices/system/cpu/cpu4/topology/thread_siblings   00000000,00001010
/sys/devices/system/cpu/cpu5/topology/thread_siblings   00000000,00002020
/sys/devices/system/cpu/cpu6/topology/thread_siblings   00000000,00004040
/sys/devices/system/cpu/cpu7/topology/thread_siblings   00000000,00008080
/sys/devices/system/cpu/cpu8/topology/thread_siblings   00000000,00000101
/sys/devices/system/cpu/cpu9/topology/thread_siblings   00000000,00000202
/sys/devices/system/cpu/cpu10/topology/thread_siblings  00000000,00000404
/sys/devices/system/cpu/cpu11/topology/thread_siblings  00000000,00000808
/sys/devices/system/cpu/cpu12/topology/thread_siblings  00000000,00001010
/sys/devices/system/cpu/cpu13/topology/thread_siblings  00000000,00002020
/sys/devices/system/cpu/cpu14/topology/thread_siblings  00000000,00004040
/sys/devices/system/cpu/cpu15/topology/thread_siblings  00000000,00008080

El contenido idéntico denota hilos del mismo núcleo. Es decir

  • cpu0 / cpu8
  • cpu1 / cpu9
  • etc.

Hay información similar en el core_siblingspseudoarchivo, junto con aún más información de topología.

Felix Frank
fuente
3

Si ve el htindicador ' ' en, /proc/cpuinfoentonces tiene habilitado el hiperprocesamiento y cada núcleo real se divide en múltiples subprocesos, no hay concepto de subproceso real e hilo virtual: ambos son efectivamente virtuales.

Lo que quizás desee investigar es comparar núcleos y sockets, use el physical ididentificador de topología para agrupar núcleos.

Steve-o
fuente
El htindicador solo indica que la CPU admite múltiples subprocesos (HTT), no si está habilitado o no. Incluso entonces, no siempre se puede confiar en él, por ejemplo, indica falsamente que un i5 i5-6500 es compatible con HTT: ark.intel.com/content/www/us/en/ark/products/88184/…
Anthony G - justicia para Mónica
1

La respuesta anterior es muy interesante.

Después de buscar en Google, encontré algunos temas relacionados:

En el último enlace, el script de Python no funciona cuando su host tiene muchas ID físicas. Intenté modificarlo con una condición diferente al final:

Cambiando:

if p > 0:

a

if p % 2 == 1:

Pero no funciona como se esperaba, según el mensaje anterior. Por cierto, puedes hacer algo más completo que:

grep . /sys/devices/system/cpu/cpu{,1}?/topology/thread_siblings | tr : \\\t | sed -r 's,^,\s\s\s\s,'

con:

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

[...]

Lo que es interesante en un host de muchos núcleos con habilitación hyperthreading es la distribución de núcleos lógicos en el hardware.

Por ejemplo, en una de mi computadora (48 núcleos lógicos, 2 procesadores físicos, 24 (12 * 2) 'núcleos reales' (entonces, también 24 núcleos virtuales)):

for file in /sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list; do echo -n "$file "; cat $file; done |sort -k2 -n

 /sys/devices/system/cpu/cpu0/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu24/topology/thread_siblings_list 0,24
 /sys/devices/system/cpu/cpu1/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu25/topology/thread_siblings_list 1,25
 /sys/devices/system/cpu/cpu26/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu2/topology/thread_siblings_list 2,26
 /sys/devices/system/cpu/cpu27/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu3/topology/thread_siblings_list 3,27
 /sys/devices/system/cpu/cpu28/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu4/topology/thread_siblings_list 4,28
 /sys/devices/system/cpu/cpu29/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu5/topology/thread_siblings_list 5,29
 /sys/devices/system/cpu/cpu30/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu6/topology/thread_siblings_list 6,30
 /sys/devices/system/cpu/cpu31/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu7/topology/thread_siblings_list 7,31
 /sys/devices/system/cpu/cpu32/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu8/topology/thread_siblings_list 8,32
 /sys/devices/system/cpu/cpu33/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu9/topology/thread_siblings_list 9,33
 /sys/devices/system/cpu/cpu10/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu34/topology/thread_siblings_list 10,34
 /sys/devices/system/cpu/cpu11/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu35/topology/thread_siblings_list 11,35
 /sys/devices/system/cpu/cpu12/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu36/topology/thread_siblings_list 12,36
 /sys/devices/system/cpu/cpu13/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu37/topology/thread_siblings_list 13,37
 /sys/devices/system/cpu/cpu14/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu38/topology/thread_siblings_list 14,38
 /sys/devices/system/cpu/cpu15/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu39/topology/thread_siblings_list 15,39
 /sys/devices/system/cpu/cpu16/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu40/topology/thread_siblings_list 16,40
 /sys/devices/system/cpu/cpu17/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu41/topology/thread_siblings_list 17,41
 /sys/devices/system/cpu/cpu18/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu42/topology/thread_siblings_list 18,42
 /sys/devices/system/cpu/cpu19/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu43/topology/thread_siblings_list 19,43
 /sys/devices/system/cpu/cpu20/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu44/topology/thread_siblings_list 20,44
 /sys/devices/system/cpu/cpu21/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu45/topology/thread_siblings_list 21,45
 /sys/devices/system/cpu/cpu22/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu46/topology/thread_siblings_list 22,46
 /sys/devices/system/cpu/cpu23/topology/thread_siblings_list 23,47
 /sys/devices/system/cpu/cpu47/topology/thread_siblings_list 23,47

Significa que cpu0 y cpu24 comparten la misma "dirección" de hardware físico. Lo mismo para cpu1 y cpu25 ...

Entonces, básicamente, si quisiera deshabilitar hyperthreading desde mi sistema operativo Linux, debería poner '0' en la CPU {24..47} / en línea con

for fake_cpu in {24..47}; do echo 0 > /sys/devices/system/cpu/cpu$fake_cpu/online;done

Notarás lo interesante que es mi sistema para numerar los núcleos.

remyd1
fuente
Utilice bloques de código en lugar de comillas para cosas en el terminal; Es mucho más simple de leer.
HalosGhost
1

también puedes usar lscpu:

# lscpu --all --extended
CPU NODE SOCKET CORE L1d:L1i:L2:L3:L4 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
1   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
2   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
3   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000
4   0    0      0    0:0:0:0:0        yes    3200.0000 800.0000
5   0    0      1    1:1:1:0:0        yes    3200.0000 800.0000
6   0    0      2    2:2:2:0:0        yes    3200.0000 800.0000
7   0    0      3    3:3:3:0:0        yes    3200.0000 800.0000

aquí los núcleos lógicos 0 y 4 van al núcleo 0

NickSoft
fuente