Ao executar trabalhos multicore, perderei desempenho se as médias do carregamento do sistema estiverem acima do número de núcleos?

1

Eu faço muita análise estatística com R e uso intensamente grandes instâncias multicore na AWS. Principalmente para pesquisas de hiperparâmetro, validação cruzada e bootstrapping.

Digamos que eu tenha uma instância com c cores e uma tarefa com r >= c replica, que é composta por c núcleos por vez. Agora, por causa do processo do sistema (como meu cliente ssh executando htop ), existem tarefas além das minhas replicações c em execução.

Isso significa, até onde eu entendo o funcionamento do sistema operacional, que existe algum processo que está desligando meus trabalhos para que htop (e qualquer outra coisa) possa acessar os processadores. Depois de dar esses vários processos ao sol, meus trabalhos são retomados.

Quando olho para htop , vejo muito vermelho misturado com o verde. É correto dizer que o verde é meu trabalho, e o vermelho é feito de fundo para permitir meu trabalho?

Intuitivamente, parece que esse tipo de embaralhamento seria sub-ótimo. Então, aqui está minha pergunta direta: se eu tiver acesso a c cores, devo alocar minhas tarefas replicadas para todos os c delas, ou talvez c-1 ou algo assim?

Eu também imagino que há muitos detalhes sobre como os recursos de computação são atribuídos a tarefas que eu não entendo e estou encobrindo. O que estaria envolvido em ter todos os meus trabalhos indo para c-1 núcleos e todos os processos do sistema passam a cth core? Isso tornaria todo o meu htop verde, exceto por um bar? E isso faria algum sentido?

Suponho que eu poderia fazer experiências de benchmarking, mas isso seria difícil com grandes instâncias e conjuntos de dados, e não tenho certeza do que aprenderia, considerando quantas coisas serão específicas do aplicativo. Então eu quero entender melhor como as coisas funcionam.

    
por generic_user 29.11.2017 / 17:03

1 resposta

1

É difícil saber o efeito exato em uma aplicação particular sem experimentação, MAS a regra geral é que exceder o número de núcleos em uma pequena quantidade é benéfico (por exemplo, a maioria dos guias de compilação sugere chamar com número de núcleos / threads + 1), mas excedendo-o em grande quantidade é provavelmente contraproducente devido à sobrecarga extra. A razão para isso é se uma (ou duas) das tarefas está aguardando por E / S ou timers ou qualquer outra coisa, que os outros threads ainda podem continuar.

O embaralhamento de trabalho (programação do sistema operacional) acontece em todos os sistemas operacionais modernos e é algo com o qual devemos trabalhar, em vez de combatê-lo. Se parece haver algo não relacionado competindo, você pode abandonar o bom nível do seu processo, mas em uma instância dedicada da AWS ... É difícil imaginar que isso seja necessário.

    
por 29.11.2017 / 17:28