Por que um único thread está espalhado pelas CPUs?

24

Só estou curioso para saber por que o agendador move constantemente um aplicativo entre CPUs, em vez de mantê-lo em um. Parece um pouco tolo ter 4 núcleos a 25% em vez de um a 100%.

Tem a ver com calor, ou é mais eficiente de alguma forma? Outros SOs fazem isso de maneira diferente?

Informações ou links para informações detalhadas seriam ótimas. (Não foi possível encontrar muito.)

Atualizar:

Por "espalhar", não quero dizer que ele seja executado em vários processadores de uma só vez, mas esteja sendo movido de um para outro várias vezes por segundo, fazendo com que o efeito pareça espalhado.

Macke
fonte
3
Mesmo quando "nada mais está sendo executado", sempre há threads do sistema competindo pela CPU. Por exemplo, o sistema operacional tem um encadeamento para zerar as páginas de memória recuperada; assim, quando a memória for necessária, haverá algumas páginas prontas para serem usadas. Quando o seu thread for executado novamente, a CPU em que você estava pode estar em uso por um desses threads. O que o sistema operacional deve fazer? Aguarde ou mova você para uma nova CPU? Seja como for, você acaba tendo um comportamento indesejável em alguns casos.
Tony Lee
É um goomba. SMB, não LBP. :)
Macke
Na minha "resposta", mostrei um único programa encadeado que se comporta exatamente como você descreve, ou seja, "sendo movido de um para o outro várias vezes por segundo, fazendo com que o efeito pareça espalhado".
Evan Rosica

Respostas:

8

Eu acho wierobque descreveu o assunto razoavelmente bem.
Aqui está um artigo mais antigo discutindo processor affinityconfigurações com um QX6800 de quatro núcleos .
(o link aponta para a segunda página desse artigo).

Se você não força a afinidade do processo a um núcleo, perde desempenho ?

  • Embora o agendador do Windows precise decidir essa afinidade para evitar trocas com caches,
    o próprio design do processador também considera essas coisas.
  • O Intel QX6800 quad-core (desde que o referi anteriormente nesta resposta)
    possui um cache de 8 MB L3compartilhado em seus 4 núcleos .

Note-se que, embora você tenha optado por executar apenas esse processo de thread único no sistema, o próprio sistema operacional terá várias outras tarefas em execução que também precisam ser agendadas. O planejador equilibra toda essa atividade no conjunto de processadores disponíveis (ou núcleos).


No futuro, com a arquitetura Nehalem e o NUMA , os
processadores em vários soquetes também poderão lidar melhor com o thrash de acesso.
Aqui está uma rápida imagem de uma página da ArsTechnica no NUMA .

insira a descrição da imagem aqui

Se Nehalem e i7lhe interessar, tenho mais alguns links nesta resposta .

nik
fonte
O que faz você pensar que "no futuro, com a arquitetura Nehalem e o NUMA, os processadores em vários soquetes também poderão lidar melhor com o thrash de acesso". ? A meu ver, o NUMA torna a memória ainda mais local e relacionada ao processador, piorando os efeitos do lixo.
Roland Pihlakas
@RolandPihlakas, já faz um tempo desde essa resposta, mas olhando para o artigo da arstechnica e esses pontos, acho que estava explicando a capacidade das novas plataformas de ter melhor conectividade de memória e o software para tirar vantagem disso (por não ter essa opção com várias configurações de soquete naquele momento; ou seja, antes de Nehalem).
Nik
6

O agendador apenas executa o próximo encadeamento que está pronto para execução em um núcleo / CPU "livre".

Você pode atribuir um processo a uma CPU específica através do gerenciador de tarefas do Windows.

Ter 4 núcleos a 25% significa que 4 threads são executados simultaneamente. Enquanto um núcleo em x% significa que apenas um segmento é executado. Portanto, o primeiro é mais eficiente em alguns casos.

Porém, durante sua execução, o cache da CPU é preenchido com dados acessados ​​pelo encadeamento. Portanto, se o encadeamento for executado em outra CPU, ocorrerá mais falhas de cache, que são caras, pois os dados não estão no cache dessa CPU.

O que o seu tópico faz? Se o encadeamento "dormir" por um período muito curto, o núcleo em que foi executado anteriormente poderá ser ocupado por outra ameaça e, portanto, seu encadeamento será executado no próximo núcleo disponível. O que acontece se você especificar apenas um núcleo para ser usado pelo seu processo (por exemplo, um gerenciador de tarefas)?

wierob
fonte
3
O agendador do Windows faz um bom trabalho em manter os threads no mesmo processador / núcleo durante sua duração, para evitar esse problema.
Paxxi 20/08/09
@ Pär: Meu thread parece estar sendo executado em cada núcleo, na verdade.
26409 Macke
Sim, provavelmente é o processo do SO que afeta meu segmento. Como aceitar duas respostas? :)
Macke
@ PärBjörklund da minha experiência, pelo menos, Windows XP não. Acho que o problema "cache-saltitante" foi fixado em Vista ou posterior
Waxhead
11
"Ter 4 núcleos a 25% significa que 4 threads são executados simultaneamente." Não, significa que um thread é executado, um pouco em um núcleo, depois outro e assim por diante. Como o Gerenciador de Tarefas mostra o uso médio, ele mostrará 25% (em um sistema com 4 núcleos, em dois núcleos mostraria 50%) para cada núcleo. Isso significa que o núcleo foi totalmente utilizado um quarto de tempo e ficou ocioso com o tempo.
David Balažic
0

Não é. Um thread pode ser executado apenas em um processador. No entanto, alguns processos têm vários threads, que podem ser espalhados.

O raciocínio, acredite ou não, nunca considerou como é. O sistema tenta espalhar threads porque não tem como saber quando alguém irá disparar.

tsilb
fonte
11
Veja meus esclarecimentos adicionais. Esse é um encadeamento, que está sendo executado a toda velocidade, sendo rapidamente movido para que, com o tempo, cada núcleo (fora da frente) fique 25% ocupado. (Todos os outros processos / threads são neglible)
Macke
0

O sistema operacional migra o encadeamento pelos núcleos da CPU (rapidamente, várias vezes por segundo). É mais eficiente executá-lo no mesmo núcleo o tempo todo. Isso pode ser imposto pelo item de menu de contexto "Definir afinidade" no Gerenciador de tarefas.

Observe que geralmente (uso doméstico típico) a diferença está no intervalo de poucas porcentagens.

Os "4 núcleos cada um com 25% de uso" significam, como o Gerenciador de Tarefas mostra o uso médio, que cada núcleo foi totalmente utilizado um quarto de tempo e liberou o restante do tempo.

A descrição é para Windows, mas também é semelhante em outros sistemas operacionais.

David Balažic
fonte
-1

Se alguém ainda está lendo isso, eu também notei isso e realizei alguns testes para ver se não é apenas um acaso. Acontece que não é! Acredito que espalhar um único thread por todos os núcleos seja mais eficiente por vários motivos:

  1. Espalhar uma rosca em todos os núcleos permite um menor consumo de energia. A maioria dos processadores diminui suas frequências e, mais importante, a tensão de acordo com a carga; portanto, um Core 2 Quad, por exemplo, consome muito menos energia e produz menos calor, espalhando um thread pelos 4 núcleos em vez de usar um núcleo (o que seria aumentam a voltagem em TODOS os núcleos, pois existe apenas um regulador de voltagem * - o que é bastante ineficaz).
  2. Garante que a rosca sempre funcione à velocidade máxima / constante. Se o encadeamento solicitar subitamente mais poder de processamento, um núcleo poderá ficar sobrecarregado e haverá um atraso na execução. Ao espalhá-lo pelos núcleos, qualquer pico repentino será tratado sem problemas, sem atrasos e atrasos.

Além disso, devido às duas observações acima, acredito que o Turbo Boost e a IDA são ineficazes. Eles podem ser úteis em sistemas operacionais mais antigos, mas o Linux e o Windows 7 espalham tudo por todos os núcleos com bastante eficiência. Portanto, um Core 2 Quad q9100 a 2,26 GHz quase (sempre há exceções :-) sempre será mais rápido que um Core 2 Duo X9100 a 3,06 GHz, e raramente o vi usar o IDA (basicamente o antecessor do Turbo boost, aumenta a frequência em um ou dois núcleos apenas para aplicativos de thread único).

  • O Core 2 Quad possui dois domínios de clock, graças ao fato de existirem duas matrizes físicas, de modo que dois núcleos podem funcionar com frequência total, enquanto dois estão com a frequência mais baixa. Porém, não sei se existem dois reguladores de tensão - notei que a tensão é uniforme em todos os quatro núcleos; portanto, deve haver apenas um regulador para todo o pacote.
JakL
fonte
3
Isso soa duvidoso por vários motivos. Por favor, forneça referências aos seus "fatos". Primeiro, por que coisas de computação a 25% em quatro núcleos consomem menos energia do que 100% em um? (Posso concordar que o calor é distribuído de maneira mais uniforme, mas ...) Além disso, o fio na minha pergunta está rodando a toda a velocidade (100%), portanto não "solicita mais poder de processamento", porque já está fazendo tanto quanto possível.
Macke
Bem, isso é apenas das minhas próprias observações - fiquei intrigado com a IDA e o TurboBoost, decidi fazer alguns testes. Foi há muito tempo, mas cheguei às conclusões acima. O processador consome menos energia, pois todos os núcleos funcionam com uma tensão mais baixa - uma redução de 0,1V economiza cerca de 6 a 10 Watts no consumo de energia (se um núcleo é carregado 100%, todos os núcleos funcionam com uma tensão mais alta, independentemente de estarem ociosos ou não). Isto é especialmente verdade no Core2Duo com o modo SLFM. Você está certo sobre o encadeamento que está sendo executado na inclinação máxima, não solicitando mais tatos de processador, mas existem aplicativos que realmente fazem isso.
26411 JakL
Não existe algo como "espalhar um fio" (não, nem mesmo cinco anos depois). Há um único encadeamento, executado em um núcleo. E depois mais tarde. E assim por diante. A cada momento, um núcleo está funcionando a 100% e os outros estão ociosos. Portanto, não há economia. Especialmente quando você menciona quando todos os núcleos estão com tensão total o tempo todo (como você disse, eles compartilham tensão). Além disso, como já foi abordado, estar no mesmo núcleo garante que o thread obtenha todo o poder de processamento existente. Como esse núcleo já é 100% usado, o sistema operacional agendará outros threads para outros núcleos menos utilizados.
David Balažic