hacer -j4 o -j8

Tengo 4 procesadores y estoy comstackndo una aplicación hambrienta de procesador. Leí que el uso de make con el conmutador -j4 se recomendó para OpenCV. ¿Debería usar -j8 y cuál es la ventaja de crear varios procesadores?

Como usted dice, la bandera -j le dice a make que está permitido generar la cantidad proporcionada de ‘hilos’. Idealmente, cada subproceso se ejecuta en su propio núcleo / CPU, por lo que su entorno de múltiples núcleos / CPU se utiliza al máximo.

make no comstack los archivos fuente. Esto es hecho por un comstackdor (gcc). El Makefile (entrada para make ) contiene un conjunto de objectives. Cada objective tiene un conjunto de dependencias (en otros objectives) y reglas sobre cómo construir el objective. make lee los Makefile (s) y administra todos los objectives, dependencias y reglas de comstackción. Además de comstackr archivos de origen, puede usar make para realizar cualquier tarea que pueda describirse mediante comandos de shell.

Si establece el número permitido de subprocesos demasiado alto, no es posible progtwigr cada subproceso en su propio núcleo. Se requieren conmutadores de progtwigción (contexto) adicionales para permitir que todos los subprocesos se ejecuten. Este uso de recursos adicionales, obviamente, resulta en un menor rendimiento.

Existen múltiples reglas de oro, pero creo que la configuración a una cantidad total de + 1 es la más común. La idea detrás de esto es que todos los núcleos tienen su propio subproceso y hay un subproceso de administración adicional que maneja los objectives y que está próximo a construirse.

Las respuestas anteriores son todas en su mayoría correctas. Sin embargo, los detalles son un poco confusos. Por ejemplo, no es necesario agregar un trabajo adicional para un “subproceso de administración” (nota: make no es en realidad multiproceso). make nunca se considera a sí mismo como un trabajo para los fines de -j , por lo que, como dice Huygens, si dices -j5 obtendrás 5 trabajos de comstackción en ejecución, no 4 más de make.

La razón por la que la mayoría de la gente usa [número de núcleos] + [algo de relleno] no tiene nada que ver con la make o lo que necesita, sino con la naturaleza del comstackdor. Un comstackdor es realmente una herramienta de traducción de texto muy complicada: se lee en un texto en una forma y lo convierte en “texto” (binario) en otra forma. Mucho de esto (especialmente a medida que su lenguaje se vuelve más complejo, como C ++), requiere una gran cantidad de CPU. Pero también requiere una gran cantidad de E / S de disco. La E / S del disco es lenta, por lo que mientras un comstackdor está esperando algunos datos del disco, el kernel progtwig otros trabajos para ejecutar. Es por eso que puede tener útilmente más de la cantidad de comstackciones de núcleos ejecutándose al mismo tiempo.

Exactamente qué tan grande puede ser -j antes de que comience a ver rendimientos decrecientes (sus comstackciones en realidad comienzan a ir más lentas, en algún momento, con más -j ) depende completamente de su hardware, los tipos de comstackciones que está haciendo, etc. La manera de saber con seguridad es la experimentación.

Sin embargo, [número de núcleos] + [algunos] suele ser una buena aproximación.

La opción -j solo se usa para acelerar la comstackción de la aplicación, determina cuántos trabajos pueden generarse para la comstackción. Puede establecer -j o incluso más alto -j para que la comstackción pueda ocurrir en paralelo.

No tiene impacto en el código comstackdo.

Para un sistema de 4 núcleos, podrías probar make -j6 . Si make puede ejecutar comstackciones paralelas, lanzará hasta 6 procesos de comstackción simultáneos (por ejemplo, 6 llamadas a gcc).

Una CPU por hilo más un gestor / cargador. Como un subproceso que realiza operaciones de disco está técnicamente casi inactivo desde el punto de vista de la CPU, agregue uno al número total de núcleos.

Si la CPU utiliza hyperthreading, puede contar cada núcleo como dos núcleos y duplicar la cantidad de subprocesos, por lo que un Intel Core i7 de cuatro núcleos debería obtener -j9 (ocho núcleos virtuales más el administrador). En un AMD de cuatro núcleos use -j5