Como sei quais processadores são núcleos físicos?

15

Eu tenho um Intel i7 2700k aqui e gostaria de saber como posso saber quais processadores são físicos e quais são virtuais (ou seja: hyperthreading). Atualmente, estou executando um script Conky para exibir meus temps, frequências e cargas de CPU, mas não tenho certeza se fiz corretamente:

impressionante

Eu escrevi meu próprio script para obter temperaturas e frequências i7z, mas elas correspondem apenas a núcleos físicos. Atualmente, estou exibindo cada núcleo assim:

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

Não tenho certeza se isso está correto, devido às cargas e temperaturas que vejo às vezes. Em /proc/cpuinfo, como os núcleos são classificados? Primeiro tudo físico, depois tudo virtual? Cada núcleo físico, em seguida, seus núcleos virtuais? Como eles são classificados?

Naftuli Kay
fonte

Respostas:

16

Você pode conhecer cada núcleo do processador examinando cada entrada do 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 idmostra o identificador do processador. A menos que você tenha uma configuração de multiprocessador (com dois processadores físicos separados em uma máquina), sempre será 0.

siblings mostra o número de processador conectado ao mesmo processador físico.

core idmostre o identificador do núcleo atual, em um total de cpu cores. Você pode usar essas informações para correlacionar qual processador virtual entra em um único núcleo.

apicid(e original apicid) mostra o número do processador (virtual), conforme fornecido pelo BIOS.

Observe que existem 8 irmãos e 4 núcleos, portanto, há 2 processadores virtuais por núcleo. Não há distinção entre "virtual" ou "real" no hyperthreading. Mas, usando essas informações, você pode associar quais processadores são do mesmo núcleo.

BatchyX
fonte
5

O /syssistema de arquivos possui uma boa visão geral dessas informações. Aqui está um exemplo de uma caixa quadcore SMP com 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

Conteúdo idêntico denota tópicos do mesmo núcleo. Ou seja,

  • cpu0 / cpu8
  • cpu1 / cpu9
  • etc.

Há informações semelhantes no core_siblingspseudo-arquivo, além de mais informações de topologia.

Felix Frank
fonte
3

Se você vir o htsinalizador ' ' /proc/cpuinfo, você terá o hyperthreading ativado e cada núcleo real será dividido em vários threads, não haverá conceito de thread real e virtual: ambos são efetivamente virtuais.

O que você pode querer investigar é comparar núcleos e soquetes, use o physical ididentificador de topologia para agrupar núcleos.

Steve-o
fonte
O htsinalizador indica apenas que o multi-threading (HTT) é suportado pela CPU - não se estiver ativado ou não. Mesmo assim, nem sempre se pode confiar, por exemplo, indica falsamente que um i5 i5-6500 suporta HTT: ark.intel.com/content/www/us/en/ark/products/88184/…
Anthony G - justiça para Monica
1

Resposta anterior é muito interessante.

Depois de pesquisar no Google, encontrei alguns assuntos relacionados:

No último link, o script python não funciona quando o host possui muitos IDs físicos. Tentei modificá-lo com uma condição diferente no final:

Alterando:

if p > 0:

para

if p % 2 == 1:

Mas não funciona como esperado, com base na mensagem anterior. A propósito, você pode fazer algo mais abrangente do que:

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

com:

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

[...]

O que é interessante em um host de muitos núcleos com o hyperthreading é a distribuição de núcleos lógicos no hardware.

Por exemplo, em um dos meus computadores (48 núcleos lógicos, 2 processadores físicos, 24 (12 * 2) 'núcleos reais' (também 24 núcleos virtuais)):

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

Isso significa que cpu0 e cpu24 compartilham o mesmo "endereço" de hardware físico. A mesma coisa para cpu1 e cpu25 ...

Então, basicamente, se eu quiser desativar o hyperthreading no meu sistema operacional linux, devo colocar '0' na CPU {24..47} / online com

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

Você notará o quão interessante meu sistema está numerando os núcleos.

remyd1
fonte
Por favor, use blocos de código em vez de aspas para itens no terminal; é muito mais simples de ler.
HalosGhost
1

você também pode usar o 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

aqui os núcleos lógicos 0 e 4 vão para o núcleo 0

NickSoft
fonte