make -j4 ou -j8

J’ai 4 processeurs et je suis en train de comstackr une application gourmande en processeur. J’ai lu que l’utilisation de make avec le commutateur -j4 était recommandée pour OpenCV. Devrais-je plutôt utiliser -j8 et quel est l’avantage de créer plusieurs processeurs?

Comme vous le dites, l’ -j indique à make qu’il est autorisé à générer le nombre de «threads» fourni. Idéalement, chaque thread est exécuté sur son propre kernel / CPU, afin que votre environnement multi-core / CPU soit utilisé au maximum.

make ne comstack pas les fichiers source. Ceci est fait par un compilateur (gcc). Le Makefile (entrée pour make ) contient un ensemble de cibles. Chaque cible a un ensemble de dépendances (sur d’autres cibles) et des règles sur la manière de construire la cible. make lit le ou les Makefile (s) et gère toutes les cibles, dépendances et règles de construction. Outre la compilation des fichiers source, vous pouvez utiliser make pour effectuer toute tâche pouvant être décrite par des commandes shell.

Si vous définissez un nombre trop élevé de threads, il est impossible de planifier chaque thread sur son propre kernel. Des commutateurs de planification (context) supplémentaires sont nécessaires pour permettre à tous les threads de s’exécuter. Cette utilisation supplémentaire des ressources entraîne évidemment une baisse des performances.

Il existe plusieurs règles empiriques, mais j’imagine que le paramètre le plus commun est + 1 . L’idée sous-jacente est que tous les cœurs ont leur propre thread et qu’il existe un autre thread de gestion qui gère les cibles et qui doit ensuite être construit.

Les réponses ci-dessus sont pour la plupart correctes. Cependant, les détails sont un peu trompeurs. Par exemple, il n’est pas nécessaire d’append un travail supplémentaire pour un “thread de gestion” (remarque: make n’est pas réellement multithread). make ne se compte jamais comme un travail aux fins de -j , aussi, comme le dit Huygens ci-dessus, si vous dites -j5 vous obtiendrez 5 tâches de compilation en cours d’exécution, pas 4 plus make.

La raison pour laquelle la plupart des gens utilisent [nombre de cœurs] + [certains bourrages] n’a rien à voir avec make ou ce dont elle a besoin, mais plutôt avec la nature du compilateur. Un compilateur n’est en réalité qu’un outil très complexe de traduction de texte: il lit un texte sous une forme et le convertit en “texte” (binary) sous une autre forme. Une grande partie de cela (surtout à mesure que votre langage devient plus complexe, comme le C ++), nécessite beaucoup de temps processeur. Mais cela nécessite également beaucoup d’E / S de disque. Les E / S de disque sont lentes. Ainsi, lorsqu’un compilateur attend certaines données du disque, le kernel planifie l’exécution d’autres travaux. C’est pourquoi vous pouvez utilement avoir plus que le nombre de cœurs compilés en cours d’exécution en même temps.

La taille exacte que vous pouvez obtenir -j avant de commencer à voir des rendements décroissants (vos versions commencent réellement à ralentir, à un moment donné, avec plus -j ) dépend entièrement de votre matériel, du type de construction que vous effectuez, etc. façon de savoir avec certitude est l’expérimentation.

Cependant, [nombre de cœurs] + [quelques-uns] est généralement une bonne approximation.

L’option -j est uniquement utilisée pour accélérer la construction de l’application. Elle détermine le nombre de tâches pouvant générer la génération. Vous pouvez soit définir -j ou même plus élevé -j afin que la compilation puisse avoir lieu en parallèle.

Cela n’a aucun impact sur le code compilé.

Pour un système à 4 cœurs, vous pouvez essayer de make -j6 . Si make peut exécuter des versions parallèles, il lancera jusqu’à 6 processus de compilation simultanés (par exemple 6 appels à gcc).

Un processeur par thread plus un gestionnaire / chargeur. Dans la mesure où un thread qui effectue des opérations de disque est techniquement presque inactif du sharepoint vue du processeur, ajoutez-en un au nombre total de cœurs.

Si le processeur utilise l’hyperthreading, vous pouvez compter en toute sécurité sur chaque cœur comme deux cœurs et doubler le nombre de threads. Ainsi, un processeur Intel Core i7 quadricœur devrait obtenir -j9 (huit cœurs virtuels plus le gestionnaire). Sur un processeur AMD quad core, utilisez -j5