Share via


/MP (Générer avec plusieurs processus)

Mise à jour : novembre 2007

L'option /MP peut réduire la durée totale de la compilation des fichiers sources 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 sources 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 se situer dans la plage comprise entre 1 et 65536. Sinon, le compilateur émet le message d'avertissement D9014, ignore l'argument 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 sources 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. L'option /MP est désactivée par défaut.

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 C2813 puis se termine ou continue selon l'option actuelle du niveau d'avertissement du compilateur.

Remarque :

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.

/E, /EP

Copie la sortie du préprocesseur vers la sortie standard (stdout).

/Gm

Active une régénération incrémentielle.

/showIncludes

Écrit une liste de fichiers Include dans l'erreur standard (stderr).

/Yc

É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

Outil VCBUILD.exe

Visual Studio utilise l'outil VCBUILD.exe pour générer des solutions et des projets. L'outil VCBUILD.exe peut générer des projets simultanément et l'option du compilateur /MP peut générer des unités de compilation simultanément. 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 VCBuild.

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'option /M de l'outil VCBUILD.exe spécifie le nombre maximal de projets à générer en même temps. De même, l'argument processMax de l'option /MP spécifie le nombre maximal d'unités de compilation à générer en même temps. Si l'option /M spécifie des projets P et l'option /MP spécifie des processus C, un maximum de processus PxC s'exécutent en même temps.

L'indication pour décider s'il faut utiliser la technologie VCBuild ou /MP est la suivante :

  • S'il existe de nombreux projets avec peu de fichiers dans chaque projet, utilisez l'outil VCBuild.

  • 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 VCBuild et /MP. Affectez initialement l'option /M 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.

Voir aussi

Référence

The #import Directive

Autres ressources

Référence VCBUILD