Compartilhar via


/MP (compilar com vários processos)

A opção de /MP pode reduzir o tempo total de criar os arquivos de origem na linha de comando. A opção de /MP faz com que o compilador crie uma ou várias cópias do, cada um em um processo separado. Nessas cópias criar simultaneamente os arquivos de origem. Consequentemente, o tempo total de criar os arquivos de origem podem ser reduzido significativamente.

/MP[processMax]

Arguments

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

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

    Se você omitir o argumento de processMax , o compilador recupera o número de processadores efetivas no computador do sistema operacional, e cria um processo para cada processador.

Comentários

A opção do compilador de /MP pode reduzir significativamente o tempo de compilação em que você cria muitos arquivos. Para melhorar o tempo de compilação, o compilador cria até processMax cópias do, e usar essas cópias para criar ao mesmo tempo seus arquivos de origem. A opção de /MP se aplica às compilações, mas não à geração de código vinculados ou de link- Horas. Por padrão a opção de /MP será.

A melhoria em tempo de compilação depende do número de processadores em um computador, do número de arquivos para compilar, e disponibilidade de recursos do sistema, como a habilidade de E/S. Experiência com a opção de /MP determinar a melhor configuração criar um projeto específico. Para que subsídio para ajudar a tornar essa decisão, consulte Diretrizes.

Opções incompatíveis e recursos de idioma

A opção de /MP é incompatível com quaisquer opções do compilador e recursos de idioma. Se você usar uma opção incompatível do compilador com a opção de /MP , o compilador emite D9030 de aviso e ignora a opção de /MP . Se você usar um recurso de idioma incompatível, o compilador emite extremidades de C2813de erro em ou continua dependendo da opção atual do nível de aviso do compilador.

Dica

A maioria das opções são incompatíveis como se forem permitidos, os compiladores simultaneamente em execução escreveriam sua saída ao mesmo tempo no console ou em um arquivo específico.No resultado, a saída misturar-se-iam e serão truncadas.Em alguns casos, a combinação de opções faria o desempenho pior.

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

Recurso da opção ou de idioma

Descrição

política de pré-processador de#import

Converter tipos em uma biblioteca de tipos em classes C++, e grava essas classes em um arquivo de cabeçalho.

/E, /EP

Copia saída de pré-processador para a saída padrão (stdout).

/Gm

Habilita uma recriação incremental.

/showIncludes

Grava uma lista de arquivos incluem ao erro padrão (stderr).

/Yc

Grava um arquivo de cabeçalho pré-compilado.

Mensagens de diagnóstico

Se você especificar um recurso da opção ou de idioma que é incompatível com a opção de /MP , você 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 política de #import não é compatível com a opção de /MP .

A compilação termina a menos que um padrão de nível de aviso do compilador especifique de outra forma.

D9014

Um valor inválido é especificado para o argumento de processMax .

O compilador ignora o valor inválido e assume um valor de 1.

D9030

A opção especificada é incompatível com /MP.

O compilador ignora a opção de /MP .

Diretrizes

Desempenho de medida

Use tempo total de compilação 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 o momento da compilação iniciar e parar. Se o computador tiver vários processadores, um relógio físico pode produzir resultados mais precisos de que uma medida de tempo de software.

Processadores efetivas

Um computador pode ter um ou mais processadores virtuais, que também são conhecidos como processadores efetivas, para cada um dos processadores físicos. Cada processador físico pode ter um ou mais núcleos, e se o sistema operacional habilita o hyperthreading de um principal, cada núcleo parece ser dois processadores virtuais.

Por exemplo, um computador tiver um processador eficaz se tem um processador físico que tem um principal, e o hyperthreading desabilitado. Por outro lado, um computador tiver oito processadores efetivos se tem dois processadores físicos, cada qual com dois núcleos, e todos os núcleos com hyperthreading habilitado. Ou seja, (8) = processadores efetivas (2 processadores físicos) x (2 núcleos por processador físico) x (2 processadores efetivas por núcleo devido ao hyperthreading).

Se você omitir o argumento de processMax na opção de /MP , o compilador obtém o número de processadores efetivas do sistema operacional, e depois cria um processo pelo processador efetivo. No entanto, o compilador não pode garantir que o processo é executado em um processador específico; o sistema operacional fazer essa decisão.

Número de processos

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

Por exemplo, suponha que você especifica a seguinte linha de comando:

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

Nesse caso o compilador usa cinco processos pois esse é o menos de cinco arquivos de origem e um máximo de sete processos. Como alternativa, suponhamos que seu computador o tem dois processadores efetivas e especifique a seguinte linha de comando:

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

Nesse caso o sistema operacional informa dois processadores; em virtude disso, o compilador usa dois processos no cálculo. No, o compilador executará a construção com dois processos pois esse é o menor dos dois processos e três arquivos de origem.

Arquivos de origem e a ordem de compilação

Os arquivos de origem não podem ser criados 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. Consequentemente, você não pode garantir que os arquivos de origem serão criados em uma ordem específica.

Um arquivo de origem é criado quando um processo está disponível para o criar. Se houver mais processos de arquivos, o primeiro conjunto de arquivos é criado por processos disponíveis. Os arquivos restantes são processados quando um processo termina tratar um arquivo anterior e estão disponíveis para funcionar em um dos arquivos restantes.

Não especifique o mesmo arquivo de origem várias vezes em uma linha de comando. Isto pode ocorrer, por exemplo, se uma ferramenta cria automaticamente makefile que foi com base nas informações de dependência em um projeto. Se você não especificar a opção de /MP , o compilador processa a lista de arquivos em sequência e recompila cada ocorrência do arquivo. No entanto, se você especificar a opção de /MP , os compiladores diferentes podem criar o mesmo arquivo ao mesmo tempo. Consequentemente, os compiladores diferentes tentarão gravar no mesmo tempo no mesmo arquivo de saída. Um compilador adquirirá o acesso de gravação exclusivo ao arquivo de saída e terá êxito, e os outros compiladores falhará com um erro de acesso ao arquivo.

Usando bibliotecas de tipo (#import)

O compilador não oferece suporte ao uso da política de #import com a opção de /MP . Se possível, siga estas etapas para contornar este problema:

  • Mover todas as políticas de #import nos vários arquivos de origem para um ou mais arquivos, e depois criar esses arquivos sem a opção de /MP . O resultado é um conjunto de arquivos de cabeçalho gerados.

  • Em seus arquivos de origem restantes, as políticas de #include de inserção que especificam os cabeçalhos gerados, e criam em seus arquivos de origem restantes usando a opção de /MP .

Configurações de projeto do Visual Studio

A ferramenta do MSBUILD.exe

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

A hora de criação de sua solução depende parcialmente do número de processos em execução a compilação. O argumento de number da opção de /maxcpucount MSBuild especifica o número máximo de compilar projetos ao mesmo tempo. Da mesma forma, o argumento de processMax de opções do compilador de /MP especifica o número máximo de unidades de compilação para criar ao mesmo tempo. Se a opção de /maxcpucount especifica projetos de P e a opção de /MP especifica processos de C , um máximo de processos de PxC é executado ao mesmo tempo.

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

  • Se houver muitos projetos com poucos arquivos em cada projeto, use a ferramenta de MSBuild .

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

  • Se o número de projetos e arquivos no projeto é equilibrada, use MSBuild e /MP. Definir inicialmente a opção de /maxcpucount ao número de compilar projetos e a opção de /MP ao número de processadores no computador. Medir o desempenho e ajuste em suas configurações para obter os melhores resultados. Repita esse ciclo até ficar satisfeito com tempo total de compilação.

A opção de compilador do /Gm

Por padrão, uma compilação do projeto habilita a opção de compilador de /Gm (construções incrementais) para construções de depuração, e desabilita a qual a versão cria. Consequentemente, a opção do compilador de /MP é automaticamente desabilitada em construções de depuração porque entra em conflito com a opção padrão do compilador de /Gm .

Consulte também

Referência

Diretiva #import (C++)

Referência de linha de comando MSBuild