Lorsque je (re) construis de gros systèmes sur un ordinateur de bureau / portable, je dis make
d'utiliser plus d'un thread pour accélérer la vitesse de compilation, comme ceci:
$ make -j$[ $K * $C ]
Où $C
est censé indiquer le nombre de cœurs (que nous pouvons supposer être un nombre à un chiffre) que possède la machine, alors $K
que je varie de 2
à 4
, selon mon humeur.
Ainsi, par exemple, je pourrais dire make -j12
si j'ai 4 cœurs, indiquant make
d'utiliser jusqu'à 12 threads.
Ma justification est que si j'utilise uniquement des $C
threads, les cœurs seront inactifs pendant que les processus sont occupés à récupérer les données des lecteurs. Mais si je ne limite pas le nombre de threads (c'est-à-dire make -j
), je risque de perdre du temps à changer de contexte, à court de mémoire, ou pire . Supposons que la machine ait des $M
Go de mémoire (où $M
est de l'ordre de 10).
Je me demandais donc s'il existe une stratégie établie pour choisir le nombre de threads le plus efficace à exécuter.
Réponses:
J'ai exécuté une série de tests, en construisant llvm (en mode Debug + Asserts) sur une machine avec deux cœurs et 8 Go de RAM:
Curieusement, il semble grimper jusqu'à 10, puis tombe soudainement en dessous du temps nécessaire pour construire avec deux travaux (un travail prend environ le double du temps, non inclus dans le graphique).
Le minimum semble être
7*$cores
dans ce cas.la source
J'utilise Gentoo Linux (distribution basée sur la source) et d'après mon expérience, je peux dire que (avec un matériel plus ou moins récent)
n*2 + x
est la meilleure valeur. Permettez-moi d'expliquer ceci:n*2
: Les processeurs encore plus lents ont suffisamment de puissance pour exécuter 2 tâches à la fois. la plupart des tâches de compilation sont exécutées très rapidement.+x
ce nombre dépend de votre système (principalement la mémoire et le disque). Si vous avez suffisamment de RAM et un disque rapide, réglezx=n
. Cependant, cela dépend du code source (Open Office, je vous regarde!) Et du langage utilisé (la compilation de C / C ++ est très gourmande en mémoire).Cependant, vous devez exécuter des tests avec certaines
-j
valeurs pour obtenir le meilleur nombre. Essayez également de paralléliser les autres étapes du processus de génération: décompression, exécutionconfigure
, etc.la source