¿Cuántos hacen hilos para usar?

11

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.

máscara de bits
fuente
En muchos casos, la respuesta correcta para el número de hilos será el número de núcleos. Pero la única forma de saberlo con certeza es ejecutar algunas pruebas, variando el número de hilos hasta que encuentre el punto óptimo.
Robert Harvey
@RobertHarvey: Sí, probablemente iré y compilaré un script de shell con todo tipo de configuraciones durante la noche, pero pensé en preguntar si hay algún conocimiento sobre esto.
bitmask
44
muchas personas también sugieren $ cores + 1, por lo que 1 proceso del compilador lee del disco mientras 4 compila. Una sugerencia genérica es difícil, también depende de la base del código (uso excesivo de plantillas C ++ frente a pequeñas unidades de compilación con algunas funciones C), la cadena del compilador (encabezados precompilados, etc.) y la estructura de compilación (¿está vinculando solo una gran cosa en el final o varias cosas más pequeñas en el medio)
johannes
1
Si realmente está buscando rendimiento, le sugiero que busque configurar un disco RAM o algún otro método para aliviar su E / S. No creo que la utilización de la CPU sea tu punto caliente.
TMN
@ TMN: ¿Cómo ayuda un disco RAM? Linux es bastante bueno en el almacenamiento en caché cosas (que lo hace significar los archivos de cabecera, ¿verdad?), Por no hablar de la caché de la unidad. Tendría que cargar todo en el shm primero, ya sea manualmente o cambiando el script de compilación (lo que sería una exageración).
bitmask

Respuestas:

15

Ejecuté una serie de pruebas, construyendo llvm (en modo Debug + Asserts) en una máquina con dos núcleos y 8 GB de RAM:

compilando tiempo llvm dependiendo del número de trabajos

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.

máscara de bits
fuente
1
+1 para pruebas reales y no para especular.
Martin Wickman
3

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úrelo x=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.

ercpe
fuente
En este momento, estoy más preocupado con C ++ y supongo que mis discos no son los más rápidos.
bitmask
Luego comience con n * 1.5 y aumente hasta que el tiempo de compilación deje de disminuir (asegúrese de limpiar el caché del disco / compilar caché cada vez). Además, piense en usar ccache ( ccache.samba.org ) para acelerar la compilación.
ercpe