Il semble y avoir une certaine controverse quant à savoir si le nombre de travaux dans GNU make est censé être égal au nombre de cœurs, ou si vous pouvez optimiser le temps de construction en ajoutant un travail supplémentaire qui peut être mis en file d'attente pendant que les autres "fonctionnent" .
Vaut-il mieux utiliser -j4
ou -j5
sur un système quad core?
Avez-vous vu (ou fait) une analyse comparative qui soutient l'un ou l'autre?
make `nproc`
pour créer un script indépendant du processeur :)Réponses:
Je dirais que la meilleure chose à faire est de le comparer vous-même à votre environnement et à votre charge de travail particuliers. On dirait qu'il y a trop de variables (taille / nombre de fichiers source, mémoire disponible, mise en cache du disque, si votre répertoire source et les en-têtes système sont situés sur des disques différents, etc.) pour une réponse unique.
Mon expérience personnelle (sur un MacBook Pro 2 cœurs) est que -j2 est nettement plus rapide que -j1, mais au-delà (-j3, -j4 etc.), il n'y a pas d'accélération mesurable. Donc pour mon environnement "jobs == nombre de cœurs" semble être une bonne réponse. (YMMV)
la source
J'ai exécuté mon projet domestique sur mon ordinateur portable 4 cœurs avec hyperthreading et enregistré les résultats. C'est un projet assez lourd en compilateur mais il inclut un test unitaire de 17,7 secondes à la fin. Les compilations ne sont pas très gourmandes en E / S; il y a beaucoup de mémoire disponible et sinon le reste est sur un SSD rapide.
Résultats de base:
Je suppose maintenant: si vous faites autre chose sur votre ordinateur, utilisez le nombre de cœurs. Si vous ne le faites pas, utilisez le nombre de threads. Le dépasser ne montre aucun avantage. À un moment donné, ils deviendront limités en mémoire et s'effondreront à cause de cela, rendant la compilation beaucoup plus lente. La ligne "inf" a été ajoutée à une date beaucoup plus tardive, me donnant le soupçon qu'il y avait une certaine limitation thermique pour les 8+ travaux. Cela montre que pour cette taille de projet, il n'y a pas de limite de mémoire ou de débit en vigueur. C'est un petit projet cependant, avec 8 Go de mémoire pour compiler.
la source
Personnellement, j'utilise
make -j n
où n est "nombre de cœurs" + 1.Je ne peux cependant pas donner une explication scientifique: j'ai vu beaucoup de gens utiliser les mêmes paramètres et ils m'ont donné de très bons résultats jusqu'à présent.
Quoi qu'il en soit, vous devez faire attention car certaines chaînes de fabrication ne sont tout simplement pas compatibles avec l'
--jobs
option et peuvent entraîner des résultats inattendus. Si vous rencontrez d'étranges erreurs de dépendance, essayez simplement de le fairemake
sans--jobs
.la source
En fin de compte, vous devrez faire quelques tests pour déterminer le meilleur nombre à utiliser pour votre build, mais rappelez-vous que le processeur n'est pas la seule ressource qui compte!
Si vous avez une version qui dépend fortement du disque, par exemple, la création de nombreux travaux sur un système multicœur peut en fait être plus lente , car le disque devra faire un travail supplémentaire en déplaçant la tête de disque d'avant en arrière pour servir tous. les différents travaux (en fonction de nombreux facteurs, comme la façon dont le système d'exploitation gère le cache disque, la prise en charge de la mise en file d'attente de commandes native par le disque, etc.).
Et puis vous avez de "vrais" cœurs contre l'hyper-threading. Vous pouvez ou non bénéficier de la création d'emplois pour chaque hyper-thread. Encore une fois, vous devrez effectuer une analyse comparative pour le savoir.
Je ne peux pas dire que j'ai spécifiquement essayé #cores + 1 , mais sur nos systèmes (Intel i7 940, 4 cœurs hyperthreading, beaucoup de RAM et des disques VelociRaptor) et notre version (version C ++ à grande échelle qui est alternativement CPU et I / O lié) il y a très peu de différence entre -j4 et -j8. (C'est peut-être 15% mieux ... mais loin du double.)
Si je pars pour le déjeuner, j'utiliserai -j8, mais si je veux utiliser mon système pour autre chose pendant sa construction, j'utiliserai un nombre inférieur. :)
la source
-j 8
Je viens de recevoir un proc Athlon II X2 Regor avec un Foxconn M / B et 4 Go de mémoire G-Skill.
J'ai mis mon 'cat / proc / cpuinfo' et 'free' à la fin de ceci pour que les autres puissent voir mes spécifications. C'est un Athlon II x2 dual core avec 4 Go de RAM.
J'ai téléchargé la source du noyau de l'étape suivante (linux-3.2.46) dans / archive4;
extrait (
tar -xjvf linux-3.2.46.tar.bz2
);cd'd dans le répertoire (
cd linux-3.2.46
);et copié la configuration par défaut du noyau sur (
cp /usr/src/linux/.config .
);utilisé
make oldconfig
pour préparer la configuration du noyau 3.2.46;puis a exécuté make avec diverses incantations de -jX.
J'ai testé le minutage de chaque exécution en exécutant make après la commande time, par exemple «time make -j2». Entre chaque exécution, j'ai 'rm -rf' l'arborescence linux-3.2.46 et je l'ai réextrait, copié la valeur par défaut /usr/src/linux/.config dans le répertoire, lancé make oldconfig puis refait mon test 'make -jX' .
simple "faire":
comme ci-dessus mais avec make -j2
comme ci-dessus mais avec make -j3
comme ci-dessus mais avec make -j4
comme ci-dessus mais avec make -j8
'cat / proc / cpuinfo' donne:
rendements 'gratuits':
la source
make -j
sur ce système? Make est censé vérifier la charge et mettre à l'échelle le nombre de processus en fonction de la charge.make -j
ne limite pas du tout le nombre d'emplois. Ceci est généralement désastreux sur un projet de taille moyenne ou grande, car plus de tâches sont rapidement fourchues que ce que peut prendre en charge la RAM. L'option que vous devez restreindre par charge est-l [load]
, en conjonction avec-j
Les deux ne sont pas faux. Pour être en paix avec vous-même et avec l'auteur du logiciel que vous compilez (différentes restrictions multi-thread / single-thread s'appliquent au niveau du logiciel lui-même), je vous suggère d'utiliser:
Notes:
nproc
est une commande linux qui retournera le nombre de cœurs / threads (CPU moderne) disponibles sur le système. Le placer sous les coches `comme ci-dessus passera le numéro à la commande make.Informations supplémentaires: comme quelqu'un l'a mentionné, l'utilisation de tous les cœurs / threads pour compiler des logiciels peut littéralement étouffer votre boîte à un point mort (ne pas répondre) et peut même prendre plus de temps que d'utiliser moins de cœurs. Comme j'ai vu un utilisateur de Slackware posté ici, il avait un processeur double cœur mais fournissait toujours des tests jusqu'à j 8, qui cessaient d'être différents à j 2 (seulement 2 cœurs matériels que le processeur peut utiliser). Donc, pour éviter que la boîte ne réponde, je vous suggère de l'exécuter comme ceci:
Cela passera la sortie de
nproc
tomake
et soustraira 2 cœurs de son résultat.la source
Tout comme un ref:
De la
Spawning Multiple Build Jobs
section dans LKD :la source
D'après mon expérience, il doit y avoir des avantages en termes de performances lors de l'ajout d'emplois supplémentaires. C'est simplement parce que les E / S de disque sont l'un des goulots d'étranglement en plus du CPU. Cependant, il n'est pas facile de décider du nombre de travaux supplémentaires car il est fortement interconnecté avec le nombre de cœurs et les types de disque utilisés.
la source
Plusieurs années plus tard, la majorité de ces réponses sont toujours correctes. Cependant, il y a eu un petit changement: utiliser plus de travaux que de cœurs physiques donne désormais une accélération véritablement significative. En complément à la table de Dascandy, voici mes horaires pour compiler un projet sur un AMD Ryzen 5 3600X sous Linux. (Le jouet en poudre, commettez c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Je recommande de vous vérifier, mais j'ai trouvé avec les commentaires d'autres personnes que l'utilisation de votre nombre de cœurs logiques pour le nombre de tâches fonctionne bien sur Zen. Parallèlement, le système ne semble pas perdre de réactivité. J'imagine que cela s'applique également aux processeurs Intel récents. Notez que j'ai également un SSD, donc cela peut valoir la peine de tester votre processeur vous-même.
Tests effectués sur Ubuntu 19.10 avec Ryzen 5 3600X, Samsung 860 Evo SSD (SATA) et 32 Go de RAM
Note finale: d'autres personnes avec un 3600X peuvent avoir de meilleurs temps que moi. Lors de ce test, j'ai activé le mode Eco, réduisant un peu la vitesse du processeur.
la source
OUI! Sur mon 3950x, j'exécute -j32 et cela économise des heures de compilation! Je peux toujours regarder YouTube, naviguer sur le Web, etc. pendant la compilation sans aucune différence. Le processeur n'est pas toujours lié, même avec un nvme 1 To 970 PRO ou 1 To Auros Gen4 nvme et 64 Go de 3200C14. Même quand c'est le cas, je ne remarque pas l'interface utilisateur. Je prévois de tester avec -j48 dans un proche avenir sur certains grands projets à venir. Je m'attends, comme vous le faites probablement, à voir une amélioration impressionnante. Ceux qui ont encore un quad-core pourraient ne pas obtenir les mêmes gains ...
Linus lui-même vient de passer à un 3970x et vous pouvez parier votre dernier dollar, il utilise au moins -j64.
la source