quantos núcleos devo utilizar para cálculos? #cores ou #cores -1?

12

Eu tenho um grande cálculo para fazer. Embora eu possa utilizar todos os núcleos, pensei que há alguma razão para deixar de fora um núcleo e não utilizá-lo? (cpu de cálculo apenas sem IO). Ou estou subestimando o sistema operacional que ele não saberia manipular e fazer a alternância de contexto adequada, mesmo que eu utilize todos os núcleos?

Jas
fonte
8
A utilização de todos os núcleos é um bom começo, e algumas superstições sobre o SO que se comportam melhor com "-1 núcleos" provavelmente são apenas superstições, mas você deve realmente criar um perfil, como se comporta para o seu cálculo, seu hardware, seu sistema operacional.
Doc Brown
Em muitos casos, usar # cores + 1 faz muito sentido. Se você usar #cores, qualquer bloqueio inesperado (como uma falha de página) força desnecessariamente um núcleo a ficar inativo.
David Schwartz

Respostas:

28

Os principais sistemas operacionais são maduros o suficiente para saber como lidar com processos que usam todos os núcleos disponíveis. Outros processos podem (e geralmente serão) afetados, mas a computação não se tornará mais lenta porque você usou todos os núcleos disponíveis.

A escolha do número de núcleos depende mais da sua intenção de fazer outra coisa enquanto o cálculo está sendo realizado.

Se, em uma máquina desktop, você quiser usar o navegador da Web ou assistir a um vídeo enquanto o cálculo estiver sendo feito, é melhor manter um núcleo livre para isso. Da mesma forma, se o servidor estiver fazendo duas coisas (como fazer cálculos e, ao mesmo tempo, processar e relatar suas métricas), manter um núcleo livre para a tarefa paralela pode ser uma boa idéia.

Por outro lado, se sua prioridade é tornar o cálculo o mais rápido possível, é necessário usar todos os núcleos.

Arseni Mourzenko
fonte
7
Os agendadores de sistemas operacionais modernos são realmente muito bons em manter os programas interativos interativos quando há alto uso da CPU, desde que os programas interativos também não usem muita CPU (o que, concedido, pode ser um problema com os aplicativos da web inchados modernos)
James_pic
Nota: mesmo em servidores, se você deseja poder ssh e obter uma resposta rápida, deixar o núcleo 0 sozinho pode ser útil.
Matthieu M.
11

Depende.

Se a máquina é dedicada a esse cálculo, você deve usar todos os núcleos - os recursos de computação não utilizados não aceleram as coisas .

Se você estiver usando um agendador em tempo real, um agendador não preventivo ou afinidade de processador, tenha um pouco mais de cuidado, pois é fácil privar acidentalmente outros processos de todos os recursos de computação. No entanto, você precisaria alterar manualmente essas configurações para que algo desse errado; portanto, por padrão, não há problema aqui na maioria dos sistemas operacionais.

Se a máquina não for dedicada ao cálculo, fornecer 100% ao cálculo pode não ser o ideal. Por exemplo, se você estiver usando um navegador da Web enquanto o cálculo estiver em execução. Como a carga da sua máquina ocasionalmente atinge um pico acima de 100%, ela fica lenta. Tarefas orientadas à taxa de transferência, como a computação, não serão realmente mais lentas, mas tarefas sensíveis à latência, como GUIs, não reagirão tão rapidamente. É sensato iniciar apenas threads / processos NPROC-1 para o cálculo. Como alternativa, o uso explícito de uma prioridade mais baixa para a computação do que para tarefas normais pode resolver esse problema; nesse caso, a computação deve usar processos NPROC para não desperdiçar recursos.

amon
fonte
3
"se você estiver usando um navegador da Web enquanto a computação estiver em execução [...], ela parecerá lenta. Tarefas orientadas à taxa de transferência, como a computação, não serão realmente mais lentas, mas tarefas sensíveis à latência, como GUIs, não reagirão tão rapidamente. [ …] Usar explicitamente uma prioridade mais baixa para a computação do que para tarefas normais pode resolver esse problema "- E é por isso que o valor da prioridade do processo no Unix é chamado de" gentileza "e é configurado usando um utilitário chamado nice.
Jörg W Mittag
2
"recursos de computação não utilizados não aceleram as coisas" tecnicamente, eles poderiam. O uso de menos núcleos pode permitir uma taxa de clock mais alta e reduzir a sincronização, que pode ou não acelerar as coisas.
Davidmh
2
Além das notas do @Davidmh, geralmente no lado da CPU, L1 $ e L2 $ são compartilhados até certo ponto entre os threads e L3 $ é compartilhado em todo o soquete, portanto, o uso de mais threads pode causar um aumento de perdas de $, retardando os processos. Especialmente se o processo estiver ligado à memória em vez de ligado ao processador.
Maciej Piechotka
Se você definir os níveis de prioridade do encadeamento / processo adequadamente, poderá reduzir o impacto do trabalho em segundo plano nos processos interativos. Executo aplicativos de computação distribuídos em minha máquina pessoal há mais de uma década; e com as tarefas de computação da CPU em baixa prioridade, minha capacidade de usar navegadores e outros aplicativos de área de trabalho normais não é prejudicada. O compartilhamento de recursos na GPU não é tão avançado, e tive problemas ocasionais com o vídeo HTML5 acelerado pela GPU (não importa os jogos) durante a execução da computação da GPU em segundo plano. Jogos multithread podem ser problemáticos mesmo com GFX leve; win famintos tópicos 2+
Dan is Fiddling por Firelight
1

Sou um pouco cauteloso em concordar com @motoDrizzt, abaixo, devido aos votos negativos :), mas essa foi realmente a minha experiência real - mais é melhor, mesmo além do número real de núcleos (mas não milhares). Por exemplo, dê uma olhada em http://www.forkosh.com/images/avoronoi.gif, onde cada plano 2D desse voronoi_diagrama 3D pode ser gerado independentemente. E o programa usa um atributo nfork = n query_string para realizar os cálculos para n planos "simultaneamente".

Com um processador de quatro núcleos, o tempo (de usuário) para concluir o diagrama diminui bastante linearmente com o nfork, até cerca de nfork = 8 (quatro núcleos com hyperthread). Mas além dos 8, o tempo ainda diminui, embora mais lentamente. E além dos 16 anos, mais ou menos, nenhuma melhoria perceptível. Não analisei esse comportamento, mas atribuí-lo ingenuamente aos processos de malabarismo os (linux slackware 14.2x64 neste caso) para reduzir ainda mais o tempo ocioso geral.

John Forkosh
fonte
0

A melhor escolha depende do sistema. Portanto, o que você deseja fazer é executar as duas versões em um sistema real e, em seguida, verificar como o sistema responde. Você ainda pode usar navegador, editor de texto, outras coisas no seu sistema? E o desempenho é melhor ao usar n threads e não n-1? O que acontece se você executar o aplicativo em conjunto com outro aplicativo que tente usar todas as CPUs?

E então você precisa considerar o hyperthreading. Com quatro núcleos mais hyperthreading, você pode usar 8 núcleos ou 7 núcleos. Mais uma vez, tente a capacidade de resposta do sistema e a hora de terminar.

E, finalmente, considere dividir seu trabalho em mais blocos do que threads. O motivo é que diferentes threads concluirão o trabalho em momentos diferentes e, então, você deseja que algum trabalho seja entregue aos threads mais rápidos. Caso contrário, você terá que esperar até que o último encadeamento seja concluído.

PS. "Hyperthreading não pode ajudar com código intensivo de FPU porque existe apenas um FPU". Absolutamente errado. É incrivelmente difícil, mesmo com código intensivo de FPU, fazer pleno uso da FPU devido a latências. O Hyperthreading ajuda porque há duas vezes mais operações independentes disponíveis para agendamento.

gnasher729
fonte
-4

Eu não sei escrever isso de uma maneira que não pareça "ruim", então é só uma observação amigável, ok?

Dado que um PC comum já possui normalmente milhares ou mais threads, o que faz você pensar que usar 8 x 7 fará alguma diferença? :-)

Use o maior número possível de threads. E se você não precisa se preocupar com a resposta do sistema operacional, e seus threads funcionam por um longo tempo (mais de um segundo), você pode experimentar usar o dobro do número de núcleos.

motoDrizzt
fonte
3
Mas a maioria desses milhares de threads não usa 100% da CPU, usa?
Andreas Rejbrand
1
O uso do dobro do número de núcleos geralmente não melhora os tempos de computação. De fato, usar mais do que o número de núcleos físicos geralmente não é benéfico, mesmo se você tiver mais núcleos lógicos (por meio do HyperThreading, etc; embora isso possa depender da tarefa exata que você está executando). Fonte: experiência do passado, usando o MATLAB Parallel Processing.
Sanchises 13/08/19
1
@Sanchises Isso ocorre porque o hyperthreading aproveita a intercalação de instruções quase paralelas - é eficaz para códigos pesados ​​de ramificação e memória. Os cálculos de matriz são muito intensos em FPU e há apenas uma FPU por núcleo físico, portanto, o hyperthreading não pode ajudá-lo.
J ...