Cuando (re) construyo grandes sistemas en una computadora de escritorio / portátil, le digo make
que use más de un hilo para acelerar la velocidad de compilación, así:
$ make -j$[ $K * $C ]
¿Dónde $C
se supone que indicar el número de núcleos (que podemos suponer que hay un número de un dígito) la máquina tiene, mientras que $K
es algo que puede variar en cada 2
a 4
, dependiendo de mi estado de ánimo.
Entonces, por ejemplo, podría decir make -j12
si tengo 4 núcleos, lo que indica que debo make
usar hasta 12 hilos.
Mi razonamiento es que si solo uso $C
hilos, los núcleos estarán inactivos mientras los procesos están ocupados recuperando datos de las unidades. Pero si no limito el número de subprocesos (es decir make -j
), corro el riesgo de perder el tiempo cambiando de contexto, quedando sin memoria o algo peor . Supongamos que la máquina tiene $M
gigas de memoria (donde $M
está en el orden de 10).
Así que me preguntaba si existe una estrategia establecida para elegir el número más eficiente de hilos para ejecutar.
fuente
Respuestas:
Ejecuté una serie de pruebas, construyendo llvm (en modo Debug + Asserts) en una máquina con dos núcleos y 8 GB de RAM:
Por extraño que parezca, parece subir hasta 10 y luego cae repentinamente por debajo del tiempo que lleva construir con dos trabajos (uno ocupa el doble de tiempo, no incluido en el gráfico).
El mínimo parece ser
7*$cores
en este caso.fuente
Estoy ejecutando Gentoo Linux (distribución basada en fuente) y, por mi experiencia, puedo decir que (con hardware más o menos reciente)
n*2 + x
es el mejor valor. Déjame explicarte esto:n*2
: CPU aún más lentas tienen suficiente potencia para ejecutar 2 tareas a la vez. La mayoría de las tareas de compilación se completan muy rápido.+x
Este número depende de su sistema (principalmente memoria y disco). Si tiene suficiente RAM y un disco rápido, configúrelox=n
. Sin embargo, esto depende del código fuente (Open Office, ¡te estoy mirando!) Y del lenguaje utilizado (compilar C / C ++ requiere mucha memoria).Sin embargo, debe ejecutar algunas pruebas con algunos
-j
valores para obtener el mejor número. Además, intente paralelizar otros pasos del proceso de construcción: desempaquetar, ejecutar,configure
etc.fuente