Question rapide: quel est le drapeau du compilateur pour permettre à g ++ de générer plusieurs instances de lui-même afin de compiler plus rapidement de grands projets (par exemple 4 fichiers source à la fois pour un processeur multicœur)?
174
make -j
aboutit presque toujours à une certaine amélioration.Réponses:
Vous pouvez le faire avec make - avec gnu make it est le drapeau -j (cela aidera également sur une machine monoprocesseur).
Par exemple, si vous voulez 4 jobs parallèles de make:
Vous pouvez également exécuter gcc dans un tube avec
Cela acheminera les étapes de compilation, ce qui aidera également à garder les cœurs occupés.
Si vous disposez également de machines supplémentaires, vous pouvez consulter distcc , qui les compilera également.
la source
-j
argumentsIl n'y a pas de tel drapeau, et en avoir un va à l'encontre de la philosophie Unix qui veut que chaque outil exécute une seule fonction et l'exécute correctement. La création de processus de compilation est conceptuellement le travail du système de construction. Ce que vous recherchez probablement, c'est l'indicateur -j (jobs) pour GNU make, a la
Ou vous pouvez utiliser pmake ou des systèmes de fabrication parallèles similaires.
la source
Les gens ont mentionné
make
maisbjam
soutiennent également un concept similaire. L'utilisationbjam -jx
indique à bjam de créerx
des commandes simultanées.Nous utilisons les mêmes scripts de construction sur Windows et Linux et l'utilisation de cette option réduit de moitié nos temps de construction sur les deux plates-formes. Agréable.
la source
make
fera cela pour vous. Examinez les commutateurs-j
et-l
dans la page de manuel. Je ne pense pas que ceg++
soit parallélisable.la source
-l
option (ne démarre pas un nouvel emploi à moins que tous les emplois précédents ne se terminent) Sinon, il semble que le travail de l'éditeur de liens ne commence pas avec tous les fichiers objets créés (car certaines compilations sont toujours en cours), de sorte que le travail de l'éditeur de liens échoue.Si vous utilisez make, sortez avec
-j
. Deman make
:Et plus particulièrement, si vous souhaitez créer un script ou identifier le nombre de cœurs dont vous disposez (en fonction de votre environnement, et si vous exécutez dans de nombreux environnements, cela peut beaucoup changer), vous pouvez utiliser la fonction Python omniprésente
cpu_count()
:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
Comme ça:
Si vous demandez pourquoi
1.5
je citerai l'utilisateur artless-noise dans un commentaire ci-dessus:la source
make -j`nproc`
avecnproc
dans GNU Coreutils.make -j $(( $(nproc) + 1 ))
(assurez-vous de mettre des espaces là où je les ai).nproc
n'est pas disponible, par exemple dans lesmanylinux1
conteneurs, cela permet de gagner du temps en évitant d'exécuteryum update
/yum install
.distcc peut également être utilisé pour distribuer des compilations non seulement sur la machine actuelle, mais également sur d'autres machines d'une ferme sur lesquelles distcc est installé.
la source
Je ne suis pas sûr de g ++, mais si vous utilisez GNU Make alors "make -j N" (où N est le nombre de threads que peut créer) permettra à make d'exécuter plusieurs tâches g ++ en même temps (si longtemps car les fichiers ne dépendent pas les uns des autres).
la source
-j N
disent à make combien de processus à la fois doivent être générés, pas de threads. C'est la raison pour laquelle il n'est pas aussi performant que MScl -MT
(vraiment multithread).GNU parallèle
Je faisais un benchmark de compilation synthétique et je ne pouvais pas être dérangé d'écrire un Makefile, alors j'ai utilisé:
Explication:
{.}
prend l'argument d'entrée et supprime son extension-t
imprime les commandes en cours d'exécution pour nous donner une idée de la progression--will-cite
supprime la demande de citer le logiciel si vous publiez des résultats en l'utilisant ...parallel
est si pratique que je pourrais même faire une vérification d'horodatage moi-même:xargs -P
peut également exécuter des tâches en parallèle, mais il est un peu moins pratique de faire la manipulation d'extension ou d'exécuter plusieurs commandes avec: Appel de plusieurs commandes via xargsLa liaison parallèle a été posée à l' adresse suivante : gcc peut-il utiliser plusieurs cœurs lors de la liaison?
TODO: Je pense avoir lu quelque part que la compilation peut être réduite à la multiplication matricielle, donc il est peut-être également possible d'accélérer la compilation d'un seul fichier pour les gros fichiers. Mais je ne trouve pas de référence maintenant.
Testé dans Ubuntu 18.10.
la source