Aquí hay una pequeña ilustración de mi pregunta:
Asuma un trabajo de compilación que consta de 4 tareas independientes llamadas AD. D lleva más tiempo que AC en suma.
Un sistema de compilación que no puede incorporar los tiempos de tarea relativos podría programar las tareas de esta manera:
---------------------------------------
CPU1: A | C |
---------------------------------------
CPU2: B | D |
---------------------------------------
Por el contrario, si el planificador es consciente de las diferencias de tiempo de la tarea, podría llegar a este cronograma mucho más corto:
---------------------------------------
CPU1: A | B | C |
---------------------------------------
CPU2: D |
---------------------------------------
Mis preguntas:
- ¿Hay algún sistema de compilación que incorpore tiempos de tarea relativos esperados en el cronograma?
- ¿Qué investigación académica sobre sistemas de construcción de este tipo existe?
- ¿De dónde toman estos sistemas de compilación (si existen) la información de tiempo? ¿Heurística, tiempos recopilados durante compilaciones anteriores?
- Si tales sistemas de compilación no existen, ¿por qué? ¿Hay algún problema que los haga menos valiosos de lo que parecen a primera vista?
scheduling
research
build-system
sjakobi
fuente
fuente
Respuestas:
Microsoft Visual Studio Team System (anteriormente TFS) considera tiempos de acción de compilación y compilaciones paralelas; toma los datos del historial de compilación anterior; y aunque no creo que pueda obtener el comportamiento que desea fuera de la caja, puede personalizarlo.
Un ejemplo de algunas tareas personalizadas para trabajar en la optimización del rendimiento.
https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/
fuente
Esto se basa en la suposición errónea de que "construir" una tarea no es paralela.
Muchos compiladores funcionan con subprocesos múltiples, por lo que una sola tarea A utilizará todas las CPU. Por lo tanto, el orden no importa. Para las tareas vinculadas de E / S, especialmente las relacionadas con redes, también comience mejor todas en paralelo desde el principio: la mayor parte del tiempo se pasará esperando una respuesta.
En otras palabras, el orden no importa ya que las tareas individuales suelen estar paralelas (como compilar, por ejemplo)
Editar:
En realidad, esta concepción de la "Tarea A en la CPU 1" también es errónea. Incluso para tareas de subproceso único, el sistema operativo que programa los procesos / subprocesos puede saltar de CPU a CPU en cada cambio de contexto. Supongo que la mayoría de los sistemas de compilación solo ejecutarán todas las tareas en paralelo y dejarán que el sistema operativo haga la programación. Las tareas más largas tomarán más tiempo y eso es todo.
Suponiendo que tiene una tarea de un solo subproceso de larga ejecución que no está vinculada a E / S , sería mucho más fácil para el sistema de compilación asignarle prioridad / importancia en lugar de intentar retrasar tareas más pequeñas para reducir los cambios de contexto del sistema operativo.
Incluso si tiene tareas tan extrañas , lo cual es bastante raro en la práctica, y tiene un sistema de construcción de programación sofisticado que funciona con heurística basada en ejecuciones anteriores (la única forma de saberlo), los beneficios que obtiene de esto pueden ser bastante pequeños. . Sin embargo, tienes un montón de complejidad adicional para mantener.
fuente
make -j
) puede lanzar varios procesos de compilación en paralelo.-j <nb-cores>
pero, lamentablemente, el valor predeterminado sigue siendo "1" ... Todavía me sorprende que nunca haya cambiado.