Pregunta rápida: ¿cuál es el indicador del compilador para permitir que g ++ genere 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 de múltiples núcleos)?
174
make -j
casi siempre resulta en alguna mejora.Respuestas:
Puede hacer esto con make - con gnu make es la bandera -j (esto también ayudará en una máquina de un solo procesador).
Por ejemplo, si desea 4 trabajos paralelos de make:
También puede ejecutar gcc en una tubería con
Esto canalizará las etapas de compilación, lo que también ayudará a mantener ocupados los núcleos.
Si también tiene máquinas adicionales disponibles, puede consultar distcc , que también compilará compilaciones para ellos.
fuente
-j
argumentosNo existe ese indicador, y tener uno va en contra de la filosofía de Unix de hacer que cada herramienta realice solo una función y lo haga bien. Generar procesos del compilador es conceptualmente el trabajo del sistema de compilación. Lo que probablemente esté buscando es la bandera -j (empleos) a GNU make, a la
O puede usar pmake o sistemas similares de creación paralela.
fuente
La gente ha mencionado
make
perobjam
también apoya un concepto similar. El usobjam -jx
instruye a bjam para que se acumule enx
comandos simultáneos.Usamos los mismos scripts de compilación en Windows y Linux y esta opción reduce a la mitad nuestros tiempos de compilación en ambas plataformas. Agradable.
fuente
make
Hará esto por ti. Investigue-j
y-l
cambie en la página del manual. No creo queg++
sea paralelizable.fuente
-l
opción (no inicia un nuevo trabajo a menos que todos los trabajos anteriores hayan terminado). De lo contrario, parece que el trabajo del vinculador comienza con no todos los archivos de objetos creados (ya que algunas compilaciones aún están en curso), por lo que el trabajo del vinculador falla.Si usa make, emita con
-j
. Deman make
:Y lo más notable, si desea escribir o identificar la cantidad de núcleos que tiene disponibles (dependiendo de su entorno, y si se ejecuta en muchos entornos, esto puede cambiar mucho) puede usar la función ubicua de Python
cpu_count()
:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
Me gusta esto:
Si está preguntando por qué
1.5
citaré al usuario artless-noise en un comentario anterior:fuente
make -j`nproc`
connproc
GNU Coreutils.make -j $(( $(nproc) + 1 ))
(asegúrate de poner espacios donde los tengo).nproc
no está disponible, por ejemplo, enmanylinux1
contenedores, ahorra tiempo adicional al evitar ejecutaryum update
/yum install
.distcc también se puede usar para distribuir compilaciones no solo en la máquina actual, sino también en otras máquinas en una granja que tienen instalado distcc.
fuente
No estoy seguro acerca de g ++, pero si está usando GNU Make, entonces "make -j N" (donde N es el número de hilos que puede crear make) permitirá que make ejecute trabajos multple g ++ al mismo tiempo (tanto tiempo ya que los archivos no dependen el uno del otro).
fuente
-j N
le dice a cuántos procesos a la vez se deben generar, no hilos. Esa es la razón por la cual no es tan eficiente como MScl -MT
(realmente multiproceso).GNU paralelo
Estaba haciendo un punto de referencia de compilación sintética y no podía molestarme en escribir un Makefile, así que usé:
Explicación:
{.}
toma el argumento de entrada y elimina su extensión-t
imprime los comandos que se ejecutan para darnos una idea del progreso--will-cite
elimina la solicitud de citar el software si publica resultados utilizándolo ...parallel
es tan conveniente que incluso podría hacer una comprobación de marca de tiempo yo mismo:xargs -P
también puede ejecutar trabajos en paralelo, pero es un poco menos conveniente hacer la manipulación de la extensión o ejecutar múltiples comandos con él: llamar a múltiples comandos a través de xargsSe solicitó la vinculación paralela en: ¿Puede gcc usar múltiples núcleos al vincular?
TODO: Creo que leí en alguna parte que la compilación se puede reducir a la multiplicación de matrices, por lo que tal vez también sea posible acelerar la compilación de un solo archivo para archivos grandes. Pero no puedo encontrar una referencia ahora.
Probado en Ubuntu 18.10.
fuente