Compartilhar via


/MP (compilar com vários processos)

A opção /MP pode reduzir o tempo total para compilar os arquivos de origem na linha de comando. A opção /MP faz com que o compilador crie uma ou mais cópias de si mesmo, cada uma em um processo separado. Em seguida, essas instâncias compilam simultaneamente os arquivos de origem. Em alguns casos, o tempo total para compilar os arquivos de origem pode ser reduzido significativamente.

Sintaxe

/MP[processMax]

Argumentos

processMax
(Opcional) O número máximo de processos que o compilador pode criar.

O argumento processMax deve variar de 1 a 65536. Caso contrário, o compilador emite a mensagem de aviso D9014, ignora o argumento processMax e assume que o número máximo de processos é 1.

Se você omitir o argumento processMax, o compilador recuperará o número de processadores efetivos em seu computador a partir do sistema operacional e criará um processo para cada processador.

Comentários

A opção do compilador /MP pode reduzir significativamente o tempo de compilação ao compilar muitos arquivos. Para melhorar o tempo de compilação, o compilador cria até processMax cópias de si mesmo e, em seguida, usa essas cópias para compilar seus arquivos de origem ao mesmo tempo. A opção /MP se aplica a compilações, mas não a vinculação ou geração de código de tempo de vinculação. Por padrão, a opção /MP está desativada.

A melhoria no tempo de compilação depende do número de processadores em um computador, do número de arquivos a serem compilados e da disponibilidade de recursos do sistema, como capacidade de E/S. Experimente a opção /MP 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.

Opções e recursos de linguagem incompatíveis

A opção /MP é incompatível com algumas opções do compilador e recursos de linguagem. Se você usar uma opção de compilador incompatível com a opção /MP, o compilador emitirá um aviso D9030 e ignorará a opção /MP. Se você usar um recurso de linguagem incompatível, o compilador emitirá o erro C2813 e terminará ou continuará dependendo da opção de nível de aviso do compilador atual.

Observação

A maioria das opções são incompatíveis porque, se fossem permitidas, os compiladores em execução concorrente gravariam sua saída ao mesmo tempo no console ou em um arquivo específico. Como resultado, a saída seria misturada e distorcida. Em alguns casos, a combinação de opções pioraria o desempenho.

A tabela a seguir lista as opções do compilador e os recursos de linguagem que são incompatíveis com a opção /MP:

Opção ou recurso de linguagem Descrição
Diretiva de pré-processador #import Converte os tipos em uma biblioteca de tipos em classes C++ e, em seguida, grava essas classes em um arquivo de cabeçalho.
/E, /EP Copia a saída do pré-processador para a saída padrão (stdout).
/Gm Preterido. Habilita uma recompilação incremental.
/showIncludes Grava uma lista de arquivos de inclusão no erro padrão (stderr).
/Yc Grava um arquivo de cabeçalho pré-compilado.

Mensagens de diagnóstico

Se você especificar uma opção ou recurso de linguagem incompatível com a opção /MP, receberá uma mensagem de diagnóstico. A tabela a seguir lista as mensagens e o comportamento do compilador:

Mensagem de diagnóstico Descrição Comportamento do compilador
C2813 A diretiva #import não é compatível com a opção /MP. A compilação termina, a menos que uma opção de nível de aviso do compilador especifique o contrário.
D9014 Um valor inválido é especificado para o argumento processMax. O compilador ignora o valor inválido e assume o valor 1.
D9030 A opção especificada é incompatível com /MP. O compilador ignora a opção /MP.

Diretrizes

Medir o desempenho

Use o tempo total de compilação para medir o desempenho. Você pode medir o tempo de compilação com um relógio físico ou pode usar um software que calcula a diferença entre o início e o término da compilação. Se o seu computador tiver vários processadores, um relógio físico pode gerar resultados mais precisos do que uma medição de tempo por software.

Processadores eficazes

Um computador pode ter um ou mais processadores virtuais, também conhecidos como processadores efetivos, para cada um de seus processadores físicos. Cada processador físico pode ter um ou mais núcleos e, se o sistema operacional habilitar hyperthreading para um núcleo, cada núcleo parecerá ser dois processadores virtuais.

Por exemplo, um computador terá um processador efetivo se tiver um processador físico com um núcleo e o hyperthreading estiver desabilitado. Em contrapartida, um computador terá oito processadores efetivos se tiver dois processadores físicos, cada um com dois núcleos, e todos os núcleos estiverem com o hyperthreading habilitado. Ou seja, (8 processadores efetivos) = (2 processadores físicos) x (2 núcleos por processador físico) x (2 processadores efetivos por núcleo devido ao hyperthreading).

Se você omitir o argumento processMax na opção /MP, o compilador obterá o número de processadores efetivos do sistema operacional e, em seguida, criará um processo por processador efetivo. No entanto, o compilador não pode garantir qual processo é executado em um processador específico; o sistema operacional toma essa decisão.

Número de processos

O compilador calcula o número de processos que usará para compilar os arquivos de origem. Esse valor é o menor entre o número de arquivos de origem que você especifica na linha de comando e o número de processos que você especifica explícita ou implicitamente com a opção /MP. Você pode definir explicitamente o número máximo de processos se fornecer o argumento processMax da opção /MP. Ou você pode usar o padrão, que é igual ao número de processadores efetivos em um computador, se você omitir o argumento processMax.

Por exemplo, suponha que você especifique 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 esse é o menor de cinco arquivos de origem e um máximo de sete processos. Como alternativa, suponha que seu computador tenha dois processadores efetivos e você especifique a seguinte linha de comando:

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

Nesse caso, o sistema operacional informa dois processadores, portanto, o compilador usa dois processos em seu cálculo. Como resultado, o compilador usa dois processos para executar a compilação porque esse é o menor de dois processos e três arquivos de origem.

Arquivos de origem e ordem de compilação

Os arquivos de origem podem não ser compilados na mesma ordem em que aparecem na linha de comando. Embora o compilador crie um conjunto de processos que contém cópias do compilador, o sistema operacional agenda quando cada processo é executado. A opção /MP não pode garantir que os arquivos de origem sejam compilados em uma ordem específica.

Um arquivo fonte é compilado quando um processo está disponível para compilá-lo. Se houver mais arquivos do que processos, o primeiro conjunto de arquivos será compilado pelos processos disponíveis. Os arquivos restantes são processados quando um processo termina de manipular um arquivo anterior e fica disponível para trabalhar em um dos arquivos restantes.

Não especifique o mesmo arquivo de origem diversas vezes em uma linha de comando. Múltiplas especificações podem ocorrer, por exemplo, se uma ferramenta cria automaticamente um makefile baseado em informações de dependência em um projeto. Se você não especificar a opção /MP, o compilador processará a lista de arquivos sequencialmente e recompilará cada ocorrência do arquivo. No entanto, se você especificar a opção /MP, diferentes instâncias do compilador poderão compilar o mesmo arquivo ao mesmo tempo. As diferentes instâncias podem tentar gravar no mesmo arquivo de saída ao mesmo tempo. Uma instância do compilador adquire acesso de gravação exclusivo ao arquivo de saída e é bem-sucedida, e as outras instâncias do compilador falham com um erro de acesso ao arquivo.

Usando bibliotecas de tipos (#import)

O compilador não suporta o uso da diretiva #import com a opção /MP. Se possível, siga estas etapas para contornar esse problema:

  • Mova todas as diretivas #import em seus vários arquivos de origem para um ou mais arquivos e, em seguida, compile esses arquivos sem a opção /MP. O resultado é um conjunto de arquivos de cabeçalho gerados.

  • Nos arquivos de origem restantes, insira diretivas #include que especificam os cabeçalhos gerados e, em seguida, compile os arquivos de origem restantes usando a opção /MP.

Configurações do projeto do Visual Studio

A ferramenta MSBuild

O Visual Studio usa a ferramenta MSBuild (msbuild.exe) para criar soluções e projetos. A opção de linha de comando /maxcpucount:number (ou /m:number) da ferramenta MSBuild pode criar vários projetos ao mesmo tempo. E a opção do compilador /MP pode construir várias unidades de compilação ao mesmo tempo. Se for apropriado para seu aplicativo, melhore o tempo de compilação de sua solução usando um ou ambos /MP e /maxcpucount.

O tempo de compilação de sua solução depende parcialmente do número de processos que executam a compilação. O argumento number da opção MSBuild /maxcpucount especifica o número máximo de projetos a serem compilados ao mesmo tempo. Da mesma forma, o argumento processMax da opção do compilador /MP especifica o número máximo de unidades de compilação a serem compiladas ao mesmo tempo. Se a opção /maxcpucount especificar projetos P e a opção /MP especificar processos C, um máximo de processos P x C executar ao mesmo tempo.

A diretriz para decidir se deve usar a tecnologia MSBuild ou /MP é a seguinte:

  • Se houver muitos projetos com poucos arquivos em cada projeto, use a ferramenta MSBuild com a opção /maxcpucount.

  • Se houver poucos projetos com muitos arquivos em cada projeto, use a opção /MP.

  • Se o número de projetos e arquivos por projeto for equilibrado, use MSBuild e /MP. Inicialmente defina a opção /maxcpucount para o número de projetos a serem compilados e a opção /MP para o número de processadores em seu computador. Meça o desempenho e ajuste suas configurações para obter os melhores resultados. Repita esse ciclo até ficar satisfeito com o tempo total de compilação.

Confira também

diretiva #import
Referência de linha de comando do MSBuild
/Zf (gerar PDB mais rápido)