Por que um único encadeamento é distribuído entre as CPUs?

23

Eu só estou curioso porque o agendador constantemente move um aplicativo entre CPUs, ao invés de mantê-lo em um. Parece um pouco bobo ter 4 núcleos a 25% em vez de um a 100%.

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

Insights ou links para informações detalhadas seriam legais. (Não foi possível encontrar muito eu mesmo.)

Atualização:

Por "espalhar-se", não quero dizer que ele seja executado em várias CPUs de uma só vez, mas está sendo movido de uma para a outra várias vezes por segundo, fazendo com que o efeito fique espalhado.

    
por Macke 20.08.2009 / 09:04

5 respostas

8

Eu acho que wierob descreveu o ponto razoavelmente bem. Aqui está um artigo mais antigo discutindo processor affinity configurações com um quad-core QX6800 .
(o link aponta para a segunda página desse artigo).

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

  • Enquanto o agendador do Windows precisa decidir essa afinidade para evitar a espelhamento com caches,
    o design de processador também considera essas coisas.
  • O Intel QX6800 quad-core (desde que eu a referi anteriormente nesta resposta)
    tem um cache 8MB L3 compartilhado em seus 4 núcleos .

Deve-se notar que, embora você tenha escolhido executar apenas este processo de um único encadeamento no sistema, o próprio SO teria várias outras tarefas em execução que também precisam ser programadas. O agendador equilibra toda essa atividade no conjunto de processadores (ou núcleos) disponíveis.

Indo adiante, com a arquitetura Nehalem e NUMA ,
processadores em vários sockets também poderão endereçar melhor o thrash de acesso.
Aqui está uma foto rápida de uma página da ArsTechnica em NUMA .

SeNehalemei7teinteressam,eutenhomaisalguns links para esta resposta .

    
por 20.08.2009 / 15:03
6

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

Você pode atribuir um processo a uma CPU específica por meio do gerenciador de tarefas do Windows.

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

Mas durante a sua execução, o cache da CPU é preenchido com os dados acessados pelo encadeamento. Portanto, se o encadeamento for executado em outra CPU, ele sofrerá mais falhas de cache, que são caras, já que os dados não estão no cache dessa CPU.

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

    
por 20.08.2009 / 09:14
1

O sistema operacional migra o thread 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.

Note que normalmente (uso doméstico típico) a diferença está na faixa de poucas porcentagens.

Os "4 núcleos cada 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 o Windows, mas é semelhante em outros sistemas operacionais também.

    
por 04.12.2016 / 18:12
0

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

O raciocínio, acredite ou não, nunca considerou o que parece. O sistema tenta espalhar os segmentos porque não tem como saber quando um deles irá disparar.

    
por 20.08.2009 / 09:09
-1

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

  1. A distribuição de um thread em todos os núcleos permite um menor consumo de energia. A maioria dos processadores diminui suas frequências e, mais importante, a voltagem de acordo com a carga, por exemplo, um Core 2 Quad consumirá muito menos energia e produzirá menos calor ao espalhar um thread por todos os 4 núcleos em vez de usar um núcleo (o que Levar a tensão a aumentar em TODOS os núcleos, uma vez que existe apenas um regulador de tensão * - que é bastante ineficaz).
  2. Garante que o encadeamento sempre funcione na velocidade máxima / constante. Se o encadeamento de repente solicitar 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 suavemente sem atrasos e atrasos.

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

  • O Core 2 Quad tem dois domínios de relógio, graças ao fato de que existem dois dados físicos, de modo que dois núcleos podem rodar na freqüência total, enquanto dois estão na frequência mais baixa. Eu não sei se há dois reguladores de tensão, no entanto - eu notei que a tensão é uniforme em todos os 4 núcleos, então deve haver apenas um regulador para o pacote inteiro.
por 25.06.2011 / 17:59