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.
- Quais núcleos correspondem a cada "CPU" abaixo?
- (Digamos) a CPU 6 e a CPU 7 abaixo representam um núcleo; o HT e o núcleo real?
- 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)
- 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?
- 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.
windows
scheduling
hyper-threading
affinity
Charles Burns
fonte
fonte
Respostas:
Supondo que temos os Núcleos 1, 2, 3 e 4, CPU4 e CPU5 representam o núcleo 3.
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.
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.
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.
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 !
fonte
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.
fonte
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.
fonte