2009-01-05 17 views
139

Pregunta rápida: ¿cuál es la bandera del compilador para permitir que g ++ engendre múltiples instancias de sí mismo para compilar proyectos grandes más rápido (por ejemplo 4 archivos fuente a la vez para una CPU multi-core)?Compilando con g ++ usando múltiples núcleos

Muchas gracias.

+0

¿Realmente será útil? Todos mis trabajos de compilación están vinculados a E/S en lugar de a CPU. –

+4

Incluso si están vinculados con E/S, probablemente pueda mantener la carga de E/S más alta cuando estén ocurriendo los bits pesados ​​de la CPU (con solo una instancia de g ++ habrá períodos de inactividad) y posiblemente aumente las eficiencias de E/S si el planificador tiene más opciones sobre qué leer del disco a continuación. Mi experiencia ha sido que el uso juicioso de 'make -j' casi siempre produce alguna mejora. – Flexo

+1

@BrianKnoblauch Pero en mi máquina (real o en VirtualBox), está unida a la CPU, encontré que la CPU está ocupada mediante el comando 'superior' cuando compila. –

Respuesta

199

Puede hacer esto con make - con gnu make es el distintivo -j (esto también ayudará en una máquina de uniprocesador).

Por ejemplo, si desea 4 trabajos paralelos de la marca:

make -j 4 

También puede ejecutar gcc en un tubo con

gcc -pipe 

esta tubería se las etapas de compilación, lo que también ayudará a mantener los núcleos ocupados.

Si tiene máquinas adicionales disponibles, puede consultar distcc, que también compilará las compilaciones.

+30

Su número -j debe ser 1.5 veces el número de núcleos que tiene. –

+0

sí, algo así tiene sentido dado que también hay E/S - aunque puede necesitar un ajuste si se usa -pipe también – frankodwyer

+1

Gracias. Seguí intentando pasar "-j #" a gcc a través de CFLAGS/CPPFLAGS/CXXFLAGS. Había olvidado por completo que "-j #" era un parámetro para GNU make (y no para GCC). – chriv

7

make hará esto por usted. Investigue los conmutadores -j y -l en la página man. No creo que g++ sea paralelizable.

+0

que podría explicar la larga lista de errores de compilación ... –

2

No estoy seguro acerca de g ++, pero si está utilizando GNU Make, entonces "make -j N" (donde N es la cantidad de subprocesos que puede crear) le permitirá hacer trabajos múltiples g ++ al mismo tiempo (siempre que los archivos no dependan entre sí).

+2

no N ist no el número de subprocesos! Muchas personas lo malinterpretan, pero '-j N' dice que se deben generar muchos procesos a la vez, no hilos. Esa es la razón por la cual no es tan eficiente como MS 'cl -MT' (realmente multiproceso). – Sebi2020

36

No existe tal indicador, y tener uno va en contra de la filosofía de Unix de que cada herramienta realice una sola función y la desempeñe bien. Los procesos del compilador de desove son conceptualmente el trabajo del sistema de compilación. Lo que probablemente está buscando es la bandera -j (puestos de trabajo) a GNU make, a la

make -j4

o puede utilizar pmake o paralelo similares hacen que los sistemas.

+0

http://www.gnu.org/software/make/manual/html_node/Parallel.html también http://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options -Summary –

+2

_ "La pedantería de Unix no es útil" _ Lo bueno es que no fue pedantería entonces, editor anónimo. Retrotraído. Los revisores le prestan más atención a lo que está haciendo. –

11

Las personas han mencionado make pero bjam también es compatible con un concepto similar. El uso de bjam -jx indica a bjam que cree hasta x comandos simultáneos.

Usamos los mismos scripts de compilación en Windows y Linux y el uso de esta opción reduce a la mitad nuestros tiempos de construcción en ambas plataformas. Bonito.

5

distcc también se puede utilizar para distribuir compilaciones no solo en la máquina actual, sino también en otras máquinas en una granja de servidores que tienen instalado distcc.

+0

+1, distcc es una herramienta útil para tener en el arsenal de grandes construcciones. – Flexo

+0

Parece que hay algunos que funcionan "me gusta" también en distcc: http://stackoverflow.com/questions/5374106/distributed-make/13770116#13770116 – rogerdpack

Cuestiones relacionadas