/MP (Generar con varios procesos)

Actualización: noviembre 2007

La opción /MP puede reducir el tiempo total necesario para compilar los archivos de código fuente desde la línea de comandos. La opción /MP hace que el compilador cree una o más copias de sí mismo, cada una en un proceso independiente. A continuación, estas copias compilan simultáneamente los archivos de código fuente. Esto permite reducir significativamente el tiempo total empleado en generar los archivos de código fuente.

/MP[processMax]

Arguments

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

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

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

Comentarios

La opción /MP del compilador puede reducir significativamente el tiempo de compilación al generar muchos archivos. Para mejorar el tiempo de compilación, el compilador crea hasta processMax copias de sí mismo y, a continuación, utiliza esas copias para generar simultáneamente los archivos de código fuente. La opción /MP se aplica a las compilaciones, pero no a la vinculación o a la compilación de código en tiempo de vinculación. De forma predeterminada, la opción /MP está desactivada.

La mejora en tiempo de compilación depende del número de procesadores de un equipo, el número de archivos que hay que generar y la disponibilidad de recursos del sistema, tales como la capacidad de E/S. Experimente con la opción /MP para determinar el mejor el valor para generar un proyecto determinado. Si necesita consejos que le ayuden a tomar esa decisión, vea Instrucciones.

Opciones incompatible y características de lenguaje

La opción /MP es incompatible con algunas opciones del compilador y características de lenguaje. Si utiliza una opción del compilador incompatible con la opción /MP, el compilador emite la advertencia D9030 y omite la opción /MP. Si utiliza una característica de lenguaje incompatible, el compilador emite el error C2813 y, a después, finaliza o continúa, dependiendo de la opción de nivel de advertencia actual del compilador.

Nota:

La mayoría de las opciones son incompatibles, ya que, si se permitieran, los compiladores que se ejecutan concurrentemente escribirían al mismo tiempo sus resultados en la consola o en un archivo determinado. Esa situación produciría una mezcla ininteligible de resultados. En algunos casos, la combinación de opciones empeoraría el rendimiento.

La tabla siguiente muestra una lista de las opciones del compilador y las características de lenguaje que son incompatibles con la opción /MP:

Opción o característica de lenguaje

Description

#import (directiva de preprocesador)

Convierte los tipos de una biblioteca de tipos en clases de C++ y, a continuación, escribe esas clases en un archivo de encabezado.

/E, /EP

Copia los resultados del preprocesador en la salida estándar (stdout).

/Gm

Habilita la compilación incremental para nuevas compilaciones.

/showIncludes

Escribe una lista de archivos de inclusión en la salida estándar de error (stderr).

/Yc

Escribe un archivo de encabezado precompilado.

Mensajes de diagnóstico

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

Mensaje de diagnóstico

Description

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 ha especificado un valor no válido para el argumento processMax.

El compilador omite el valor no válido y supone un valor de 1.

D9030

La opción especificada es incompatible con /MP.

El compilador omite la opción /MP.

Instrucciones

Medir el rendimiento

Utilice el tiempo de compilación total para medir el rendimiento. Puede medir el tiempo de compilación con un reloj físico o utilizar software que calcula la diferencia entre el inicio y el final de la compilación. Si su equipo tiene varios procesadores, un reloj físico podría producir resultados más precisos que la medición del tiempo mediante software.

Procesadores efectivos

Un equipo puede tener uno o más procesadores virtuales, también conocidos como procesadores efectivos, para cada uno de sus procesadores físicos. Cada procesador físico puede tener uno o más núcleos y, si el sistema operativo permite el hyperthreading para un núcleo, cada núcleo actúa como dos procesadores virtuales.

Por ejemplo, un equipo tiene un procesador efectivo si tiene un procesador físico con un solo núcleo y el hyperthreading está deshabilitado. En contraste, un equipo tiene ocho procesadores efectivos si tiene dos procesadores físicos, cada uno de los cuales tienen dos núcleos, y todos los núcleos tienen el hyperthreading habilitado. 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 omite el argumento processMax en la opción /MP, el compilador obtiene el número de procesadores efectivos desde el sistema operativo y, a continuación, crea un proceso por cada procesador efectivo. Sin embargo, el compilador no puede garantizar qué proceso se ejecuta en un procesador determinado: es el sistema operativo el que toma esa decisión.

Número de procesos

El compilador calcula el número de procesos que utilizará para compilar los archivos de código fuente. Ese valor es el menor de entre el número de archivos de código fuente que ha especificado 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 si proporciona el argumento processMax de la opción /MP. O bien, puede utilizar el valor predeterminado, que es igual al número de procesadores efectivos de un equipo, si omite el argumento processMax.

Por ejemplo, suponga 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 utiliza cinco procesos, ya que ése es el número menor entre cinco archivos de código fuente y un máximo de siete procesos. Por otro lado, suponga que su equipo tiene dos procesadores efectivos y usted especifica la línea de comandos siguiente:

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

En este caso, el sistema operativo indica dos procesadores; por consiguiente, el compilador utiliza dos procesos en sus cálculos. Como resultado, el compilador ejecutará la compilación con dos procesos, ya que ése es el número menor entre dos procesos y tres archivos de código fuente.

Archivos de código fuente y orden de compilación

Puede que los archivos de código fuente 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 decide cuándo se debe ejecutar cada proceso. Por consiguiente, no se puede garantizar que los archivos de código fuente se compilarán en un orden determinado.

Un archivo de código fuente se compila cuando hay un proceso disponible para compilarlo. Si hay más archivos que procesos, los procesos disponibles compilan el primer conjunto de archivos. Los archivos restantes se procesan cuando un proceso finaliza con un archivo anterior y queda disponible para trabajar con otro archivo.

No especifique el mismo archivo de código fuente varias veces en una línea de comandos. Esto podría ocurrir, por ejemplo, si una herramienta crea automáticamente un archivo make basado en información de dependencias en un proyecto. Si no especifica la opción /MP, el compilador procesa secuencialmente la lista de archivos y vuelve a compilar cada aparición del archivo. Sin embargo, si especifica la opción /MP, los diferentes compiladores podrían compilar al mismo tiempo el mismo archivo. Por consiguiente, los diferentes compiladores intentarán escribir al mismo tiempo en el mismo archivo de resultados. Un compilador obtendrá acceso de escritura exclusivo al archivo de resultados y podrá realizar su tarea, pero los otros compiladores obtendrán un error de acceso al archivo y no podrán utilizarlo.

Utilizar 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 evitar ese problema:

  • Mueva todas las directivas #import de los diversos archivos de código fuente a uno o más archivos y, a continuación, compile esos archivos sin la opción /MP. El resultado es un conjunto de archivos de encabezado generados.

  • En los archivos de código fuente restantes, inserte directivas #include que especifiquen los encabezados generados y, a continuación, compile los archivos de código fuente restantes mediante la opción /MP.

Opciones de configuración de proyectos de Visual Studio

La herramienta VCBUILD.exe

Visual Studio utiliza la herramienta VCBUILD.exe para generar soluciones y proyectos. La herramienta VCBUILD.exe puede generar proyectos al mismo tiempo, mientras que la opción /MP del compilador permite generar unidades de compilación al mismo tiempo. Si es adecuado para su aplicación, puede mejorar el tiempo de compilación de su solución utilizando /MP o VCBuild, o ambas opciones.

El tiempo de compilación de su solución depende en parte del número de procesos que realizan la compilación. La opción /M de la herramienta VCBUILD.exe especifica el número máximo de proyectos que se van a generar al mismo tiempo. De igual forma, el argumento processMax de la opción /MP especifica el número máximo de unidades de compilación que se van a generar al mismo tiempo. Si la opción /M especifica P proyectos y la opción /MP especifica C procesos, se ejecutarán un máximo de PxC procesos al mismo tiempo.

El criterio para decidir si se debe utilizar VCBuild o /MP es el siguiente:

  • Si hay muchos proyectos con pocos archivos en cada proyecto, utilice la herramienta VCBuild.

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

  • Si el número de proyectos y archivos por proyecto está equilibrado, utilice ambas opciones, VCBuild y /MP. Inicialmente, establezca la opción /M en el número de proyectos que se van a generar, y la opción /MP en el número de procesadores de su equipo. Mida el rendimiento y, a continuación, ajuste la configuración para producir los mejores resultados. Repita el ciclo hasta que esté satisfecho con el tiempo de compilación total.

La opción /Gm del compilador

De forma predeterminada, una compilación del proyecto habilita la opción /Gm del compilador (compilaciones incrementales) para las versiones de depuración, y lo deshabilita para las versiones de lanzamiento. Por consiguiente, la opción /MP del compilador está deshabilitada automáticamente en versiones de depuración porque entra en conflicto con la opción /Gm predeterminada del compilador.

Vea también

Referencia

The #import Directive

Otros recursos

Referencia de VCBUILD