El gráfico de dependencia se basa, como era de esperar, en los requisitos previos enumerados para cada objetivo de Makefile. make
construirá un gráfico donde los objetivos y requisitos previos son vértices y hay un borde dirigido desde los prereqs a sus objetivos. De esta forma, el número de bordes entrantes le indica cuántos prereqs tiene un objetivo. Si no tiene bordes entrantes, entonces no tiene requisitos previos.
Los vértices de los archivos .c
y .h
, por ejemplo, no tendrán bordes entrantes. Esos archivos son sus archivos fuente y no necesitan ser compilados.
A continuación, realiza un topological sort en el gráfico para determinar el orden de ejecución. De Wikipedia:
La aplicación canónica de clasificación topológica (orden topológico) está en la programación de una secuencia de trabajos o tareas; Los algoritmos de clasificación topológica se estudiaron por primera vez a principios de la década de 1960 en el contexto de la técnica PERT para la programación en la gestión de proyectos (Jarnagin 1960). Los trabajos están representados por vértices, y hay un borde de xa y si el trabajo x debe completarse antes de que se pueda iniciar el trabajo y (por ejemplo, al lavar la ropa, la lavadora debe terminar antes de secarla). Luego, un tipo topológico da un orden para realizar los trabajos.
La esencia de un tipo topológico es encontrar los vértices sin bordes entrantes (sin dependencias) y ponerlos primero. Luego quítelos del gráfico. Ahora tendrá un nuevo conjunto de vértices sin bordes entrantes (sin dependencias). Esos son los siguientes. Y así sucesivamente hasta que termine.(Si alguna vez llega a un punto en el que no hay tales vértices, el gráfico de dependencia contiene un ciclo, que es una condición de error.)
En un archivo Makefile típico, esto significa que primero compilará los archivos fuente (nada necesita hacerse) Luego, los archivos objeto que dependen de esos archivos fuente. Luego, las bibliotecas y los ejecutables creados a partir de esos archivos de objetos.
En operación normal no paralela make
simplemente seleccionará un único objetivo en cada iteración y lo compilará. Cuando es paralelo, obtendrá tantos objetivos sin dependencia como pueda y los construirá en paralelo, hasta la cantidad de trabajos simultáneos permitidos.
Así que cuando make
llega, por ejemplo, al paso del archivo objeto, tendrá una gran cantidad de vértices en el gráfico que no tienen bordes entrantes. Sabe que puede compilar los archivos de objeto en paralelo y, por lo tanto, abre las copias n de gcc
para compilar los archivos de objeto.
¿Cómo se realiza el paralelismo? Supongo que no es 'openmpi' .... – kilojoules