/MP (Compilar con varios procesos)

La opción /MP puede reducir el tiempo total de compilación de los archivos de origen en la línea de comandos. La opción /MP hace que el compilador cree una o varias copias de sí mismo, cada una en un proceso independiente. Después, estas instancias compilan simultáneamente los archivos de origen. En algunos casos, se puede reducir considerablemente el tiempo total necesario para compilar los archivos de origen.

Sintaxis

/MP[processMax]

Argumentos

processMax
(Opcional) Número máximo de procesos que puede crear el compilador.

El argumento processMax debe estar comprendido entre 1 y 65536. De lo contrario, el compilador emite el mensaje de advertencia D9014, ignora el argumento processMax y presupone que el número máximo de procesos es 1.

Si omite el argumento processMax , el compilador recupera el número de procesadores efectivos en el equipo desde el sistema operativo y crea un proceso para cada procesador.

Comentarios

La opción del compilador /MP puede reducir considerablemente el tiempo de compilación al compilar varios archivos. Para mejorar el tiempo de compilación, el compilador crea hasta processMax copias de sí mismo y las usa para compilar los archivos de origen al mismo tiempo. La opción /MP se aplica a las compilaciones, pero no a la vinculación ni a la generación de código en tiempo de vinculación. De forma predeterminada, la opción /MP está desactivada.

La mejora en el tiempo de compilación depende del número de procesadores que hay en un equipo, del número de archivos que se van a compilar y de la disponibilidad de los recursos del sistema, como la capacidad de E/S. Experimente con la opción /MP para determinar la mejor configuración para compilar un proyecto en concreto. Para obtener consejos que le ayuden a tomar esa decisión, consulte Instrucciones.

Opciones y características de lenguaje incompatibles

La opción /MP es incompatible con algunas opciones del compilador y algunas características de lenguaje. Si usa una opción del compilador incompatible con la opción /MP, el compilador emite la advertencia D9030 e ignora la opción /MP. Si usa una característica de lenguaje incompatible, el compilador emite el error C2813 y termina o continúa, según la opción de nivel de advertencia del compilador actual.

Nota:

La mayoría de las opciones son incompatibles porque, de lo contrario, los compiladores que se ejecutan a la vez escribirían sus resultados al mismo tiempo en la consola o en un archivo determinado. Por consiguiente, el resultado podría combinarse y resultar confuso. En algunos casos, la combinación de opciones podría empeorar el rendimiento.

En la siguiente tabla aparecen las opciones del compilador y las características de lenguaje que no son compatibles con la opción /MP:

Opción o característica de lenguaje Descripción
#import Directiva de preprocesador Convierte los tipos en una biblioteca de tipos en clases de C++ y las escribe en un archivo de encabezado.
/E, /EP Copia los resultados del preprocesador en los resultados estándar (stdout).
/Gm Obsoleto. Permite una reconstrucción incremental.
/showIncludes Escribe una lista de archivos de inclusión en el error estándar (stderr).
/Yc Escribe un archivo de encabezado precompilado.

Mensajes de diagnóstico

Si especifica una opción o una característica de lenguaje que no es compatible con la opción /MP, recibirá un mensaje de diagnóstico. En la siguiente tabla aparecen los mensajes y el comportamiento del compilador:

Mensaje de diagnóstico Descripción Comportamiento del compilador
C2813 La directiva #import no es compatible con la opción /MP. La compilación finaliza a menos que una opción de nivel de advertencia del compilador especifique lo contrario.
D9014 Se especificó un valor no válido para el argumento processMax . El compilador omite el valor no válido y presupone el valor 1.
D9030 La opción especificada no es compatible con /MP. El compilador omite la opción /MP.

Directrices

Medir el rendimiento

Use el tiempo de compilación total para medir el rendimiento. Puede medir el tiempo de compilación con un reloj físico o con un software que calcule la diferencia entre el inicio y el final de la compilación. Si su equipo tiene varios procesadores, un reloj físico podría aportar unos resultados más precisos que una medición de tiempo de un software.

Procesadores efectivos

Un equipo puede tener uno o varios procesadores virtuales (también denominados procesadores efectivos), para cada uno de los procesadores físicos. Cada procesador físico puede tener uno o varios núcleos y, si el sistema operativo permite la tecnología hyperthreading para un núcleo, cada uno de ellos actúa como dos procesadores virtuales.

Por ejemplo, un equipo tiene un procesador efectivo si tiene un procesador físico que tiene un núcleo y la tecnología hyperthreading está deshabilitada. En cambio, un equipo tiene ocho procesadores efectivos si tiene dos procesadores físicos, cada uno de los cuales tiene dos núcleos y todos los núcleos tienen habilitada la tecnología hyperthreading. Es decir: (8 procesadores efectivos) = (2 procesadores físicos) x (2 núcleos por procesador físico) x (2 procesadores efectivos por núcleo debido al hyperthreading).

Si se omite el argumento processMax en la opción /MP, el compilador obtiene el número de procesadores efectivos a partir del sistema operativo, con lo que crea un proceso por cada procesador efectivo. Hay que tener en cuenta que el compilador no puede garantizar qué proceso se ejecuta en un procesador en concreto: el encargado de tomar esa decisión es el sistema operativo.

Número de procesos

El compilador calcula el número de procesos que va a usar para compilar los archivos de origen. Ese valor es el número más bajo del número de archivos de origen que especifica en la línea de comandos y el número de procesos que especifica explícita o implícitamente con la opción /MP. Puede establecer explícitamente el número máximo de procesos proporcionando el argumento processMax de la opción /MP. También puede usar el valor predeterminado, que es igual al número de procesadores efectivos que hay en un equipo si se omite el argumento processMax .

Por ejemplo, imagínese que especifica la siguiente línea de comandos:

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

En este caso, el compilador usa cinco procesos, ya que es el número más bajo de cinco archivos de origen y un máximo de siete procesos. También puede imaginarse que su equipo tiene dos procesadores efectivos y especifica la siguiente línea de comandos:

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

En este caso, el sistema operativo detecta dos procesadores, por lo que el compilador usará dos procesos en sus cálculos. Como resultado, el compilador usa dos procesos para ejecutar la compilación con dos procesos, ya que ese es el número más bajo de dos procesos y tres archivos de origen.

Archivos de origen y orden de compilación

Es posible que los archivos de origen no se compilen en el mismo orden en el que aparecen en la línea de comandos. Aunque el compilador crea un conjunto de procesos que contienen copias del compilador, el sistema operativo programa el momento en el que se ejecuta cada proceso. La opción /MP no puede garantizar que los archivos de origen se compilen en un orden determinado.

Un archivo de origen se compila cuando un proceso está disponible para la compilación. Si hay más archivos que procesos, los procesos disponibles compilan el primer conjunto de archivos. Los archivos restantes se procesan cuando un proceso acaba de tratar un archivo anterior y está disponible para trabajar en uno de los archivos restantes.

No especifique el mismo archivo de origen varias veces en una línea de comandos. Podrían producirse múltiples especificaciones, por ejemplo, si una herramienta crea automáticamente un archivo Make que se basa en la información de dependencia de un proyecto. Si no especifica la opción /MP, el compilador procesa secuencialmente la lista de archivos y vuelve a compilar todas las apariciones del archivo. Pero si la especifica la opción /MP, es posible que diferentes instancias de compilador compilen el mismo archivo a la vez. Las distintas instancias pueden intentar escribir en el mismo archivo de salida a la vez. Una instancia de compilador obtiene correctamente acceso exclusivo de escritura en el archivo de salida, mientras que otras instancias de compilador producirán un error de acceso al archivo.

Uso de bibliotecas de tipos (#import)

El compilador no admite el uso de la directiva #import con el modificador /MP. Si es posible, siga estos pasos para solucionar este problema:

  • Mueva todas las directivas #import de los distintos archivos de origen a uno o varios archivos y compílelos sin la opción /MP. El resultado será un conjunto de archivos de encabezado generados.

  • En los otros archivos de origen, inserte directivas #include que especifiquen los encabezados generados y compile los archivos de origen restantes con la opción /MP.

Configuración de un proyecto de Visual Studio

La herramienta MSBuild

Visual Studio usa la herramienta MSBuild (msbuild.exe) para crear soluciones y proyectos. La opción de línea de comandos /maxcpucount:number (o /m:number) de la herramienta MSBuild puede crear varios proyectos a la vez, mientras que la opción del compilador /MP puede crear varias unidades de compilación al mismo tiempo. Si es adecuado para su aplicación, mejore el tiempo de compilación de la solución usando /MP, /maxcpucount o ambas opciones.

El tiempo de compilación de la solución depende en parte del número de procesos que llevan a cabo la compilación. El argumento number de la opción /maxcpucount de MSBuild especifica el número máximo de proyectos que se van a compilar al mismo tiempo. De forma similar, el argumento processMax de la opción del compilador /MP especifica el número máximo de unidades de compilación que se van a crear al mismo tiempo. Si la opción /maxcpucount especifica P proyectos y la opción /MP especifica C procesos, se ejecutará a la vez un máximo de P x C procesos.

El criterio para decidir si se debe usar MSBuild o la tecnología /MP es el siguiente:

  • Si hay muchos proyectos con pocos archivos en cada proyecto, use la herramienta MSBuild con la opción /maxcpucount.

  • Si hay pocos proyectos con muchos archivos en cada proyecto, use la opción /MP.

  • Si el número de proyectos y archivos por proyecto está equilibrado, use MSBuild y /MP. Para comenzar, establezca la opción /maxcpucount en el número de proyectos que se van a crear y la opción /MP en el número de procesadores que hay en su equipo. Mida el rendimiento y, luego, ajuste la configuración para conseguir los mejores resultados. Repita este ciclo hasta que esté satisfecho con el tiempo de compilación total.

Consulte también

Directiva #import
Referencia de la línea de comandos de MSBuild
/Zf (Generación de PDB más rápida)