/MP (Compilar con varios procesos)

 

Publicado: octubre de 2016

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

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 copias compilan simultáneamente los archivos de origen. Por consiguiente, se puede reducir considerablemente el tiempo total necesario para compilar los archivos de origen.

/MP[processMax]  

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.

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, no a la generación de código de vinculación ni a la generación de código en tiempo de vínculo. 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.

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.

System_CAPS_ICON_note.jpg 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 lenguajeDescripción
Directiva de preprocesador #importConvierte los tipos en una biblioteca de tipos en clases de C++ y las escribe en un archivo de encabezado.
/E, /EPCopia los resultados del preprocesador en los resultados estándar (stdout).
/GmPermite una reconstrucción incremental.
/showIncludesEscribe una lista de archivos de inclusión en el error estándar (stderr).
/YcEscribe un archivo de encabezado precompilado.

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ósticoDescripciónComportamiento del compilador
C2813La 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.
D9014Se especificó un valor no válido para el argumento processMax.El compilador omite el valor no válido y presupone el valor 1.
D9030La opción especificada no es compatible con /MP.El compilador omite la opción /MP.

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 tanto, el compilador usará dos procesos en sus cálculos. Como resultado, el compilador 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. Por consiguiente, no se 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. Esto puede ocurrir, 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 /MP, es posible que diferentes compiladores compilen el mismo archivo a la vez. Por consiguiente, los distintos compiladores intentarán escribir en el mismo archivo de salida a la vez. Un compilador obtendrá correctamente acceso exclusivo de escritura en el archivo de salida, mientras que en el resto de los compiladores se producirá un error de acceso al archivo.

Usar 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

Herramienta MSBUILD.exe

Visual Studio usa la herramienta MSBuild.exe para crear soluciones y proyectos. La opción de línea de comandos /maxcpucount:number (o /m:number) de la herramienta MSBuild.exe 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 PxC procesos.

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

  • Si hay muchos proyectos con pocos archivos en cada proyecto, use la herramienta MSBuild.

  • 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.

Opción del compilador /Gm

De forma predeterminada, la compilación de un proyecto permite la opción del compilador /Gm (compilaciones incrementales) para las compilaciones de depuración y la deshabilita para las compilaciones de versión. Por lo tanto, la opción del compilador /MP se deshabilita automáticamente en las compilaciones de depuración, puesto que entra en conflicto con la opción del compilador /Gm predeterminada.

#import (Directiva)
Referencia de la línea de comandos

Mostrar: