Quando (re) construo sistemas grandes em um computador desktop / laptop, eu digo make
para usar mais de um thread para acelerar a velocidade de compilação, assim:
$ make -j$[ $K * $C ]
Onde $C
é suposto para indicar o número de núcleos (que pode assumir a ser um número com um dígito) a máquina tem, ao mesmo tempo $K
é algo que pode variar de 2
que 4
, dependendo do meu humor.
Por exemplo, posso dizer make -j12
se tenho 4 núcleos, indicando o make
uso de até 12 threads.
Minha lógica é que, se eu usar apenas $C
threads, os núcleos ficarão ociosos enquanto os processos estiverem ocupados na busca de dados das unidades. Mas se eu não limitar o número de threads (ou seja make -j
), corro o risco de perder tempo alternando contextos, ficando sem memória ou pior . Vamos supor que a máquina tenha $M
shows de memória ( $M
na ordem de 10).
Então, eu queria saber se existe uma estratégia estabelecida para escolher o número mais eficiente de threads a serem executados.
Respostas:
Fiz uma série de testes, construindo o llvm (no modo Debug + Asserts) em uma máquina com dois núcleos e 8 GB de RAM:
Por incrível que pareça, parece subir até 10 e, de repente, cai abaixo do tempo necessário para criar com dois trabalhos (um trabalho leva aproximadamente o dobro do tempo, não incluído no gráfico).
O mínimo parece estar
7*$cores
neste caso.fonte
Estou executando o Gentoo Linux (distribuição baseada em fonte) e, pela minha experiência, posso dizer que (com hardware mais ou menos recente)
n*2 + x
é o melhor valor. Deixe-me explicar isso:n*2
: CPUs ainda mais lentas têm energia suficiente para executar 2 tarefas por vez. a maioria das tarefas de compilação é concluída muito rapidamente.+x
esse número depende do seu sistema (principalmente memória e disco). Se você tiver RAM suficiente e um disco rápido, definax=n
. No entanto, isso depende do código fonte (Open Office, estou olhando para você!) E da linguagem usada (compilar C / C ++ consome muita memória).No entanto, você deve executar alguns testes com alguns
-j
valores para obter o melhor número. Além disso, tente paralelizar outras etapas do processo de compilação: descompactar, executarconfigure
e assim por diante.fonte