Cuando (re) construyo grandes sistemas en una computadora de escritorio / portátil, le digo makeque use más de un hilo para acelerar la velocidad de compilación, así:
$ make -j$[ $K * $C ]
¿Dónde $Cse 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 $Kes algo que puede variar en cada 2a 4, dependiendo de mi estado de ánimo.
Entonces, por ejemplo, podría decir make -j12si tengo 4 núcleos, lo que indica que debo makeusar hasta 12 hilos.
Mi razonamiento es que si solo uso $Chilos, 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 $Mgigas de memoria (donde $Mestá 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*$coresen 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 + xes 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.+xEste 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
-jvalores para obtener el mejor número. Además, intente paralelizar otros pasos del proceso de construcción: desempaquetar, ejecutar,configureetc.fuente