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 -jcasi 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
-jargumentosNo 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
makeperobjamtambién apoya un concepto similar. El usobjam -jxinstruye a bjam para que se acumule enxcomandos 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
makeHará esto por ti. Investigue-jy-lcambie en la página del manual. No creo queg++sea paralelizable.fuente
-lopció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.5citaré al usuario artless-noise en un comentario anterior:fuente
make -j`nproc`connprocGNU Coreutils.make -j $(( $(nproc) + 1 ))(asegúrate de poner espacios donde los tengo).nprocno está disponible, por ejemplo, enmanylinux1contenedores, 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 Nle 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-timprime los comandos que se ejecutan para darnos una idea del progreso--will-citeelimina la solicitud de citar el software si publica resultados utilizándolo ...paralleles tan conveniente que incluso podría hacer una comprobación de marca de tiempo yo mismo:xargs -Ptambié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