2010-03-02 13 views
19

Desde las páginas de manual:¿Cómo funciona realmente la opción make "-j"?

-j [trabajos], --jobs [=] puestos de trabajo especifica el número de ofertas de trabajo (comandos) para ejecutar de forma simultánea. Si hay más de una opción -j, la última es efectiva. Si la opción -j es indicada sin un argumento, make no limitará el número de trabajos que se pueden ejecutar simultáneamente.

Sé que utiliza una dependencia de gráfico para saber qué reglas son independientes.

Me gustaría saber cómo se construye este gráfico y comprender cuáles son los criterios utilizados.

gracias.

Respuesta

21

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.

3

Sospecho que esperas algo más mágico de lo que realmente hay aquí. Los archivos Makefile contienen líneas como:

target: prereq1 prereq2 prereq3 ... 

Esto define una relación entre los archivos en el sistema; en el lenguaje de grafos, cada palabra separada por espacios en blanco en la línea implícitamente declara un nodo en el gráfico, y se crea un borde dirigido entre cada uno de los nodos a la izquierda del colon y cada uno de los nodos a la derecha de los dos puntos , apuntando desde este último al primero.

A partir de ahí, es simple atravesar el gráfico para encontrar nodos que no tengan bordes entrantes y ejecutar los comandos asociados con esos nodos, luego volver a trabajar 'hacia arriba' el gráfico desde allí.

Espero que ayude.

+0

¿Cómo se realiza el paralelismo? Supongo que no es 'openmpi' .... – kilojoules

Cuestiones relacionadas