Como determinar o número máximo a ser passado para fazer a opção -j?

16

Eu quero compilar o mais rápido possível. Vai saber. E gostaria de automatizar a escolha do número seguindo a opção -j . Como posso escolher programaticamente esse valor? em um script de shell?

A saída de nproc é equivalente ao número de threads que tenho disponível para compilar?

make -j1 make -j16

    
por tarabyte 09.06.2015 / 23:36

3 respostas

16

nproc fornece o número de núcleos / threads da CPU disponíveis, por exemplo, 8 em uma CPU quad-core com suporte para SMT bidirecional.

O número de trabalhos que você pode executar em paralelo com make usando a opção -j depende de vários fatores:

  • a quantidade de memória disponível
  • a quantidade de memória usada por cada make job
  • a extensão em que make jobs são ligados por I / O ou por CPU

make -j$(nproc) é um lugar decente para começar, mas normalmente você pode usar valores mais altos, desde que não esgote sua memória disponível e comece a se debater.

Para criações realmente rápidas, se você tiver memória suficiente, recomendo usar tmpfs , assim a maioria dos trabalhos será vinculada à CPU e make -j$(nproc) funcionará o mais rápido possível.

    
por 09.06.2015 / 23:42
2

Infelizmente, mesmo partes diferentes da mesma compilação podem ser ideais com valores conflitantes do fator j, dependendo do que está sendo construído, como, quais recursos do sistema são o gargalo naquele momento, o que mais está acontecendo na máquina de compilação, acontecendo na rede (se estiver usando técnicas de compilação distribuída), status / localização / desempenho dos muitos sistemas de cache envolvidos em uma compilação, etc.

Compilar 100 arquivos C minúsculos pode ser mais rápido do que compilar um único grande, ou vice-versa. Construir código pequeno e altamente complicado pode ser mais lento do que construir grandes quantidades de código direto / linear.

Até mesmo o contexto da compilação é importante - o uso de um fator otimizado para compilações em servidores dedicados ajustados para construções exclusivas e não sobrepostas pode gerar resultados muito decepcionantes quando usados por desenvolvedores construindo em paralelo no mesmo servidor compartilhado (cada um desses builds pode levar mais tempo do que todos eles combinados se serializados) ou em servidores com configurações de hardware diferentes ou virtualizados.

Há também o aspecto de correção da especificação de construção. Construções muito complexas podem ter condições de corrida causando falhas de construção intermitentes com taxas de ocorrência que podem variar muito com o aumento ou a diminuição do fator J.

Eu posso continuar e continuar. O ponto é que você tem que realmente avaliar a sua construção em seu próprio contexto para o qual você deseja que o fator j seja otimizado. O comentário de @Jeff Schaller se aplica: itere até encontrar o melhor ajuste. Pessoalmente eu começaria do valor nproc, tente primeiro para cima e para baixo somente se as tentativas para cima mostrarem degradação imediata.

Pode ser uma boa ideia primeiro medir várias construções idênticas em contextos supostamente idênticos apenas para ter uma ideia da variabilidade de suas medições - se muito alto, poderia comprometer todo o seu esforço de otimização (uma variabilidade de 20% eclipsaria completamente a 10 % de melhoria / degradação na busca do fator j).

Por último, IMHO, é melhor usar um (adaptativo) jobserver se houver suporte e estiver disponível em vez de um fator j fixo - ele fornece consistentemente um melhor desempenho de compilação em intervalos mais amplos de contextos.

    
por 10.06.2015 / 16:22
0

A maneira mais direta é usar nproc da seguinte forma:

make -j'nproc'

O comando nproc retornará o número de núcleos em sua máquina. Ao agrupá-lo nos tiques, o comando nproc será executado primeiro, retornará um número e esse número será passado para make .

Você pode ter alguma experiência anedótica em que fazer contagem de núcleos + 1 resulta em tempos de compilação mais rápidos. Isso tem mais a ver com fatores como atrasos de E / S, outros atrasos de recursos e outras restrições de recursos.

Para fazer isso com nproc+1 , tente isto:

make -j$(('nproc'+1))
    
por 21.11.2018 / 22:29