/MP (Générer avec plusieurs processus)
L'option de /MP peut réduire la durée totale pour compiler les fichiers source sur la ligne de commande. Avec l'option /MP, le compilateur crée une ou plusieurs copies de lui-même, chacune dans un processus séparé. Ensuite, ces copies compilent les fichiers source simultanément. Par conséquent, la durée totale de génération des fichiers sources peut être réduite considérablement.
/MP[processMax]
Arguments
processMax
(Facultatif) Le nombre maximal de processus que le compilateur peut créer.L'argument processMax doit être compris entre 1 et 65536. Sinon, le compilateur émet un message d'avertissement D9014, ignore l'argument de processMax et suppose que le nombre maximal de processus est 1.
Si l'argument processMax est omis, le compilateur récupère le nombre de processeurs effectifs sur votre ordinateur à partir du système d'exploitation et crée un processus pour chaque processeur.
Notes
L'option du compilateur /MP peut réduire considérablement le délai de génération lorsque vous compilez de nombreux fichiers. Pour améliorer le délai de génération, le compilateur crée le nombre maximal de copies processMax de lui-même, puis utilise ces copies pour compiler vos fichiers source en même temps. L'option /MP s'applique aux compilations, mais pas au lien ou à la génération du code durant l'édition de lien. Par défaut, l'option de /MP est désactivée.
L'amélioration du délai de génération dépend du nombre de processeurs sur un ordinateur, du nombre de fichiers à compiler et de la disponibilité des ressources système, telles que la capacité E/S. Faites des essais avec l'option /MP pour déterminer le meilleur paramètre pour générer un projet particulier. Pour des conseils afin de vous aider à prendre une telle décision, consultez Indications.
Options incompatibles et fonctionnalités de langage
L'option /MP est incompatible avec certaines options du compilateur et fonctionnalités de langage. Si vous utilisez une option du compilateur incompatible avec l'option /MP, le compilateur émet l'avertissement D9030 et ignore l'option /MP. Si vous utilisez une fonctionnalité de langage incompatible, le compilateur émet l'erreur C2813puis s'arrête ou continue selon l'option actuellement définie pour le niveau d'avertissement du compilateur.
Notes
La plupart des options sont incompatibles car si elles étaient autorisées, les compilateurs s'exécutant simultanément écriraient leur sortie en même temps à la console ou à un fichier particulier.En conséquence, la sortie serait mélangée et altérée.Dans certains cas, la combinaison des options pourrait entraîner une dégradation de la performance.
Le tableau suivant répertorie les options du compilateur et les fonctionnalités de langage qui sont incompatibles avec l'option /MP :
Option ou fonctionnalité de langage |
Description |
---|---|
Directive de préprocesseur #import |
Convertit les types dans une bibliothèque de types dans des classes C++, puis écrit ces classes dans un fichier d'en-tête. |
Copie la sortie du préprocesseur vers la sortie standard (stdout). |
|
Active une régénération incrémentielle. |
|
Écrit une liste de fichiers Include dans l'erreur standard (stderr). |
|
Écrit un fichier d'en-tête précompilé. |
Messages de diagnostic
Si vous spécifiez une option ou fonctionnalité de langage qui est incompatible avec l'option /MP, un message de diagnostic s'affichera. Le tableau suivant répertorie les messages et le comportement du compilateur :
Message de diagnostic |
Description |
Comportement du compilateur |
---|---|---|
C2813 |
La directive #import n'est pas compatible avec /MP. |
La compilation se termine à moins qu'une option niveau d'avertissement du compilateur indique le contraire. |
D9014 |
Une valeur non valide est spécifiée pour l'argument processMax. |
Le compilateur ignore la valeur non valide et suppose une valeur de 1. |
D9030 |
L'option spécifiée est incompatible avec /MP. |
Le compilateur ignore l'option /MP. |
Indications
Mesurer la performance
Utilisez le délai total de la génération pour mesurer la performance. Vous pouvez mesurer le délai de la génération à l'aide d'une horloge physique ou vous pouvez utiliser un logiciel qui calcule la différence entre le début et la fin de la génération. Si votre ordinateur est équipé de plusieurs processeurs, une horloge physique peut générer des résultats plus précis qu'un logiciel de mesures temporelles.
Processeurs effectifs
Un ordinateur peut avoir un ou plusieurs processeurs virtuels, qui sont également connus sous le nom de processeurs effectifs pour chacun de ses processeurs physiques. Chaque processeur physique peut avoir un ou plusieurs noyaux et si le système d'exploitation active la technologie HyperThreading pour un noyau, chaque noyau apparaît comme étant deux processeurs virtuels.
Par exemple, un ordinateur possède un processeur effectif s'il dispose d'un processeur physique avec un noyau et si la technologie HyperThreading est désactivée. Par opposition, un ordinateur possède huit processeurs effectifs s'il a deux processeurs physiques, chacun d'eux ayant deux noyaux et tous les noyaux ayant activé la technologie HyperThreading. Autrement dit, (8 processeurs effectifs) = (2 processeurs physiques) x (2 noyaux par processeur physique) x (2 processeurs effectifs par noyau en raison de la technologie HyperThreading ).
Si vous omettez l'argument processMax dans l'option /MP, le compilateur obtient le nombre de processeurs effectifs à partir du système d'exploitation, puis crée un processus par processeur effectif. Toutefois, le compilateur ne peut pas garantir le processus qui s'exécutera sur un processeur particulier ; c'est le système d'exploitation qui prend cette décision.
Nombre de processus
Le compilateur calcule le nombre de processus qu'il utilisera pour compiler les fichiers sources. Cette valeur représente le plus petit du nombre des fichiers sources que vous spécifiez sur la ligne de commande et du nombre des processus que vous spécifiez explicitement ou implicitement avec l'option /MP. Vous pouvez définir explicitement le nombre maximal de processus si vous fournissez l'argument processMax de l'option /MP. Vous pouvez également utiliser la valeur par défaut, qui est égale au nombre des processeurs effectifs dans un ordinateur si l'argument processMax est omis.
Par exemple, supposez que vous spécifiez la ligne de commande suivante :
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
Dans ce cas, le compilateur utilise cinq processus parce que c'est le plus petit des cinq fichiers sources et un maximum de sept processus. Ou bien, supposez que votre ordinateur a deux processeurs effectifs et que vous spécifiez la ligne de commande suivante :
cl /MP a.cpp b.cpp c.cpp
Dans ce cas, le système d'exploitation signale deux processeurs ; par conséquent, le compilateur utilise deux processus dans son calcul. En conséquence, le compilateur exécutera la génération avec deux processus parce que c'est le plus petit des deux processus et des trois fichiers sources.
Fichiers sources et ordre de la génération
Les fichiers sources peuvent ne pas être compilés dans le même ordre que celui dans lequel ils apparaissent dans la ligne de commande. Bien que le compilateur crée un jeu de processus contenant des copies du compilateur, le système d'exploitation planifie le moment d'exécution de chaque processus. Par conséquent, vous ne pouvez pas garantir la compilation des fichiers sources dans un ordre particulier.
Un fichier source est compilé lorsqu'un processus est disponible pour le compiler. S'il y a plus de fichiers que de processus, le premier jeu de fichiers est compilé par les processus disponibles. Les fichiers restants sont traités lorsqu'un processus termine la gestion d'un fichier précédent et est disponible pour travailler sur l'un des fichiers restants.
Ne spécifiez pas plusieurs fois le même fichier source sur une ligne de commande. Cela peut se produire, par exemple, si un outil crée automatiquement un makefile basé sur des informations sur les dépendances dans un projet. Si vous ne spécifiez pas l'option /MP, le compilateur traite la liste des fichiers séquentiellement et recompile chaque occurrence du fichier. Toutefois, si vous spécifiez l'option /MP, des compilateurs différents peuvent compiler le même fichier en même temps. Par conséquent, les différents compilateurs essaieront d'écrire en même temps dans le même fichier de sortie. Un compilateur acquerra l'accès en écriture exclusif dans le fichier de sortie et réussira tandis que les autres compilateurs échoueront avec une erreur dans le chemin d'accès au fichier.
Utilisation des bibliothèques de types (#import)
Le compilateur ne prend pas en charge l'utilisation de la directive #import avec le commutateur /MP. Suivez si possible ces étapes, pour contourner ce problème :
Déplacez toutes les directives #import dans vos différents fichiers sources vers un ou plusieurs fichiers, puis compilez ces fichiers sans l'option /MP. Le résultat est un jeu de fichiers d'en-tête générés.
Dans vos fichiers sources restants, insérez les directives #include qui spécifient les en-têtes générés, puis compilez vos fichiers sources restants à l'aide de l'option /MP.
Paramètres du projet Visual Studio
L'outil MSBUILD.exe
Visual Studio utilise l'outil MSBuild.exe pour générer des solutions et des projets. L'option de ligne de commande **/maxcpucount:**number (ou **/m:**number) de l'outil MSBuild.exe peut générer plusieurs projets en même temps. Et l'option du compilateur /MP peut générer plusieurs unités de compilation en même temps. Si cela s'avère approprié pour votre application, améliorez le délai de génération de votre solution en utilisant l'une ou l'autre ou les deux options /MP et /maxcpucount.
Le délai de génération de votre solution dépend en partie du nombre de processus qui effectuent la génération. L'argument number de l'option MSBuild /maxcpucount spécifie le nombre maximal de projets à générer simultanément. De même, l'argument processMax de l'option de compilateur /MP spécifie le nombre maximal d'unités de compilation à générer en même temps. Si l'option /maxcpucount spécifie des projets P et l'option /MP spécifie des processus C , un maximum de processus P x C s'exécutent en même temps.
L'indication pour décider s'il faut utiliser la technologie MSBuild ou /MP est la suivante :
S'il existe de nombreux projets avec peu de fichiers dans chaque projet, utilisez l'outil MSBuild.
S'il y a peu de projets avec de nombreux fichiers dans chaque projet, utilisez l'option /MP.
Si le nombre de projets et de fichiers par projet est équilibré, utilisez à la fois MSBuild et /MP. Affectez initialement l'option /maxcpucount au nombre de projets à générer et l'option /MP au nombre de processeurs sur votre ordinateur. Mesurez la performance puis ajustez vos paramètres pour obtenir les meilleurs résultats. Répétez ce cycle jusqu'à ce que le délai total de la génération vous convienne.
Option du compilateur /Gm
Par défaut, une génération de projet active l'option du compilateur (générations incrémentielles) /Gm pour les versions debug et la désactive pour les versions release. Par conséquent, l'option du compilateur /MP est automatiquement désactivée dans les versions debug car elle est en conflit avec l'option du compilateur /Gm par défaut.