O uso de todos os núcleos reduz a eficiência?

O uso de todos os núcleos reduz a eficiência?

Eu tenho um programa (bem, script php) que faz uma pesquisa de texto bastante pesada - ele carrega um arquivo de 2 MB e 40 MB e pesquisa neles para descobrir onde cada palavra que aparece no primeiro está presente no segundo.

Eu tenho uma CPU de 4 núcleos (computador pessoal). Quando inicio a execução do processo, o uso da CPU salta para 25%, carga de 1. Começo o processo em execução novamente em um arquivo separado e o uso da CPU vai para 50%, carga de 2. Isso reduz a eficiência dos processos individuais ? ou seja. fazendo com que cada um demore mais para ser concluído do que se fossem executados separadamente? E se eu executasse 4 processos, aumentando o uso da CPU para 100%? Eles correriam mais devagar então?

Presumo que a execução dos dois processos em paralelo será concluída mais rapidamente do que se eu os executasse em série, correto? Ainda seria verdade se eu corresse mais de dois, digamos 3 ou 4? Ou mais? Onde está o gargalo nisso - presumo que, desde que eu mantenha o número de processos igual ou menor que o número de núcleos, a CPU poderá lidar com isso, mas e quanto ao acesso à memória? Os processos teriam que esperar enquanto leem a memória?

Responder1

Resposta curta: compare-o.

Resposta longa: Cada processo individual levará mais tempo para ser concluído (devido ao escalonamento de frequência), mas no geral a coisa mais eficiente a fazer é carregar cada núcleo a 100%.

Responder2

Depende de muitas coisas, que executar as coisas em paralelo irá melhorar o desempenho ou irá degradá-lo. Como:

  1. Se você estiver fazendo muito IO, usando arquivos grandes na comparação, então o gargalo será o disco e não a CPU e com certeza seu desempenho diminuirá.
  2. Ao mesmo tempo, se seus arquivos forem grandes o suficiente para a RAM que você tem em seu sistema e você executar mais de um processo, o gargalo será a RAM e, novamente, haverá IO na máquina.

Então, vai de caso para caso. Mas no seu caso, tenho certeza de que seu desempenho só melhorará se você executar as coisas em paralelo, e não consigo ver um cenário em que isso possa degradar sua eficiência, a menos que eu esteja perdendo algum ponto, o que posso' não penso.

Responder3

Parece que você não tem muita espera de E/S, no disco rígido ou na rede. Supondo que você tenha GB de RAM, os arquivos de 42 MB devem ser facilmente carregados na RAM. Nesse ponto, quatro processos paralelos devem fornecer os melhores resultados. Você verá pequenas mudanças de contexto quando processos normais do sistema operacional precisarem ser executados.

Nos sistemas NUMA, cada núcleo possui um pool de memória atribuído. O desempenho pode ser prejudicado quando o kernel migra um processo para um núcleo diferente porque os arquivos ainda estão no conjunto de memória do núcleo original. Honestamente, não tenho certeza se isso se aplica a computadores pessoais.

Responder4

Geralmente - sim. Ignore a parte da codificação por um momento.

Os processadores multi-core modernos têm um modo boost se apenas um pequeno número de núcleos for usado, o que aumentará um pouco a frequência. Como tal, usar todos os núcleos torna o núcleo individual menor. Os detalhes dependem do processador.

ISSO DISSE: O total ainda será maior, pois o impulso individual normalmente é MUITO pequeno (algumas centenas de Mhz) em comparação com a obtenção de outro núcleo. Como tal, é realmente melhor usar todos os coers. O aumento foi feito principalmente para aqueles casos que não escalam bem e precisam de uma frequência alta por núcleo - o que inclui jogos de thread único;)

Para fazer sua pergunta sobre acesso à memória. Espero que você saiba que um servidor moderno tem uma velocidade de acesso à memória superior a 50 GB (ou seja, gigabyte) por segundo de DRAM - mais de caches. Portanto, é improvável que você acerte isso. IO pode ser um problema, mas isso será visível se a CPU não atingir o limite máximo e as estatísticas de espera de IO aumentarem. O cache ajuda muito aqui.

informação relacionada