/MP (Compilazione con più processi)

L'opzione /MP può ridurre il tempo totale per compilare i file di origine nella riga di comando. L'opzione /MP fa sì che il compilatore crei una o più copie di se stesso, ognuna in un processo separato. Quindi queste istanze compilano contemporaneamente i file di origine. In alcuni casi, il tempo totale per compilare i file di origine può essere ridotto in modo significativo.

Sintassi

/MP[processMax]

Argomenti

processMax
(Facoltativo) Numero massimo di processi che il compilatore può creare.

L'intervallo relativo all'argomento processMax deve essere compreso tra 1 e 65536. In caso contrario, il compilatore genera un messaggio di avviso D9014, ignora l'argomento processMax e presuppone che il numero massimo di processi sia 1.

Se si omette l'argomento processMax , il compilatore recupera il numero di processori effettivi nel computer dal sistema operativo e crea un processo per ogni processore.

Osservazioni:

L'opzione /MP del compilatore può ridurre significativamente il tempo di compilazione durante la compilazione di molti file. Per ridurre i tempi di compilazione, il compilatore crea fino a processMax copie di se stesso e le utilizza per compilare nello stesso momento i file di origine. L'opzione /MP si applica alle compilazioni, ma non al collegamento o alla generazione di codice in fase di collegamento. Per impostazione predefinita, l'opzione /MP è disattivata.

Il miglioramento del tempo di compilazione dipende dal numero di processori presenti in un computer, dal numero di file da compilare e dalla disponibilità delle risorse di sistema, ad esempio la capacità di I/O. Sperimentare con l'opzione /MP per determinare l'impostazione migliore per compilare un progetto specifico. Per consigli su come scegliere l'impostazione più appropriata, vedere Indicazioni.

Opzioni e funzionalità del linguaggio incompatibili

L'opzione /MP non è compatibile con alcune opzioni del compilatore e funzionalità del linguaggio. Se si usa un'opzione del compilatore incompatibile con l'opzione /MP , il compilatore genera l'avviso D9030 e ignora l'opzione /MP . Se si usa una funzionalità del linguaggio incompatibile, il compilatore genera l'errore C2813 e termina o continua a seconda dell'opzione del livello di avviso del compilatore corrente.

Nota

Molte delle opzioni sono incompatibili. Se fossero consentite, infatti, i compilatori in esecuzione scriverebbero contemporaneamente l'output nella console o in un determinato file. Di conseguenza, l'output risulterebbe confuso e illeggibile. In alcuni casi la combinazione di opzioni peggiorerebbe le prestazioni.

Nella tabella seguente sono elencate le opzioni del compilatore e le funzionalità del linguaggio incompatibili con l'opzione /MP :

Opzione o funzionalità del linguaggio Descrizione
#import direttiva del preprocessore Converte i tipi in una libreria dei tipi in classi C++ e quindi scrive tali classi in un file di intestazione.
/E, /EP Copia l'output del preprocessore nell'output standard (stdout).
/Gm Deprecato. Consente una ricompilazione incrementale.
/showIncludes Scrive un elenco di file di inclusione nell'errore standard (stderr).
/Yc Scrive un file di intestazione precompilato.

Messaggi di diagnostica

Se si specifica un'opzione o una funzionalità del linguaggio non compatibile con l'opzione /MP , si riceverà un messaggio di diagnostica. La tabella seguente elenca i messaggi e il comportamento del compilatore:

Messaggio di diagnostica Descrizione Comportamento del compilatore
C2813 La #import direttiva non è compatibile con l'opzione /MP . La compilazione termina, a meno che un'opzione relativa al livello di avviso del compilatore non specifichi diversamente.
D9014 Per l'argomento processMax è stato specificato un valore non valido. Il compilatore ignora il valore non valido e presuppone che il valore sia 1.
D9030 L'opzione specificata non è compatibile con /MP. Il compilatore ignora l'opzione /MP .

Linee guida

Misurare le prestazioni

Per misurare le prestazioni, usare il tempo totale di compilazione. È possibile misurare il tempo di compilazione con un orologio fisico oppure tramite uno strumento software che calcola la differenza tra l'avvio e l'arresto della compilazione. Se il computer ha più processori, un orologio fisico può produrre risultati più precisi rispetto alla misurazione del tempo tramite software.

Processori efficaci

Un computer può avere uno o più processori virtuali, noti anche come processori efficaci, per ognuno dei relativi processori fisici. Ogni processore fisico può avere uno o più core e, se il sistema operativo consente l'hyperthreading per un core, ciascun core viene visualizzato come due processori virtuali.

Un computer ha ad esempio un processore effettivo se ha un processore fisico con un core e l'hyperthreading è disabilitato. Al contrario, un computer ha otto processori effettivi se ha due processori fisici, ognuno con due core, e in tutti i core è abilitato l'hyperthreading. Ovvero( 8 processori effettivi) = (2 processori fisici) x (2 core per processore fisico) x (2 processori effettivi per core a causa dell'hyperthreading).

Se si omette l'argomento processMax nell'opzione /MP , il compilatore ottiene il numero di processori effettivi dal sistema operativo e quindi crea un processo per processore efficace. Tuttavia, il compilatore non può garantire quale processo viene eseguito su un determinato processore; il sistema operativo prende tale decisione.

Numero di processi

Il compilatore calcola il numero di processi usati per compilare i file di origine. Tale valore è minore del numero di file di origine specificati nella riga di comando e il numero di processi specificati in modo esplicito o implicito con l'opzione /MP . È possibile impostare in modo esplicito il numero massimo di processi se si specifica l'argomento processMax dell'opzione /MP . In alternativa, è possibile usare l'impostazione predefinita, che equivale al numero di processori effettivi in un computer, se si omette l'argomento processMax .

Si supponga, ad esempio, di specificare la riga di comando seguente:

cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp

In questo caso, il compilatore usa cinque processi perché è minore di cinque file di origine e un massimo di sette processi. In alternativa, si supponga che il computer abbia due processori effettivi e che si specifichi la riga di comando seguente:

cl /MP a.cpp b.cpp c.cpp

In questo caso, il sistema operativo segnala due processori, quindi il compilatore usa due processi nel calcolo. Di conseguenza, il compilatore usa due processi per eseguire la compilazione perché è minore di due processi e tre file di origine.

File di origine e ordine di compilazione

È possibile che i file di origine non vengano compilati nello stesso ordine in cui appaiono nella riga di comando. Anche se il compilatore crea un set di processi contenente copie del compilatore, il sistema operativo pianifica l'esecuzione di ogni processo. L'opzione /MP non può garantire che i file di origine vengano compilati in un ordine specifico.

Un file di origine viene compilato quando è disponibile un processo per la compilazione. Se il numero di file supera quello dei processi, il primo set di file viene compilato dai processi disponibili. I file rimanenti vengono elaborati quando un processo termina la gestione di un file precedente e diventa disponibile per gestire uno dei file rimanenti.

Non specificare più volte lo stesso file di origine in una riga di comando. Possono verificarsi più specifiche, ad esempio, se uno strumento crea automaticamente un makefile basato sulle informazioni sulle dipendenze in un progetto. Se non si specifica l'opzione /MP , il compilatore elabora l'elenco dei file in sequenza e ricompila ogni occorrenza del file. Tuttavia, se si specifica l'opzione /MP , istanze del compilatore diverse potrebbero compilare contemporaneamente lo stesso file. Le diverse istanze possono provare a scrivere nello stesso file di output contemporaneamente. Un'istanza del compilatore acquisisce l'accesso in scrittura esclusivo al file di output e ha esito positivo e le altre istanze del compilatore hanno esito negativo con un errore di accesso ai file.

Uso delle librerie dei tipi (#import)

Il compilatore non supporta l'uso della #import direttiva con l'opzione /MP . Se possibile, seguire questa procedura per risolvere il problema:

  • Spostare tutte le #import direttive nei vari file di origine in uno o più file e quindi compilare tali file senza l'opzione /MP . Il risultato è un set di file di intestazione generati.

  • Nei file di origine rimanenti inserire #include direttive che specificano le intestazioni generate e quindi compilare i file di origine rimanenti usando l'opzione /MP .

Impostazioni del progetto di Visual Studio

Strumento MSBuild

Visual Studio usa lo MSBuild strumento (msbuild.exe) per compilare soluzioni e progetti. L'opzione /maxcpucount:number della riga di comando (o /m:number) dello strumento MSBuild può compilare più progetti contemporaneamente. E l'opzione del /MP compilatore può creare più unità di compilazione contemporaneamente. Se è appropriato per l'applicazione, migliorare il tempo di compilazione della soluzione usando o entrambi /MP e /maxcpucount.

Il tempo di compilazione della soluzione dipende in parte dal numero di processi che eseguono la compilazione. L'argomento number dell'opzione /maxcpucount MSBuild specifica il numero massimo di progetti da compilare contemporaneamente. Analogamente, l'argomento processMax dell'opzione del /MP compilatore specifica il numero massimo di unità di compilazione da compilare contemporaneamente. Se l'opzione /maxcpucount specifica i progetti P e l'opzione /MP specifica i processi C , viene eseguito contemporaneamente un massimo di processi P x C .

Le linee guida per decidere se usare MSBuild o /MP la tecnologia sono le seguenti:

  • Se sono presenti molti progetti con pochi file in ogni progetto, usare lo strumento MSBuild con l'opzione /maxcpucount .

  • Se sono presenti pochi progetti con molti file in ogni progetto, usare l'opzione /MP .

  • Se il numero di progetti e file per progetto è bilanciato, usare sia MSBuild che /MP. Inizialmente impostare l'opzione /maxcpucount sul numero di progetti da compilare e sull'opzione /MP sul numero di processori nel computer. Misurare le prestazioni e quindi modificare le impostazioni per ottenere risultati ottimali. Ripetere il ciclo fino a quando non si è soddisfatti del tempo di compilazione totale.

Vedi anche

#import Direttiva
Informazioni di riferimento sulla riga di comando di MSBuild
/Zf (Generazione PDB più veloce)