Pregunta

Pregunta rápida: ¿cuál es la marca 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 de origen a la vez para una CPU de múltiples núcleos)?

¿Fue útil?

Solución

Puedes hacer esto con make - con gnu make es la marca -j (esto también ayudará en una máquina con un solo procesador).

Por ejemplo, si quieres 4 trabajos paralelos de make:

make -j 4

También puedes ejecutar gcc en una tubería con

gcc -pipe

Esto canalizará las etapas de compilación, lo que también ayudará a mantener los núcleos ocupados.

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

Otros consejos

No existe tal indicador, y tener uno corre contra la filosofía de Unix de que cada herramienta realice una sola función y la realice bien. Generar procesos de compilación es conceptualmente el trabajo del sistema de compilación. Lo que probablemente está buscando es la marca -j (empleos) para GNU make, a la

make -j4

O puede usar pmake o sistemas de fabricación paralela similares.

La gente ha mencionado make pero bjam también admite un concepto similar. El uso de bjam -jx le da instrucciones a bjam para que genere hasta x comandos concurrentes.

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 compilación en ambas plataformas. Niza.

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

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 distcc instalada.

Si usa make, emita con -j . Desde man make :

  -j [jobs], --jobs[=jobs]
       Specifies the number of jobs (commands) to run simultaneously.  
       If there is more than one -j option, the last one is effective.
       If the -j option is given without an argument, make will not limit the
       number of jobs that can run simultaneously.

Y lo más notable, si desea crear una secuencia de comandos o identificar el número de núcleos que tiene disponibles (dependiendo de su entorno, y si se ejecuta en muchos entornos, esto puede cambiar mucho) puede utilizar la función ubicua de Python cpu_count () :

https://docs.python.org/3/library /multiprocessing.html#multiprocessing.cpu_count

Me gusta esto:

make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')

Si pregunta por qué 1.5 citaré al usuario artless-noise en un comentario anterior:

  

El número 1.5 se debe al problema de límite de E / S anotado. Es una regla de oro. Aproximadamente 1/3 de los trabajos estarán en espera de E / S, por lo que los trabajos restantes utilizarán los núcleos disponibles. Un número mayor que los núcleos es mejor e incluso podrías llegar hasta 2x.

No estoy seguro de g ++, pero si estás utilizando GNU Make, entonces " make -j N " (donde N es el número de subprocesos que pueden crearse los hilos) permitirá que se ejecuten varios trabajos g ++ al mismo tiempo (siempre que los archivos no dependan unos de otros).

GNU paralelo

Estaba haciendo un punto de referencia de compilación sintética y no pude No me molesté en escribir un Makefile, así que utilicé:

sudo apt-get install parallel
ls | grep -E '\.c

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 para citar el software si publicas resultados usándolo ...

paralelo es tan conveniente que incluso podría hacer una comprobación de marca de tiempo:

ls | grep -E '\.c

xargs -P también puede ejecutar trabajos en paralelo, pero es un poco menos conveniente realizar la manipulación de extensiones o ejecutar múltiples comandos con él: Llamar a múltiples comandos a través de xargs

El enlace paralelo se solicitó en: ¿Puede gcc usar múltiples núcleos al vincular?

TODO: Creo que leí en alguna parte que la compilación puede reducirse a la multiplicación de matrices, por lo que quizás también sea posible acelerar la compilación de un solo archivo para archivos grandes. Pero ahora no puedo encontrar una referencia.

Probado en Ubuntu 18.10.

| parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"

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 para citar el software si publicas resultados usándolo ...

paralelo es tan conveniente que incluso podría hacer una comprobación de marca de tiempo:

<*>

xargs -P también puede ejecutar trabajos en paralelo, pero es un poco menos conveniente realizar la manipulación de extensiones o ejecutar múltiples comandos con él: Llamar a múltiples comandos a través de xargs

El enlace paralelo se solicitó en: ¿Puede gcc usar múltiples núcleos al vincular?

TODO: Creo que leí en alguna parte que la compilación puede reducirse a la multiplicación de matrices, por lo que quizás también sea posible acelerar la compilación de un solo archivo para archivos grandes. Pero ahora no puedo encontrar una referencia.

Probado en Ubuntu 18.10.

| parallel -t --will-cite "\ if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then gcc -c -o '{.}.o' '{}' fi "

xargs -P también puede ejecutar trabajos en paralelo, pero es un poco menos conveniente realizar la manipulación de extensiones o ejecutar múltiples comandos con él: Llamar a múltiples comandos a través de xargs

El enlace paralelo se solicitó en: ¿Puede gcc usar múltiples núcleos al vincular?

TODO: Creo que leí en alguna parte que la compilación puede reducirse a la multiplicación de matrices, por lo que quizás también sea posible acelerar la compilación de un solo archivo para archivos grandes. Pero ahora no puedo encontrar una referencia.

Probado en Ubuntu 18.10.

| parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"

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 para citar el software si publicas resultados usándolo ...

paralelo es tan conveniente que incluso podría hacer una comprobación de marca de tiempo:

<*>

xargs -P también puede ejecutar trabajos en paralelo, pero es un poco menos conveniente realizar la manipulación de extensiones o ejecutar múltiples comandos con él: Llamar a múltiples comandos a través de xargs

El enlace paralelo se solicitó en: ¿Puede gcc usar múltiples núcleos al vincular?

TODO: Creo que leí en alguna parte que la compilación puede reducirse a la multiplicación de matrices, por lo que quizás también sea posible acelerar la compilación de un solo archivo para archivos grandes. Pero ahora no puedo encontrar una referencia.

Probado en Ubuntu 18.10.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top