/MP (compilazione con più processi)
L'opzione /MP può ridurre il tempo complessivo per compilare i file di origine nella riga di comando. L'opzione /MP determina la creazione da parte del compilatore di una o più copie di se stesso, ciascuna in un processo separato. Queste copie quindi compilano simultaneamente i file di origine. Di conseguenza, il tempo totale necessario per la compilazione dei file di origine può essere notevolmente ridotto.
/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 il 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 presenti nel computer dal sistema operativo e crea un processo per ogni processore.
Note
L'opzione del compilatore /MP può ridurre notevolmente il tempo di compilazione quando è necessario compilare 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 non è attiva.
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à I/O. Provare a utilizzare l'opzione /MP per determinare l'impostazione migliore per la compilazione di un determinato progetto. Per consigli su come scegliere l'impostazione più appropriata, vedere le Linee guida.
Opzioni e funzionalità del linguaggio incompatibili
L'opzione /MP è incompatibile con alcune opzioni del compilatore e funzionalità del linguaggio. Se si utilizza un'opzione del compilatore incompatibile con l'opzione /MP, il compilatore genererà l'avviso D9030 e ignorerà l'opzione /MP. Se si utilizza una funzionalità del linguaggio incompatibile, il compilatore genererà l'errore C2813, quindi terminerà o proseguirà a seconda dell'opzione corrente del livello di avviso del compilatore.
Nota
Molte opzioni sono incompatibili tra loro. Se fossero consentite, infatti, i compilatori contemporaneamente in esecuzione scriverebbero il relativo output al tempo stesso nella console o in un determinato file.Di conseguenza, l'output risulta confuso e illeggibile.In alcuni casi, la combinazione di opzioni comprometterebbe le prestazioni.
Nella tabella riportata di seguito sono elencate le opzioni del compilatore e le funzionalità del linguaggio incompatibili con l'opzione /MP:
Opzione o funzionalità del linguaggio |
Descrizione |
---|---|
Direttiva del preprocessore #import |
Converte i tipi presenti in una libreria dei tipi in classi C++, quindi scrive tali classi in un file di intestazione. |
Copia l'output del preprocessore nell'output standard (stdout). |
|
Consente una ricompilazione incrementale. |
|
Scrive un elenco di file di inclusione nell'errore standard (stderr). |
|
Scrive un file di intestazione precompilato. |
Messaggi di diagnostica
Se si specifica un'opzione o una funzionalità del linguaggio incompatibile con l'opzione /MP, verrà visualizzato un messaggio di diagnostica. Nella tabella riportata di seguito sono elencati i messaggi e il comportamento del compilatore:
Messaggio di diagnostica |
Descrizione |
Comportamento del compilatore |
---|---|---|
C2813 |
La direttiva #import non è compatibile con l'opzione /MP. |
La compilazione termina a meno che un'opzione del livello di avviso del compilatore specifichi un'azione diversa. |
D9014 |
Un valore non valido viene specificato per l'argomento processMax. |
Il compilatore ignora il valore non valido e presuppone un valore pari a 1. |
D9030 |
L'opzione specificata è incompatibile con /MP. |
Il compilatore ignora l'opzione /MP. |
Indicazioni
Misurazione delle prestazioni
Utilizzare il tempo di compilazione totale per misurare le prestazioni. È possibile misurare il tempo di compilazione con un orologio fisico o con un software che calcola la differenza tra l'inizio e la fine della compilazione. Se il computer ha più processori, un orologio fisico può produrre risultati più accurati rispetto a una misurazione del tempo tramite software.
Processori effettivi
Un computer può avere uno o più processori virtuali, noti anche come processori effettivi, per ciascuno dei processori fisici. Ogni processore fisico può avere a sua volta uno o più core e se il sistema operativo consente l'hyperthreading per un core, ogni core appare come se fosse formato da due processori virtuali.
Ad esempio, un computer ha un processore effettivo se ha uno processore fisico che include un core e l'hyperthreading è disabilitato. Al contrario, un computer ha otto processori effettivi se ha due processori fisici, ciascuno dei quali con due core, e in tutti i core l'hyperthreading è attivato. In altre parole, (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, quindi crea un processo per ogni processore effettivo. Non è tuttavia in grado di garantire quale processo viene eseguito su un particolare processore; in quanto l'assegnazione viene effettuata dal sistema operativo.
Numero di processi
Il compilatore calcola il numero di processi utilizzati per compilare i file di origine. Questo valore corrisponde al numero più basso tra il numero dei file di origine specificato sulla riga di comando e il numero dei processi specificato in modo esplicito o implicito con l'opzione /MP. È possibile impostare in modo esplicito il numero massimo di processi se si fornisce l'argomento processMax dell'opzione /MP. In alternativa, è possibile utilizzare l'impostazione predefinita, che equivale al numero di processori effettivi presenti in un computer, se si omette l'argomento processMax.
Si supponga, ad esempio, che venga specificata la riga di comando seguente:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
In questo caso il compilatore utilizza cinque processi in quanto cinque è il valore più basso tra il numero dei file di origine (cinque) e il numero massimo dei processi (sette) specificati. 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, poiché il sistema operativo segnala la presenza di due processori, il compilatore utilizza due processi nel calcolo. Di conseguenza, il compilatore eseguirà la compilazione con due processi perché si tratta del valore inferiore di due processi e tre file di origine.
File di origine e ordine di compilazione
I file di origine potrebbero non essere compilati nello stesso ordine in cui appaiono sulla riga di comando. Sebbene il compilatore crei un insieme di processi contenenti copie del compilatore, la pianificazione del momento dell'esecuzione di ciascun processo viene effettuata dal sistema operativo. Di conseguenza, non è possibile garantire che i file di origine vengano compilati in un determinato ordine.
Un file di origine viene compilato quando è disponibile un processo che consente la compilazione. Se il numero di file supera quello dei processi, il primo insieme di file viene compilato dai processi disponibili. I file rimanenti vengono elaborati quando un processo termina la gestione di un file precedente ed è disponibile per gestire uno dei file rimanenti.
Non specificare gli stessi file di origine più volte su una riga di comando. Questo fenomeno potrebbe verificarsi, ad esempio, se uno strumento crea automaticamente un makefile basato sulle informazioni sulle dipendenze in un progetto. Se non viene specificata l'opzione /MP, il compilatore elabora in sequenza l'elenco di file e ricompila ogni occorrenza del file. Tuttavia, se si specifica l'opzione /MP, è possibile che diversi compilatori compilino lo stesso file contemporaneamente. Di conseguenza, i diversi compilatori tenteranno di scrivere contemporaneamente nello stesso file di output. Un compilatore acquisirà un accesso esclusivo in scrittura, riuscendo a eseguire l'operazione, mentre l'esecuzione non verrà completata per gli altri compilatori e verrà generato un errore di accesso ai file.
Utilizzo delle librerie dei tipi (#import)
Il compilatore non supporta l'utilizzo della direttiva #import con l'opzione /MP. Per risolvere il problema, seguire, se possibile, la procedura seguente:
Spostare tutte le direttive #import presenti nei vari file di origine in uno o più file, quindi compilare i file in questione senza l'opzione /MP. Il risultato è un insieme di file di intestazione generati.
Nei file di origine rimanenti inserire le direttive #include che specificano le intestazioni generate e quindi compilare i file di origine rimanenti utilizzando l'opzione /MP.
Impostazioni del progetto di Visual Studio
Strumento MSBUILD.exe
Visual Studio utilizza lo strumento MSBuild.exe per compilare soluzioni e progetti. L'opzione della riga di comando **/maxcpucount:**number (o **/m:**number) dello strumento MSBuild.exe consente di compilare più progetti contemporaneamente. L'opzione del compilatore /MP inoltre può compilare più unità di compilazione contemporaneamente. Se l'operazione risulta appropriata per la propria applicazione, migliorare il tempo di compilazione della soluzione utilizzando una o entrambe le opzioni /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 MSBuild ms164311(v=vs.120).md specifica il numero massimo di progetti da compilare contemporaneamente. Analogamente, l'argomento processMax dell'opzione del compilatore /MP specifica il numero massimo di unità di compilazione da compilare contemporaneamente. Se l'opzione /maxcpucount specifica P progetti e l'opzione /MP specifica C processi, viene eseguito un massimo di P x C processi contemporaneamente.
Le indicazioni per decidere se utilizzare MSBuild o la tecnologia /MP sono le seguenti:
In presenza di molti progetti con pochi file al proprio interno, utilizzare lo strumento MSBuild.
In presenza di pochi progetti con molti file al proprio interno, utilizzare l'opzione /MP.
Se il numero di progetti e file per progetto è bilanciato, utilizzare sia MSBuild che /MP. Inizialmente impostare l'opzione /maxcpucount sul numero di progetti da compilare e l'opzione /MP sul numero di processori presenti nel computer. Misurare le prestazioni, quindi modificare le impostazioni per produrre i risultati migliori. Ripetere il ciclo fino a quando non si ottiene il tempo di compilazione totale desiderato.
Opzione del compilatore /Gm
Per impostazione predefinita, una compilazione del progetto abilita l'opzione del compilatore (compilazioni incrementali) /Gm per le build di debug e la disabilita per le build di rilascio. Pertanto, l'opzione del compilatore /MP è disabilitata automaticamente nelle build di debug perché crea un conflitto con l'opzione del compilatore /Gm predefinita.