Pergunta rápida: qual é o sinalizador do compilador que permite ao g ++ gerar várias instâncias de si mesmo para compilar projetos grandes mais rapidamente (por exemplo, 4 arquivos de origem por vez para uma CPU com vários núcleos)?
174
make -j
quase sempre resulta em alguma melhoria.Respostas:
Você pode fazer isso com o make - com o gnu make é o sinalizador -j (isso também ajudará em uma máquina uniprocessadora).
Por exemplo, se você deseja 4 trabalhos paralelos do make:
Você também pode executar o gcc em um pipe com
Isso fará o pipeline dos estágios de compilação, o que também ajudará a manter os núcleos ocupados.
Se você tiver máquinas adicionais disponíveis, verifique o distcc , que também compila essas compilações.
fonte
-j
argumentosNão existe esse sinalizador, e ter um deles é executado contra a filosofia do Unix de fazer com que cada ferramenta execute apenas uma função e a execute bem. Gerar processos do compilador é conceitualmente o trabalho do sistema de compilação. O que você provavelmente está procurando é o sinalizador -j (jobs) para o GNU make, a la
Ou você pode usar pmake ou sistemas de fabricação paralela similares.
fonte
As pessoas mencionaram,
make
masbjam
também apóiam um conceito semelhante. O uso debjam -jx
instrui o bjam a criarx
comandos simultâneos.Usamos os mesmos scripts de compilação no Windows e Linux e essa opção reduz pela metade o tempo de compilação nas duas plataformas. Agradável.
fonte
make
fará isso por você. Investigue as opções-j
e-l
na página de manual. Eu não acho queg++
é paralelizável.fonte
-l
opção (não inicia um novo trabalho, a menos que todos os trabalhos anteriores tenham sido encerrados). Caso contrário, parece que o trabalho do vinculador começa com nem todos os arquivos de objeto criados (como algumas compilações ainda estão em andamento), para que o trabalho do vinculador falhe.Se estiver usando make, emita com
-j
. Deman make
:E, principalmente, se você deseja criar um script ou identificar o número de núcleos que você tem disponível (dependendo do seu ambiente e se você executa em muitos ambientes, isso pode mudar bastante), você pode usar a onipresente função Python
cpu_count()
:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
Como isso:
Se você está perguntando por
1.5
que citarei o ruído artless do usuário em um comentário acima:fonte
make -j`nproc`
comnproc
no GNU Coreutils.make -j $(( $(nproc) + 1 ))
(certifique-se de colocar espaços onde os tenho).nproc
não está disponível, por exemplo, emmanylinux1
contêineres, economiza tempo adicional ao evitar a execuçãoyum update
/yum install
.O distcc também pode ser usado para distribuir compilações não apenas na máquina atual, mas também em outras máquinas em um farm que possui o distcc instalado.
fonte
Não tenho certeza sobre o g ++, mas se você estiver usando o GNU Make, "make -j N" (onde N é o número de threads que o make pode criar) permitirá que o make execute vários trabalhos do g ++ ao mesmo tempo (por muito tempo porque os arquivos não dependem um do outro).
fonte
-j N
dizem quantos processos ao mesmo tempo devem ser gerados, não threads. Essa é a razão pela qual não é tão eficiente quanto a MScl -MT
(realmente multithread).Paralelo GNU
Eu estava fazendo um benchmark de compilação sintética e não me incomodei em escrever um Makefile, então usei:
Explicação:
{.}
pega o argumento de entrada e remove sua extensão-t
imprime os comandos que estão sendo executados para nos dar uma ideia do progresso--will-cite
remove a solicitação de citação do software se você publicar resultados usando-o ...parallel
é tão conveniente que eu poderia até fazer um registro de data e hora:xargs -P
também pode executar tarefas em paralelo, mas é um pouco menos conveniente fazer a manipulação de extensão ou executar vários comandos com ela: Chamando vários comandos através do xargsA ligação paralela foi solicitada em: O gcc pode usar vários núcleos ao vincular?
TODO: Acho que li em algum lugar que a compilação pode ser reduzida à multiplicação de matrizes, então talvez também seja possível acelerar a compilação de arquivo único para arquivos grandes. Mas não consigo encontrar uma referência agora.
Testado no Ubuntu 18.10.
fonte