2012-02-23 11 views
20

Tengo una CPU i7 de cuatro núcleos en mi escritorio de Windows. Estoy intentando hacer que mingw32-make compile usando tantos núcleos como sea posible. He agregado -j8 en los campos "Crear argumentos" en Configuraciones de compilación-> Pasos de compilación. mingw32-make parece ignorar por completo la opción ya que no obtengo ninguna mejora de velocidad de eso. Cuando veo el uso de CPU en el administrador de tareas, permanece en 13% y solo veo una instancia de g ++ en ejecución.Cómo compilar en múltiples núcleos usando mingw dentro de QTCreator

En este momento, reconstruir todo el proyecto utilizando mingw lleva 3 minutos completos. Reconstruirlo usando MSVC toma solo 15 segundos.

Para su información, he habilitado la opción de encabezado precompilado en la configuración del proyecto. Eso hace las cosas mucho más rápidas con VC también. Pero aún no veo el beneficio del encabezado precompilado con mingw.

Comparta sus comentarios si alguna vez tiene mingw para compilar varios archivos fuente en paralelo desde QTCreator. ¡Gracias!

Respuesta

22

Aquí es lo que hice.

En el menú Herramientas -> Opciones en Qt Creator, en la sección "Crear y ejecutar" hay una opción que dice "Usar jom en lugar de nmake". Revisé esa caja, pero nada cambió.Así que, en cambio, fui a la configuración de compilación del proyecto y en la categoría de pasos de compilación hay un ítem "Hacer". Expande los detalles sobre eso y encontrarás un elemento "Override mingw32-make.exe:". Pegué "C: \ QtSDK \ QtCreator \ bin \ jom.exe" allí, y de repente estaba construyendo con varios núcleos.

Funcionó para mí en Qt Creator 2.4.1. Darle una oportunidad.

+0

¡Usar JOM en lugar de mingw32-make funciona muy bien! Aunque todavía es mucho más lento que la compilación de VC, es mucho más rápido que antes. –

+0

Esto se debe a que el compilador de microsofts desea comer muchos archivos de C++ con una sola llamada. La tecnología tradicional de 1970 como make no es compatible con esto, llaman al compilador con un archivo por invocación que es malo para los encabezados precompilados como puede ver. Cambia a un mejor sistema de compilación. – Lothar

10

-j8 probablemente no funcione debido a una limitación en GNU Make on Win32.

Intenta poner solo -j en el campo argumentos del make. Eso le dice a Make que engendre tantos procesos de compilación como sea posible: si tiene suficiente RAM y CPU para manejar eso, debería ser más rápido que una sola compilación.

Lamentablemente, estos son los únicos dos opciones (sin modificar el Makefile): o bien -j1, o un número ilimitado de -j

los detalles: GNU Make en Win32 no soporta el servidor de trabajo, por lo que un padre puede hacer proceso' t seguir el número de procesos de compilación generados por cualquier sub-Marca. Para estar seguro, el sub-Make solo se ejecuta con -j1. Creo que los Makefiles generados de qmake/Qt Creator usan múltiples capas de Makefiles. La primera cuenta de este problema con el IDE MPLAB de Microchip X, echa un vistazo a this thread para obtener más información

Esta cita es de README.W32 distribuido con GNU Make

Soporte para compilaciones paralelas

compilaciones paralelas (-Jn) están soportados en este puerto, con 2 limitaciones:

  • El número de procesos concurrentes tiene un límite duro de 64, debido a la forma en que este puerto implementa la espera de sus subprocesos ;

  • El método de servidor de trabajo (disponible cuando se ejecuta en Make Posix plataformas) no es compatible, lo que significa que debe pasar un interruptor -Jn explícita a los sub-make de un Makefile en recursivo. Si una submatriz no recibe un conmutador -jN explícito, tendrá como valor predeterminado -j1, es decir, no habrá paralelismo en submatrimonios.

+1

El uso de -j funciona muy bien, aunque genera una gran cantidad de procesos de compilación en mi computadora. ¡Gracias por el aporte! –

+1

Esta es una gran medida de distancia intermedia a menos que esté construyendo un proyecto grande. Si compila para más de una docena de fuentes, seguramente tendrá problemas importantes con la CPU. Estás casi obligado a atacar problemas de memoria si estás compilando más de tres o cuatro docenas de fuentes. – inetknght

3

uso variable de entorno MAKE_COMMAND:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS% 
+1

No. Esto no funciona para mingw32-make. La opción -jN simplemente se ignora. –

+1

No sé qué decirle pero funciona para mí y para otros: http://stackoverflow.com/questions/1247162/gnu-make-jobs-option-in-qmake –

0

-j es el camino a seguir, por desgracia para mí el proyecto es tan grande que gasta toda la memoria disponible y mi computadora se congela, por lo que ser conscientes de que . Brendan dijo que no hay forma de usar solo la mitad de sus núcleos, por ejemplo, lo cual es una pena si es verdad.

4

Añadir -j9 (sustituir 9 al valor de NUMBER_OF_PROCESSORS (Windows)/$(nproc) (Linux) más uno - esto es óptima) a todos los

QString makefilein = " -f " + subtarget->makefile; 

líneas en QMake \ generadores \ makefile.cpp (Encontrar usted mismo).

Es el resultado como

QString makefilein = " -j9 -f " + subtarget->makefile; 

continuación, ejecute configure.exe con los parámetros adecuados (! Y -qmake -dont-process adicional para evitar la generación de gran cantidad de archivos make!).

El problema es que se obtienen dos conjuntos de procesos durante la compilación "depurar y liberar". Por lo tanto, el recuento total de procesos generados es mayor de 18 años.

0

En Qt Creator ir a Proyectos -> Construir & Ejecutar -> su MinGW específica construir configuración -> Construir el Medio Ambiente (esto es en la pantalla de abajo general/Construir pasos/escalones limpios ..) y luego agregue una variable MAKEFLAGS y configúrela en -j8. Probé esto en mi máquina central con -j4 y QtCreator 4.4.1 y con MinGW 5.3.0. Al compilar mi procesador funciona al 100% de rendimiento como se puede ver en el Administrador de tareas. Sin esta opción, era de alrededor del 25%, así que supongo que funciona exactamente como se esperaba. La construcción ahora es mucho más rápida.

Cuestiones relacionadas