Desempenho lógico versus físico da CPU

2

Um computador tem 2 núcleos físicos e 4 núcleos lógicos (por exemplo, um computador com um processador i5-3210M).

Quando um programa A é executado, htop mostra que ele usa 100% de 1 núcleo, e outros 3 núcleos estão quase ociosos. A taxa de transferência nesse caso é X.

Minha pergunta é, se eu executo 4 instâncias de A em 4 núcleos lógicos, então a taxa de transferência total é 4X ou 2X? E se eu executar apenas duas instâncias?

    
por vhl 27.07.2016 / 13:22

3 respostas

1

O conceito de núcleos não é tão simples. Os núcleos lógicos são o número de núcleos físicos vezes o número de threads que podem ser executados em cada núcleo. Isso é conhecido como HyperThreading . Se eu tiver um computador que tenha um processador de 4 núcleos, execute dois threads por núcleo, então tenho 8 processadores lógicos. Você pode ver os recursos principais de seus computadores executando o comando lscpu .

Se um processador tiver 4 núcleos, mas ele puder executar 8 segmentos em paralelo, significa que ele possui apenas 4 núcleos (unidades de processamento). Mas pode dar suporte de hardware para 8 threads em paralelo . Claramente, no máximo 4 trabalhos podem ser executados nos núcleos. Um job em execução no núcleo, se por qualquer meio parar para memória ou operação de E / S , outro thread pode usar esse núcleo livre.

Até agora você entende que, se o seu computador tiver 2 núcleos físicos e puder executar 2 threads por núcleo, você terá 4 processadores lógicos . Portanto, você pode executar apenas duas instâncias, pois tem dois núcleos físicos, o que significa que você está usando todos os recursos de núcleos físicos únicos (dois segmentos por vez). Então a taxa de transferência será de 50%. Mas se, a qualquer momento, um encadeamento ficar ocioso, o núcleo poderá carregar um encadeamento nesse núcleo.

Você pode desativar o HyperThreading no BIOS (algo como " Intel ht technology ") e ver a diferença entre os recursos normais e HyperThreading como agora a taxa de transferência será de 100%.

    
por 27.07.2016 / 14:15
2

Mesmo com muito mais núcleos do que tarefas, eles não serão dimensionados perfeitamente. Isso é porque algum estado é quase sempre compartilhado. Não necessariamente na tarefa, mas no kernel, por exemplo. Ou eles podem acessar o mesmo recurso, como a rede ou um disco ou qualquer outra coisa.

SMT (ou seja, Hyper-Threading) pode confiar no fato de que diferentes tarefas usam diferentes unidades de execução da CPU. Como tal, o chamado “paralelismo de nível de instrução” pode ser alcançado em CPUs superescalares . Praticamente qualquer processador x86 moderno é superescalar.

Supondo que você tenha duas tarefas que consistam apenas em adicionar números sem outras instruções da CPU, então sim, elas entrarão em conflito quando executadas no mesmo núcleo físico, possivelmente levando a degradação significativa do desempenho.

No entanto, na maioria das vezes, este não é o caso e acontece uma variedade de coisas. Contanto que o mesmo comando não apareça nos dois fluxos de instrução em (aproximadamente) ao mesmo tempo, a utilização da unidade de execução da CPU pode ser melhorada.

    
por 27.07.2016 / 13:47
0

Se o programa não tem como coordenar instâncias separadas, você quase certamente não obterá melhorias.

exemplo:

Se eu tiver um único programa encadeado que calcule primos de 2-10, uma única instância em execução calcularia se cada número de 2-10 fosse primo e achasse que 2,3,5,7 são primos.

Se eu adicionar uma segunda instância sem nenhuma modificação no código A primeira instância calcularia se cada número de 2-10 é primo, e acha que 2,3,5,7 são primos, enquanto a segunda instância calcularia se cada número de 2-10 é primo, e acha que 2,3 , 5,7 são primos.

fazer isso resultaria no mesmo trabalho sendo feito duas vezes, sem melhoria.

    
por 26.12.2017 / 19:51