Définition automatique de l'emploi (-j) indicateur d'un système multicœur?
J'ai un Makefile sur une machine qui a une tonne de carottes, mais j'oublie toujours d'écrire -jX
lors de la compilation de mon projet et il prend plus de temps qu'il ne le devrait.
Est-il un moyen que je puisse régler le -j
drapeau par le biais d'une variable d'environnement ou de certains autres persistante fichier de configuration de sorte que faire automatiquement exécuter plusieurs tâches en parallèle sur cette machine?
- Connexes: stackoverflow.com/questions/2527496/...
- quel système d'exploitation avez-vous besoin? Et pourquoi ne pas
alias make='make -j$(getconf _NPROCESSORS_ONLN)'
travail pour vous? - Alias ne suffira pas parce que j'ai besoin d'éditer le fichier Makefile et avoir encore de travail. J'en ai besoin pour GNU Make 4.1. @TarunLalwani
Vous devez vous connecter pour publier un commentaire.
Il semble que la
MAKEFLAGS
variable d'environnement peut passer des options qui font partie de chaquemake
exécuter (au moins pour GNU make). Je n'ai pas eu beaucoup de chance avec moi-même, mais il pourrait être possible d'utiliser-l
plutôt que-j
pour exécuter automatiquement autant d'emplois que sont appropriés pour le nombre de cœurs disponibles.-l
ou-j
mais sans arguments. Essayez par vous-même: gist.github.com/sanmai/dcc31ae20afa6e8ba4721f174fe05fd9-l
désactive la charge de limitation alors que-j
sans arguments diremake
pour démarrer nombre illimité de paraller processus.Je suis en supposant que vous êtes en utilisant Linux. C'est à partir de mon
~/.bashrc
exemple d'utilisation
devient
time nice make -j8 --load-average=8
.Pour répondre à votre question spécifique à propos de mettre cela dans une
Makefile
, je ne trouve pas pratique de les saupoudrer de cette logique, tous mes fichiers "Makefile". Mettre dans un haut niveau de Makefile n'est pas une bonne solution, car j'ai souvent construire à partir de sous-répertoires et souhaitent construire en parallèle ainsi. Toutefois, si vous avez une assez plat de la source de la hiérarchie, il peut travailler pour vous.nproc
de commande.nproc
n'existe pas sur certaines des plus vieilles distributions (en vous regardant, RHEL5)nproc
à partir de la page de man: "Imprimer le nombre d'unités de traitement disponibles pour le processus actuel, qui peut être inférieur au nombre de ligne de processeurs"Comme Jérémie Willcock dit, l'utilisation des
MAKEFLAGS
, mais voici comment le faire:ou vous pouvez définir une valeur fixe comme ceci:
Si vous voulez vraiment augmenter les performances, vous devez utiliser
ccache
en ajoutant quelque chose comme ce qui suit à votreMakefile
:strings /usr/bin/make | grep MAKEFLAGS
J'ai l'habitude de le faire comme suit dans mes scripts bash:
Vous pouvez ajouter une ligne à votre fichier Makefile semblable à la suivante:
Puis ajouter un
${NUMJOBS}
ligne dans vos règles, ou de l'ajouter dans un autreMakefile
var (commeMAKEFLAGS
). Cela permettra d'utiliser le NUMJOBS envvar, si elle existe; si elle ne fonctionne pas, utiliser automatiquement-j4
. Vous pouvez régler ou de le renommer à votre goût.(N. B.: Personnellement, je préfère le défaut d'être
-j1
ou""
, surtout si ça va être distribués à d'autres, parce que même si j'ai plusieurs cœurs aussi, je compile sur de nombreuses plateformes différentes, et oublie souvent de dis-mesure de la-jX
réglage.)Les alias ne sont pas développés à l'intérieur de scripts. Il est préférable de créer un
make
script et de le placer dans l'une des$PATH
répertoires:Sur Ubuntu 16.4 à l'aide de tous les cœurs de PROCESSEUR:
ou
Jusqu'à ce que le courant de 2016, vous pouvez mettre ceci dans votre makefile: (GNU make testé)
(où
NUM_PPROCS
est calculée ou ensemble selon l'une des nombreuses autres réponses ici) Et, bam! vous avez multi-processus de construction en cours.Étant donné que cela a cessé de travailler, la meilleure chose que je puisse arriver, c'est ça, où le makefile appelle elle-même, mais avec
-jX
et-lX
.Au début d'un Makefile:
Il ne prendra pas les arguments numériques pour n'importe quelle version de GNU Make avant 4.2. Après 4.2 vous pouvez le faire:
Pour les versions antérieures à 4.2 si vous avez certains emplois à court de mémoire, vous pouvez les faire courir un seul à la fois avec
flock
de util-linux-ng. Par exemple, unconvert
utilitaire de ImageMagick va utiliser toutes les ressources qu'elle peut obtenir lorsqu'il est utilisé pour optimiser les images selon les recommandations de Google, donc il n'y a pas de point de l'exécuter en parallèle.Il est important de définir un temps d'attente est long parce que faire sera toujours exécuté la plupart de ces commandes en parallèle. Par conséquent, les temps d'attente doit être comme le plus profond de la file d'attente temps d'exécution. Si vous avez huit cœurs, et de huit grandes images prenez une minute pour optimiser, vous devez définir le temps d'attente d'au moins une minute.
Avec des centaines de cœurs et des images énormes, six cents secondes défini ci-dessus peut ne pas être suffisant.
Je voudrais juste poser
dans
~/.profile
ou~/.bashrc
.Selon la manuel:
-j
rapidement mange de tout mon mémoire sur une grande construction. Pas recommandé.