Partager via


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

L’option /MP peut réduire le temps total de compilation des fichiers sources sur la ligne de commande. L’option /MP entraîne la création d’une ou plusieurs copies de lui-même, chacune dans un processus distinct. Ensuite, ces instances compilent simultanément les fichiers sources. Dans certains cas, le temps total de génération des fichiers sources peut être réduit de manière significative.

Syntaxe

/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 65 536. Sinon, le message d’avertissement D9014 du compilateur ignore l’argument processMax et suppose que le nombre maximal de processus est égal à 1.

Si vous omettez l’argument processMax , le compilateur récupère le nombre de processeurs effectifs sur votre ordinateur auprès du système d’exploitation et crée un processus pour chaque processeur.

Notes

L’option /MP du compilateur peut réduire considérablement le temps de génération lorsque vous compilez de nombreux fichiers. Pour améliorer le temps de génération, le compilateur crée jusqu’à processMax copies 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 à la liaison ou à la génération de code au moment du lien. Par défaut, l’option /MP est désactivée.

L’amélioration de la durée de la 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, comme la capacité d’E/S. Expérimentez avec l’option /MP permettant de déterminer le meilleur paramètre pour générer un projet particulier. Pour des conseils pour vous aider à décider, consultez Guidelines.

Options et fonctionnalités linguistiques incompatibles

L’option /MP n’est pas compatible avec certaines options du compilateur et certaines fonctionnalités de langage. Si vous utilisez une option de compilateur incompatible avec l’option /MP , le compilateur émet un avertissement D9030 et ignore l’option /MP . Si vous utilisez une fonctionnalité de langage incompatible, l’erreur C2813 se termine ou se poursuit en fonction de l’option de niveau d’avertissement du compilateur actuelle.

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 sur la console ou dans un fichier particulier. Par conséquent, la sortie serait un mélange incompréhensible. Dans certains cas, la combinaison des options diminuerait les performances.

Le tableau suivant répertorie les options du compilateur et les fonctionnalités de langage incompatibles avec l’option /MP :

Option ou fonctionnalité du langage Description
#import directive de préprocesseur Convertit les types d’une bibliothèque de types en 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 Action déconseillée. 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 une fonctionnalité de langue incompatible avec l’option /MP , vous recevrez un message de diagnostic. Le tableau suivant répertorie les messages et le comportement du compilateur :

Message de diagnostic Description Comportement du compilateur
C2813 La #import directive n’est pas compatible avec l’option /MP . La compilation se termine, sauf si une option de niveau d’avertissement du compilateur spécifie 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 .

Consignes

Mesurer les performances

Utilisez le temps total de la génération pour mesurer les performances. Vous pouvez mesurer le temps de la génération avec une horloge physique, ou vous pouvez utiliser le logiciel qui calcule la différence entre le moment où la génération démarre et celui où elle s’arrête. Si votre ordinateur a plusieurs processeurs, une horloge physique peut générer des résultats plus précis qu’un logiciel de mesure du temps.

Processeurs effectifs

Un ordinateur peut avoir un ou plusieurs processeurs virtuels, également appelés processeurs effectifs, pour chacun de ses processeurs physiques. Chaque processeur physique peut avoir un ou plusieurs cœurs et, si le système d’exploitation permet d’hyperthreading pour un cœur, chaque cœur apparaît comme deux processeurs virtuels.

Par exemple, un ordinateur a un processeur effectif s’il a un processeur physique avec un seul cœur et que l’hyperthreading est désactivé. En revanche, un ordinateur a huit processeurs effectifs s’il a deux processeurs physiques, que chacun d’eux a deux cœurs et que l’hyperthreading est activé sur tous les cœurs. Autrement dit, (8 processeurs effectifs) = (2 processeurs physiques) x (2 cœurs par processeur physique) x (2 processeurs effectifs par cœur en raison de l’hyperthreading).

Si vous omettez l’argument processMax dans l’option /MP , le compilateur obtient le nombre de processeurs effectifs du système d’exploitation, puis crée un processus par processeur effectif. Toutefois, le compilateur ne peut pas garantir l’exécution du processus sur un processeur particulier ; le système d’exploitation prend cette décision.

Nombre de processus

Le compilateur calcule le nombre de processus qu’il utilisera pour compiler les fichiers sources. Cette valeur est inférieure au nombre de fichiers sources que vous spécifiez sur la ligne de commande et au nombre de 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 aussi utiliser la valeur par défaut, qui est égale au nombre de processeurs effectifs dans un ordinateur, si vous omettez l’argument processMax .

Par exemple, supposons 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, car il s’agit de la moindre des cinq fichiers sources et d’un maximum de sept processus. Supposons maintenant 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. Le compilateur utilise donc deux processus dans son calcul. Par conséquent, le compilateur utilise deux processus pour exécuter la build, car il s’agit de la moindre des deux processus et trois fichiers sources.

Fichiers sources et ordre de génération

Les fichiers sources peuvent ne pas être compilés dans le même ordre que celui où ils apparaissent sur la ligne de commande. Bien que le compilateur crée un ensemble de processus contenant des copies du compilateur, le système d’exploitation planifie le moment d’exécution de chaque processus. L’option /MP ne peut pas garantir que les fichiers sources seront compilés dans un ordre particulier.

Un fichier source est compilé quand un processus est disponible pour le compiler. S’il y a plus de fichiers que de processus, le premier ensemble de fichiers est compilé par les processus disponibles. Les fichiers restants sont traités quand un processus termine le traitement d’un fichier précédent et qu’il est disponible pour travailler sur un des fichiers restants.

Ne spécifiez pas le même fichier source plusieurs fois sur une ligne de commande. Plusieurs spécifications peuvent se produire, par exemple, si un outil crée automatiquement un makefile basé sur des informations de dépendance dans un projet. Si vous ne spécifiez pas l’option /MP , le compilateur traite la liste des fichiers de manière séquentielle et recompile chaque occurrence du fichier. Toutefois, si vous spécifiez l’option /MP , différentes instances du compilateur peuvent compiler le même fichier en même temps. Les différentes instances peuvent essayer d’écrire dans le même fichier de sortie en même temps. Une instance du compilateur acquiert un accès en écriture exclusif au fichier de sortie et réussit, et les autres instances du compilateur échouent avec une erreur d’accès au fichier.

Utilisation de bibliothèques de types (#import)

Le compilateur ne prend pas en charge l’utilisation de la #import directive avec le /MP commutateur. Si possible, procédez comme suit pour contourner ce problème :

  • Déplacez toutes les #import directives de vos différents fichiers sources vers un ou plusieurs fichiers, puis compilez ces fichiers sans l’option /MP . Le résultat est un ensemble de fichiers d’en-tête générés.

  • Dans vos fichiers sources restants, insérez #include des directives 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 MSBuild

Visual Studio utilise l’outil MSBuild (msbuild.exe) pour générer des solutions et des projets. L’option /maxcpucount:number de ligne de commande (ou /m:number) de l’outil MSBuild peut générer plusieurs projets en même temps. Et l’option du /MP compilateur peut générer plusieurs unités de compilation en même temps. S’il est approprié pour votre application, améliorez le temps de génération de votre solution en utilisant l’une ou l’autre ou les deux/MP./maxcpucount

Le temps 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 /maxcpucount MSBuild spécifie le nombre maximal de projets à générer en même temps. De même, l’argument processMax de l’option du /MP compilateur 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 que l’option /MP spécifie des processus C , un maximum de processus P x C s’exécutent en même temps.

Les instructions pour décider s’il faut utiliser MSBuild ou /MP la technologie sont les suivantes :

  • S’il existe de nombreux projets avec peu de fichiers dans chaque projet, utilisez l’outil MSBuild avec l’option /maxcpucount .

  • S’il existe 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 MSBuild et /MP. Définissez initialement l’option /maxcpucount sur le nombre de projets à générer et l’option /MP sur le nombre de processeurs sur votre ordinateur. Mesurez les performances, puis ajustez les paramètres pour obtenir les meilleurs résultats. Répétez ce cycle jusqu’à ce que vous soyez satisfait du temps total de génération.

Voir aussi

Directive #import
Informations de référence sur la ligne de commande MSBuild
/Zf (Génération PDB plus rapide)