web-dev-qa-db-fra.com

Comment compiler sur plusieurs cœurs en utilisant mingw dans QTCreator

J'ai un processeur quad-core i7 sur mon bureau Windows. J'essaye de faire compiler mingw32-make en utilisant autant de cœurs que possible. J'ai ajouté -j8 dans les champs "Make Arguments" sous Build Settings-> Build Steps. Mingw32-make semble ignorer complètement l'option car je n'obtiens aucune amélioration de la vitesse. Lorsque je consulte l'utilisation du processeur dans le gestionnaire de tâches, il reste à 13% et je ne vois qu'une seule instance de g ++ en cours d'exécution. 

À l'heure actuelle, la reconstruction de l'ensemble du projet à l'aide de mingw prend 3 minutes complètes. La reconstruction à l'aide de MSVC ne prend que 15 secondes. 

Pour votre information, j'ai activé l'option d'en-tête précompilé dans les paramètres du projet. Cela rend aussi les choses beaucoup plus rapidement avec VC. Mais je ne vois pas encore l'intérêt de l'en-tête précompilé avec mingw. 

S'il vous plaît partagez vos commentaires si vous avez déjà eu la possibilité de compiler plusieurs fichiers source en parallèle à partir de QTCreator. Merci! 

20
Stephen Cheng

Voici ce que j'ai fait.

Dans le menu Outils -> Options de Qt Creator, dans la section "Construire et exécuter", une option indique "Utiliser jom au lieu de nmake". J'ai coché cette case, mais rien n'a changé. Alors au lieu de cela, je suis allé dans les paramètres de construction du projet et dans la catégorie étapes de construction, il y a un élément "Créer". Développez les détails à ce sujet et vous trouverez un élément "Remplacer mingw32-make.exe:". J'ai collé "C:\QtSDK\QtCreator\bin\jom.exe", et tout à coup, je construisais avec plusieurs cœurs.

Travaillé pour moi sur Qt Creator 2.4.1. Essaie.

22
kenrogers

-j8 ne fonctionne probablement pas à cause d'une limitation de GNU Make sur Win32. 

Essayez de mettre juste -j dans le champ make arguments. Cela indique à Make de générer autant de processus de compilation que possible. Si vous avez assez de RAM et de CPU pour le gérer, cela devrait être plus rapide qu'une compilation unique. 

Malheureusement, ce sont les deux seules options possibles (sans modifier les Makefiles): soit -j1, soit illimité -j.

Détails complets: GNU Make sur Win32 ne prend pas en charge le serveur de travaux. Un processus Make parent ne peut donc pas suivre le nombre de processus de compilation générés par un sous-constructeur. Pour plus de sécurité, le sous-fabricant ne s'exécute qu'avec -j1. Je pense que les fichiers Makefiles générés par qmake/Qt Creator utilisent plusieurs couches de fichiers Makefiles. J'ai d'abord compris ce problème avec MPLAB X IDE de Microchip, consultez ce fil de discussion pour plus d'informations

Cette citation provient de README.W32 distribué avec GNU Make 

Prise en charge des constructions parallèles 

Les constructions parallèles (-jN) sont prises en charge sur ce port, avec 2 limitations : 

  • Le nombre de processus simultanés a une limite stricte de 64, En raison de la façon dont ce port implémente l'attente de ses Sous-processus; 

  • La méthode du serveur de travaux (disponible lorsque Make s'exécute sur les plateformes Posix ) N'est pas prise en charge, ce qui signifie que vous devez passer un commutateur -JN explicite à un sous-fabricant dans un fichier Makefile récursif. Si un sous-Make ne reçoit pas de commutateur explicite -jN, il sera par défaut à -j1, c’est-à-dire qu’il n’ya pas de parallélisme dans le sous-Make. 

11
Brendan Shanks

Ajoutez -j9 (remplacez 9 par la valeur de NUMBER_OF_PROCESSORS (Windows)/$(nproc) (Linux) plus un - ceci est optimal) à tous

QString makefilein = " -f " + subtarget->makefile;

lignes dans qmake\generators\makefile.cpp (trouvez-le vous-même).

Il en résulte que

QString makefilein = " -j9 -f " + subtarget->makefile;

exécutez ensuite configure.exe avec les paramètres appropriés (! et -qmake -dont-process supplémentaire pour éviter toute génération de makefiles!).

Le problème est que vous obtenez deux ensembles de processus lors de la construction "débogage et publication". Ainsi, le nombre total de processus générés est supérieur à 18.

4
Orient

Utilisez la variable d'environnement MAKE_COMMAND:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%
3
Stephen Chu

Dans Qt Creator, sélectionnez Projets -> Construire et exécuter -> votre configuration de construction MinGW spécifique -> Environnement de construction (à l’écran ci-dessous Général/Étapes de construction/Étapes de nettoyage ..), puis ajoutez une variable MAKEFLAGS et définissez-la sur -j8 . J'ai testé cela sur ma machine à deux cœurs avec -j4 et QtCreator 4.4.1 et avec MinGW 5.3.0. Lors de la compilation, mon processeur fonctionne à 100%, comme le montre le Gestionnaire des tâches. Sans cette option, elle représentait environ 25%, donc je suppose que cela fonctionne exactement comme prévu. La construction est maintenant beaucoup plus rapide.

1
V.K.

-j est la voie à suivre. Malheureusement pour moi, le projet est tellement volumineux qu'il utilise toute la mémoire disponible et mon ordinateur se bloque, soyez donc conscient de cela. Brendan a déclaré qu'il n'y avait aucun moyen d'utiliser uniquement la moitié de vos cœurs, ce qui est dommage si c'est vrai.

0
user1274616

Le problème est que la marque d'origine ne prend pas en charge le serveur de travaux. Donc, le portage mingw32 ne l’avait pas non plus. Il a depuis été ajouté cependant. Je crois que la version la plus ancienne avec le support «correct» de Jobserver est 3.82.90. Vous pouvez trouver cela sur le lien ci-dessous.

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/

0
inetknght