/MP (com vários processos de compilação)
O /MP opção pode reduzir o tempo total para compilar os arquivos de origem da linha de comando. O /MP opção faz com que o compilador para criar uma ou mais cópias de si mesmo, cada um deles em um processo separado. Essas cópias compile simultaneamente os arquivos de origem. Conseqüentemente, o tempo total para criar os arquivos de origem poderá ser reduzido significativamente.
/MP[processMax]
Arguments
processMax
(Opcional) O número máximo de processos que o compilador pode criar.O processMax argumento deve variar de 1 a 65536. Caso contrário, o compilador emitirá a mensagem de aviso de D9014, ignora o processMax argumento e considera o número máximo de processos é 1.
Se você omitir o processMax argumento, o compilador recupera o número de processadores efetivos no computador do sistema operacional e cria um processo para cada processador.
Comentários
O /MP opção de compilador pode reduzir significativamente o tempo de compilação quando você compilar muitos arquivos. Para melhorar o tempo de compilação, o compilador cria até processMax cópias de si mesmo e usa essas cópias para compilar os arquivos de origem ao mesmo tempo. O /MP opção aplica-se a compilações, mas não a vinculação ou link-time code generation. Por padrão o /MP opção é desativado.
A melhoria no tempo de compilação depende do número de processadores em um computador, o número de arquivos para compilar e a disponibilidade dos recursos do sistema, como, por exemplo, a capacidade de e/S. Experimente o /MP opção para determinar a melhor configuração para criar um projeto específico. Para obter conselhos para ajudá-lo a tomar essa decisão, consulte diretrizes.
Os recursos de idioma e opções incompatíveis
O /MP opção é incompatível com algumas opções de compilador e recursos de idioma. Se você usar uma opção de compilador incompatível com o /MP opção, o compilador emitirá um aviso D9030 e ignora o /MP opção. Se você usar um recurso de idioma incompatível, o compilador emitirá o erro C2813, em seguida, encerra ou continua dependendo da atual compilador aviso nível opção.
Observação |
---|
A maioria das opções são incompatíveis, porque se eles foram permitidos, os compiladores de simultaneamente execução escreveria sua saída ao mesmo tempo para o console ou para um arquivo específico. Como resultado, a saída seria intermix e ser ilegível. Em alguns casos, a combinação das opções seria tornar o pior desempenho. |
A tabela a seguir lista as opções do compilador e recursos de linguagem que são incompatíveis com o /MP opção:
Opção ou o recurso de linguagem |
Description |
---|---|
# import diretiva de pré-processamento |
Converte os tipos de uma biblioteca de tipos de classes C++ e, em seguida, grava essas classes em um arquivo de cabeçalho. |
Copia a saída de pré-processador para a saída padrão (stdout). |
|
Permite uma recriação incremental. |
|
Grava uma lista de arquivos de inclusão de erro padrão (stderr). |
|
Grava um arquivo de cabeçalho pré-compilado. |
Mensagens de diagnóstico
Se você especificar um recurso de opção ou o idioma que é incompatível com o /MP opção, você receberá uma mensagem de diagnóstico. A tabela a seguir lista as mensagens e o comportamento do compilador:
Mensagem de diagnóstico |
Description |
Comportamento do compilador |
---|---|---|
O #import diretiva não é compatível com o /MP opção. |
A compilação termina, a menos que uma nível de aviso do compilador opção especifique algo em contrário. |
|
D9014 |
Um valor inválido for especificado para o processMax argumento. |
O compilador ignora o valor inválido e assume o valor 1. |
A opção especificada é incompatível com /MP. |
O compilador ignora o /MP opção. |
Guidelines
Medir o desempenho
Use o tempo de compilação total para medir o desempenho. Você pode medir o tempo de compilação com um relógio físico ou você pode usar o software que calcula a diferença entre quando a compilação inicia e pára. Se o computador tiver vários processadores, um relógio físico pode produzir resultados mais precisos do que uma medida de tempo do software.
Processadores efetivos
Um computador pode ter um ou mais processadores virtuais, que também são conhecidos como processadores efetivos, para cada um de seus processadores físicos. Cada processador físico pode ter um ou mais de núcleos e se o sistema operacional permite que o hyperthreading para um núcleo, cada núcleo parece ser de dois processadores virtuais.
Por exemplo, um computador tiver um processador eficaz se tiver um processador físico que tem um núcleo e hyperthreading é desativado. Em contraste, um computador tem oito processadores efetivos, se tiver dois processadores físicos, cada um com dois núcleos, e todos os núcleos têm hyperthreading ativado. Isto é, (8 processadores eficazes) = (2 processadores físicos) x (2 núcleos por processador físico) x (2 processadores eficazes por núcleo por causa do hyperthreading).
Se você omitir o processMax argumento o /MP opção, obtém o número de processadores efetivos do sistema operacional, o compilador e, em seguida, cria um processo por processador eficaz. No entanto, o compilador não pode garantir o processo que executa em um processador em particular; o sistema operacional torna essa decisão.
Número de processos
O compilador calcula o número de processos que serão usados para compilar os arquivos de origem. Que valor é menor do que o número de arquivos de origem que você especificar na linha de comando e o número de processos que você especificar explicitamente ou implicitamente com o /MP opção. Você pode definir explicitamente o número máximo de processos se você fornecer o processMax argumento o /MP opção. Ou você pode usar o padrão, o que é igual ao número de processadores efetivos em um computador, se você omitir o processMax argumento.
Por exemplo, suponha que você especificar a seguinte linha de comando:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
Nesse caso, o compilador usa cinco processos porque o que for menor do que cinco arquivos de origem e um máximo de sete processos. Como alternativa, suponha que seu computador possui dois processadores efetivos e especificar a seguinte linha de comando:
cl /MP a.cpp b.cpp c.cpp
Nesse caso o sistema operacional relata dois processadores. Portanto, o compilador usa dois processos em seu cálculo. Como resultado, o compilador irá executar a compilação com dois processos porque esse é o menor dos dois processos e os três arquivos de origem.
Arquivos de origem e a ordem de compilação
Os arquivos de origem não podem ser compilados na mesma ordem em que aparecem na linha de comando. Embora o compilador cria um conjunto de processos que contêm cópias do compilador, o sistema operacional agenda quando cada processo é executado. Conseqüentemente, você não pode garantir que os arquivos de origem serão compilados em uma ordem específica.
Um arquivo de origem é compilado quando um processo está disponível para compilá-lo. Se houver mais arquivos de processos, o primeiro conjunto de arquivos é compilado por processos disponíveis. Os arquivos restantes são processados quando um processo termina o tratamento de um arquivo anterior e está disponível para trabalhar em um dos arquivos restantes.
Não especifique o mesmo arquivo de origem várias vezes em uma linha de comando. Isso pode ocorrer, por exemplo, se uma ferramenta cria automaticamente um makefile que é baseado nas informações de dependência de um projeto. Se você não especificar o /MP opção, o compilador processa a lista de arquivos seqüencialmente e recompila cada ocorrência do arquivo. No entanto, se você especificar o /MP opção, os compiladores diferentes podem compilar o mesmo arquivo ao mesmo tempo. Conseqüentemente, os compiladores diferentes tentará gravar no mesmo arquivo de saída, ao mesmo tempo. Um compilador irá adquirir acesso de gravação exclusivo ao arquivo de saída e bem sucedido e os outros compiladores falhará com um erro de acesso de arquivo.
Usando bibliotecas de tipos (# Import)
O compilador não suporta o uso da # Import diretiva com o /MP switch. Se possível, siga estas etapas para solucionar esse problema:
Mover todos os #import diretivas no seu vários arquivos para um ou mais arquivos de origem e então compilar esses arquivos sem a /MP opção. O resultado é um conjunto de arquivos de cabeçalho gerado.
No restante do arquivos de origem, insira # include diretivas que especifique os cabeçalhos gerados e compile o restante de arquivos de origem usando o /MP opção.
Configurações de projeto de Visual Studio
A ferramenta MSBuild. exe
Visual Studiousa a MSBuild. exe ferramenta para criar soluções e projetos. O **/maxcpucount:**number (ou **/m:**number) a opção de linha de comando da ferramenta MSBuild. exe pode criar vários projetos ao mesmo tempo. E o /MP opção de compilador pode criar várias unidades de compilação ao mesmo tempo. Se for apropriado para seu aplicativo, melhorar o tempo de compilação da solução usando um ou ambos os /MP e /maxcpucount.
O tempo de compilação da solução parcialmente depende do número de processos que executam a compilação. O number argumento o /maxcpucount MSBuild opção especifica o número máximo de projetos para criar ao mesmo tempo. Da mesma forma, o processMax argumento o /MP opção de compilador Especifica o número máximo de unidades de compilação para criar ao mesmo tempo. Se o /maxcpucount Especifica a opção p projetos e o /MP Especifica a opção c processos, um máximo de p x c processos executados ao mesmo tempo.
A diretriz para decidir se deve usar MSBuild ou /MP tecnologia é o seguinte:
Se houver muitos projetos com alguns arquivos em cada projeto, use o MSBuild ferramenta.
Se houver alguns projetos com muitos arquivos em cada projeto, use o /MP opção.
Se o número de projetos e arquivos por projeto está equilibrado, usar ambos MSBuild e /MP. Inicialmente definida na /maxcpucount opção para o número de projetos para criar e o /MP opção para o número de processadores no computador. Medir o desempenho e ajuste suas configurações para produzir os melhores resultados. Repita esse ciclo até ficar satisfeito com o tempo de compilação total.
A opção de compilador de /Gm
Por padrão, um projeto de compilação permite que o /Gm compilador opção (compilações incrementais) para compilações de depuração e a desativa para compilações de versão. Portanto, o /MP opção de compilador é desabilitada automaticamente em compilações de depuração porque está em conflito com o padrão /Gm opção de compilador.