Como a afinidade do processador do Windows funciona com CPUs com hyperthread?

27

Como a afinidade do processador do Windows funciona com CPUs com hyperthread? Vamos usar um exemplo (foto) de um sistema com quatro núcleos, cada um com um núcleo virtual hiperencadeado.

  1. Quais núcleos correspondem a cada "CPU" abaixo?
  2. (Digamos) a CPU 6 e a CPU 7 abaixo representam um núcleo; o HT e o núcleo real?
  3. Se, por exemplo, a CPU 6 representa um núcleo real e a CPU 7 um núcleo HT, um encadeamento atribuído apenas a CPU7 terá apenas o que resta dos recursos de um núcleo real? (supondo que o núcleo esteja executando outras tarefas)
  4. O hyperthreading é gerenciado inteiramente no processador, de modo que os threads sejam manipulados internamente? Em caso afirmativo, isso está no escopo da CPU ou no escopo principal? Exemplo: Se a CPU 6 e 7 representam um núcleo, não importa a que processo está atribuído, porque a CPU atribuirá recursos conforme apropriado a um encadeamento em execução?
  5. Percebo que os processos single-threaded de execução longa são refletidos bastante nos núcleos, pelo menos de acordo com o gerenciador de tarefas. Isso significa que atribuir um processo a um único núcleo melhorará um pouco o desempenho (evitando alternâncias de contexto e invalidações de cache, etc.)? Nesse caso, posso saber que não estou atribuindo a "apenas um núcleo virtual"?

Tudo isso é muito vago e confuso para mim. O HT é ótimo, mas com certeza parece reduzir a transparência da alocação de recursos.

Menu de afinidade do processador

Charles Burns
fonte
Só para você saber, todo núcleo de CPU que você vê é um "núcleo virtual". Cada um tem uma conexão física com a CPU, o termo "virtual" vem de como o Windows agenda os processos nessas CPUs, devido à implementação de hyperthreading de hardware. Veja minha resposta para mais detalhes.
Revelação
Além disso, um último comentário para você. "O HT é ótimo, mas com certeza parece reduzir a transparência da alocação de recursos." Isso é 100% verdade, mas há pouco que você pode fazer sobre isso, nem há muitas razões para fazer algo a respeito. Todos os sistemas operacionais modernos sabem o que é hyperthreading, a maioria possui agendadores de processador avançados para compensá-lo e, além de alguns casos específicos (e eu quero dizer poucos), quase sempre há um benefício de desempenho.
Revelação

Respostas:

18

Quais núcleos correspondem a cada "CPU" abaixo?

Supondo que temos os Núcleos 1, 2, 3 e 4, CPU4 e CPU5 representam o núcleo 3.

(Digamos) a CPU 6 e a CPU 7 abaixo representam um núcleo; o HT e o núcleo real?

Não há distinção entre os dois - ambos têm interfaces físicas de hardware para a CPU, a interface lógica é implementada em hardware (consulte a folha de dados do processador Intel Core, volume 1 para obter mais detalhes). Basicamente, cada núcleo tem duas unidades de execução separadas, mas compartilha alguns recursos comuns entre eles. É por isso que, em certos casos, o hyperthreading pode realmente reduzir o desempenho.

Se, por exemplo, a CPU 6 representa um núcleo real e a CPU 7 um núcleo HT, um encadeamento atribuído apenas a CPU7 terá apenas o que resta dos recursos de um núcleo real? (supondo que o núcleo esteja executando outras tarefas)

Veja acima. Um thread atribuído a ONLY CPU6 ou ONLY CPU7 será executado exatamente na mesma velocidade (assumindo que o thread faça o mesmo trabalho e os outros núcleos do processador estejam ociosos). O Windows conhece os processadores habilitados para HT e o agendador de processos leva essas coisas em consideração.

O hyperthread é gerenciado inteiramente dentro do processador, de modo que os threads sejam manipulados internamente? Em caso afirmativo, isso está no escopo da CPU ou no escopo principal? Exemplo: Se a CPU 6 e 7 representam um núcleo, não importa a que processo está atribuído, porque a CPU atribuirá recursos conforme apropriado a um encadeamento em execução?

Ambos. O hardware real em si não agenda em quais núcleos os programas devem ser executados; esse é o trabalho do sistema operacional. A própria CPU, no entanto, é responsável pelo compartilhamento de recursos entre as unidades de execução reais, e a Intel determina como você pode escrever código para torná-lo o mais eficiente possível.

Percebo que os processos single-threaded de execução longa são refletidos bastante nos núcleos, pelo menos de acordo com o gerenciador de tarefas. Isso significa que atribuir um processo a um único núcleo melhorará um pouco o desempenho (evitando alternâncias de contexto e invalidações de cache, etc.)? Nesse caso, posso saber que não estou atribuindo a "apenas um núcleo virtual"?

Esse é um comportamento normal e, não, atribuí-lo a um único núcleo não melhorará o desempenho. Dito isto, se por algum motivo você quiser garantir que um único processo seja executado apenas em um único núcleo físico, atribua-o a qualquer processador lógico.

A razão pela qual o processo "volta" é devido ao agendador do processo. Esse é um comportamento normal, e você provavelmente terá um desempenho reduzido ao limitar em quais núcleos o processo pode executar (independentemente de quantos threads ele tenha), já que o agendador de processos agora precisa trabalhar mais para fazer tudo funcionar com as restrições impostas. Sim, essa penalidade pode ser insignificante na maioria dos casos, mas a linha inferior é, a menos que você tenha um motivo para fazer isso, não !

Avanço
fonte
5

O layout da CPU deve ser organizado para que um sistema operacional que não reconheça todas as suas CPUs obtenha o desempenho máximo possível. Isso significa que um núcleo virtual de cada núcleo físico será listado antes da listagem de um segundo núcleo virtual de qualquer núcleo físico.

Por exemplo, digamos que você tenha quatro núcleos hiperencadeados, chamados A, B, C e D. Se você assumir que A e B compartilham um cache L2 e C e D compartilham um cache L2, a ordem deve ser algo como:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

Dessa forma, um sistema operacional que pega apenas duas CPUs usa todo o cache L2. Além disso, um sistema operacional que pega apenas quatro CPUs usa todas as unidades de execução.

Novamente, é assim que deve ser.

Obviamente, se você estiver usando um sistema operacional que entenda a topologia da CPU, isso não importa. O BIOS preenche uma tabela que explica quais núcleos compartilham unidades de execução, que compartilham caches e assim por diante. Todos os sistemas operacionais modernos que você provavelmente usa, que suportam totalmente sua CPU, compreendem a topologia completa da CPU.

David Schwartz
fonte
1
  1. Como eles correspondem depende de como sua CPU e placa mãe enumeram e identificam os núcleos. O que deveria acontecer é que os soquetes físicos sejam enumerados primeiro, os núcleos lógicos a seguir e os núcleos virtuais por último. No seu caso, os núcleos 0-3 devem ser físicos e 4-7 os núcleos virtuais do HT. A principal razão para isso é que, caso você execute um sistema operacional que não consiga lidar com todas as unidades de execução disponíveis, é mais provável que obtenha as unidades mais independentes antes das unidades compartilhadas. Não seria bom se um sistema operacional hipotético de apenas 2 CPUs encontrasse um par HT no sistema em vez de 2 núcleos distintos. (Esse era um problema real para alguns sistemas HT anteriores, antes que os agendadores do kernel pudessem ser atualizados para as novas CPUs.)
  2. Não. Veja 1.
  3. Não. HT é mais complexo que isso. Lembre-se de que os 2 núcleos virtuais geralmente compartilham alguns recursos enquanto outros bits são separados, mas que apenas um ou o outro pode estar executando por vez.
  4. Tipo de. Seu exemplo (dadas as suposições) geralmente está correto. No entanto, se o aplicativo puder saber que tipo de carga de trabalho está em execução, ele poderá ajudar o SO a agendar encadeamentos adequadamente.
  5. Há uma boa razão para o salto de núcleo: espalhar a carga de trabalho térmica. Como em muitos casos os caches de nível superior (L2, L3) são compartilhados em todos os núcleos de qualquer maneira, o salto de núcleo não terá um impacto significativo no desempenho, mas o impacto térmico será significativo porque você não terá um "hot spot" no o núcleo que está constantemente funcionando enquanto os outros ficam ociosos. Agora, cruzar soquetes em um sistema com vários soquetes (particularmente um sistema NUMA) pode ter um impacto significativo no desempenho. A maioria dos agendadores está ciente disso e leva isso em consideração.

Em última análise, o que isso se resume é que muitas vezes você (como usuário final) pode fazer com a afinidade do encadeamento para afetar significativamente o desempenho, além de garantir que você esteja executando um sistema operacional atualizado que conheça os vários bits em Seu sistema.

Se você encontrar alguma carga de trabalho em que a atribuição manual de afinidade tenha um impacto significativo, relate isso como um bug ao desenvolvedor do aplicativo, para que o programa possa ser corrigido.

afrazier
fonte
4
"os núcleos 0-3 devem ser núcleos físicos e 4-7 os núcleos virtuais HT" Na verdade, o núcleo 0 e o núcleo 1 correspondem ao mesmo núcleo físico (único). Cada "núcleo hyperthreaded" possui duas conexões físicas com a CPU, portanto o Windows vê literalmente 8 núcleos físicos. Apenas sabe que a CPU possui hyperthreading. Consulte a folha de dados do Intel Core para obter mais detalhes sobre isso, se você estiver interessado.
Revelação
@ Breakthrough Isso não seria uma boa topologia, porque isso significaria que um sistema operacional ingênuo que suporta apenas 4 núcleos acabaria usando apenas metade dos núcleos físicos. Um núcleo virtual de cada núcleo físico deve aparecer na lista de núcleos virtuais antes que um segundo núcleo virtual de qualquer núcleo físico seja listado.
David Schwartz
@DavidSchwartz Boa topologia ou não, é assim que os processadores lógicos são enumerados. Portanto, é amplamente recomendado desativar o hyperthreading em sistemas operacionais antigos (por exemplo, Windows 2000 e versões anteriores) que não enumere adequadamente os LPs versus os núcleos e os pacotes físicos da CPU.
Jamie Hanrahan