Combien de threads utiliser?

11

Lorsque je (re) construis de gros systèmes sur un ordinateur de bureau / portable, je dis maked'utiliser plus d'un thread pour accélérer la vitesse de compilation, comme ceci:

$ make -j$[ $K * $C ]

$Cest censé indiquer le nombre de cœurs (que nous pouvons supposer être un nombre à un chiffre) que possède la machine, alors $Kque je varie de 2à 4, selon mon humeur.

Ainsi, par exemple, je pourrais dire make -j12si j'ai 4 cœurs, indiquant maked'utiliser jusqu'à 12 threads.


Ma justification est que si j'utilise uniquement des $Cthreads, 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 $MGo de mémoire (où $Mest 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.

bitmask
la source
Dans de nombreux cas, la bonne réponse pour le nombre de threads sera le nombre de cœurs. Mais la seule façon de savoir avec certitude est d'exécuter des tests, en faisant varier le nombre de threads jusqu'à ce que vous trouviez le point idéal.
Robert Harvey
@RobertHarvey: Oui, je vais probablement aller compiler un script shell avec toutes sortes de paramètres pendant la nuit, mais j'ai pensé que je demanderais s'il existe des connaissances à ce sujet.
bitmask
4
beaucoup de gens suggèrent également $ cores + 1, donc 1 processus de compilation lit sur le disque tandis que 4 compilent. Une suggestion générique est difficile, dépend également de la base de code (surutilisation du modèle C ++ vs petites unités de compilation avec quelques fonctions C), de la chaîne du compilateur (en-têtes précompilés, etc.?) Et de la structure de construction (relie-t-il juste une grande chose dans le fin ou plusieurs petites choses entre les deux)
johannes
1
Si vous recherchez sérieusement des performances, je vous suggère de chercher à configurer un disque RAM ou une autre méthode pour alléger vos E / S. Je ne pense pas que l'utilisation du processeur soit votre point chaud.
TMN
@TMN: Comment un disque RAM aide-t-il? Linux est assez bonne à la mise en cache des choses (vous faites dire les fichiers d' en- tête, non?), Sans oublier le cache du lecteur. Je devrais tout d'abord charger dans le shm, soit manuellement, soit en changeant le script de construction (ce qui serait excessif).
bitmask

Réponses:

15

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:

compilation du temps llvm en fonction du nombre de travaux

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*$coresdans ce cas.

bitmask
la source
1
+1 pour les tests réels et sans spéculation.
Martin Wickman
3

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 + xest 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.
  • +xce 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églez x=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 -jvaleurs pour obtenir le meilleur nombre. Essayez également de paralléliser les autres étapes du processus de génération: décompression, exécution configure, etc.

ercpe
la source
Je m'intéresse principalement au C ++ pour le moment, et mes disques ne sont pas les plus rapides, je suppose.
bitmask
Commencez ensuite par n * 1.5 et augmentez-le jusqu'à ce que les temps de compilation cessent de diminuer (assurez-vous de nettoyer le cache disque / cache de compilation à chaque fois). Pensez également à utiliser ccache ( ccache.samba.org ) pour accélérer la compilation.
ercpe