Percebi que, para qualquer tarefa de thread único de longa duração, meu PC doméstico aloca o uso total para um único núcleo lógico para todo o processo. No entanto, para exatamente o mesmo processo, meu PC de trabalho compartilha a carga entre todos os núcleos (cada núcleo executa o processo de thread único).
Ambos os PCs executam o Windows 10. Meu PC doméstico tem uma CPU e uma placa-mãe diferentes (ASUS ROG 11ª edição).
Este parece ser o caso de qualquer processo, mas o exemplo que acabei de testar é um script R que escrevi. Ambos os PCs executando exatamente o mesmo script R, a mesma versão do R, têm abordagens diferentes para o compartilhamento de carga da CPU. O pior é que meu PC doméstico parece sempre usar CPU0 para esse tipo de coisa.
Espero que haja uma configuração de BIOS que eu possa aplicar no meu PC doméstico para que ele compartilhe a carga uniformemente. Existe?
O escalonamento de threads para núcleos é uma arte, e muito difícil. Isso tem a ver com a maneira como as CPUs multicore modernas gerenciam seu perfil térmico. Dependendo do modelo exato, a CPU pode fazer mais ou menos de um ou mais dos seguintes itens:
Isso implica que, para uma carga de trabalho de thread único (como um
R
script), a melhor estratégia varia muito:Qualquer que seja a escolha do agendador, você deve confiar que ele fará um trabalho melhor do que qualquer ser humano jamais poderia fazer.
Não. O BIOS de um computador pode controlar quais núcleos da CPU são ativados ou desativados e a velocidade do núcleo, mas não tem controle sobre o que é executado nele. A execução de um programa e seus threads são controlados pelo sistema operacional.
Agora, por que os dois computadores se comportam de maneira diferente, bem, essa é uma questão completamente diferente. Pode ser a configuração do sistema operacional ou a configuração do R. Isso precisaria ser feito em uma pergunta diferente e exigiria mais detalhes sobre suas configurações de hardware e software.
Também quero observar que não há nada de errado em executá-lo apenas em um núcleo. Executar programas é o que ele foi projetado para fazer. Talvez seu computador de trabalho esteja executando mais tarefas simultâneas e precise conciliar o uso da CPU. Pode ser que seu computador doméstico tenha núcleos mais rápidos e não precise trocar threads por outros núcleos.
Acredito que o culpado mais provável é que sua máquina doméstica esteja utilizando um recurso no agendador do Windows 10, amplamente conhecido como suporte de "núcleo favorecido", que prioriza os núcleos de alto desempenho em detrimento dos de baixo desempenho. Antes de 2018, geralmente se podia confiar em uma CPU de desktop para executar um thread na mesma velocidade, independentemente do núcleo em que você o colocasse. Mesmo que um núcleo fosse teoricamente capaz de funcionar em uma frequência mais alta para uma determinada voltagem do que outro núcleo, a CPU não foi projetada para permitir isso.
Foi apenas com o advento das CPUs Zen+ Ryzen da AMD em 2018 que uma mudança nesse cenário se generalizou. Com esses modelos, a AMD começou a permitir que CPUs com núcleos de qualidade mista aumentassem para diferentes frequências de clock, dependendo de quais núcleos estivessem sob carga. Isso se tornou amplamente ineficaz quando o agendador trocou o thread para cada núcleo, independentemente do perfil de desempenho. A penalidade de desempenho foi agravada pela arquitetura da AMD de ter os núcleos divididos em grupos chamados "CCX"s; transferir um thread de um núcleo para outro dentro de um CCX é mais rápido do que espalhá-lo entre diferentes CCXs.
As CPUs "Extreme Edition" da Intel também têm esse tipo de suporte explícito e de desempenho misto. Eles se referem a ele como Tecnologia Intel Turbo Boost Max 3.0 . A Intel afirma que a versão mais antiga do Windows 10 que suporta isso é "RS5", que parece ser 1809.
Até 2019, todas as versões do Windows ignoravam esses fatos e agendavam threads igualmente em todos os núcleos físicos para CPUs AMD. A versão 1903 do Windows 10 incluía um agendador atualizado que reconhece as unidades CCX da AMD e tenta manter os threads na mesma unidade. link
O Windows 10 versão 1909 trouxe mais melhorias para o agendador, agora tornando-o ciente da situação de núcleo de desempenho misto, em um recurso chamado de "Otimização de núcleo de CPU favorecida". link
Admito que meu entendimento dessa linha do tempo não é 100% certo, e os núcleos favoritos podem ser utilizados em versões anteriores, mas tem sido surpreendentemente difícil encontrar informações concretas sobre isso. A maioria das postagens de notícias parece concordar que o suporte ao "núcleo favorecido" é totalmente novo para 1909, apesar da linguagem implicar que estava presente em versões anteriores.
A arquitetura ARM na verdade tinha suporte explícito para uma configuração de desempenho misto como esta chamada "big.LITTLE" desde 2011 . Uma compilação do Windows 10 que roda em ARM foi lançada em 2017 , e o suporte para big.LITTLE foi incluído desde o início ou pelo menos até 2018 . Isso parece ter se encaixado muito bem com a adição de suporte para nossa situação moderna de Intel e AMD.
Como um aparte, os núcleos lógicos são excluídos apenas até serem necessários porque estão estacionados, não porque o próprio escalonador os entenda. link