Quantos fazem threads para usar?

11

Quando (re) construo sistemas grandes em um computador desktop / laptop, eu digo makepara 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 2que 4, dependendo do meu humor.

Por exemplo, posso dizer make -j12se tenho 4 núcleos, indicando o makeuso de até 12 threads.


Minha lógica é que, se eu usar apenas $Cthreads, 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 $Mshows de memória ( $Mna 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.

bitmask
fonte
Em muitos casos, a resposta correta para o número de threads será o número de núcleos. Mas a única maneira de ter certeza é executar alguns testes, variando o número de threads até encontrar o ponto ideal.
Robert Harvey
@RobertHarvey: Sim, provavelmente vou compilar um script de shell com todos os tipos de configurações durante a noite, mas pensei em perguntar se existe algum conhecimento sobre isso por aí.
bitmask
4
muitas pessoas também sugerem $ núcleos + 1; portanto, 1 processo do compilador lê do disco enquanto 4 compilam. Uma sugestão genérica é difícil, também depende da base de código (uso excessivo de modelos C ++ vs. pequenas unidades de compilação com algumas funções C), cadeia de compiladores (cabeçalhos pré-compilados, etc?) E da estrutura de compilação (está vinculando apenas uma coisa importante no final ou várias pequenas coisas no meio)
johannes
11
Se você estiver procurando seriamente por desempenho, sugiro que você configure um disco RAM ou algum outro método para aliviar sua E / S. Eu não acho que a utilização da CPU seja o seu ponto quente.
TMN
@TMN: Como um disco RAM ajuda? Linux é muito bom em cache coisas (você fazer significa que os arquivos de cabeçalho, certo?), Para não mencionar o cache da unidade. Eu teria que carregar tudo no shm primeiro, manualmente ou alterando o script de compilação (o que seria um exagero total).
bitmask

Respostas:

15

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:

compilando o tempo llvm, dependendo do número de trabalhos

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*$coresneste caso.

bitmask
fonte
11
+1 para testes reais e não especulação.
Martin Wickman
3

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.
  • +xesse número depende do seu sistema (principalmente memória e disco). Se você tiver RAM suficiente e um disco rápido, defina x=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 -jvalores para obter o melhor número. Além disso, tente paralelizar outras etapas do processo de compilação: descompactar, executar configuree assim por diante.

ercpe
fonte
No momento, estou mais preocupado com C ++ e acho que meus discos não são os mais rápidos.
Bit20
Comece com n * 1.5 e aumente-o até que os tempos de compilação parem de diminuir (limpe sempre o cache do disco / cache de compilação). Além disso, pense em usar o ccache ( ccache.samba.org ) para acelerar a compilação.
ercpe