Pregunta

Tengo este gran proyecto de C ++ que necesito construir en una plataforma que no tenga una marca paralela (como make -j en Linux). El servidor tiene 6 CPU y quiero hacer una compilación paralela manualmente.

Puedo generar una lista de tareas como esta para aproximadamente 300 archivos de objetos. Yo uso Makefile para las verificaciones de dependencia y la compilación incremental:

make -f Makefile obj1.o

make -f Makefile obj2.o

make -f Makefile obj3.o ...

¿Cómo ejecutaría estas tareas en paralelo con no más de 6 tareas ejecutadas a la vez con Ksh y Perl? (Java o Python no están disponibles :-()

¿Fue útil?

Solución

En Perl, debe ver Parallel :: ForkManager . Podrías hacer algo como esto:

my @make_obj = qw(
  obj1.o
  obj2.o
  obj3.o
  ...
);

my $fm = $pm = new Parallel::ForkManager(6);
foreach my $obj (@make_obj) {
  $fm->start and next;
  system("make -f Makefile $make_obj");
  $fm->finish();
}

Otros consejos

Una alternativa a forking es ejecutar cada marca en su propio hilo.

use threads;

my $max_threads = 5;

my @targets = qw(obj1.o obj2.o obj3.o ...);
while(@targets) {
    my $num_threads = threads->list(threads::running);
    if( $num_threads < $max_threads ) {
        my $target = shift @targets;
        threads->create(sub { return system "make $target" });
    }
}

Lamentablemente estoy agitando la mano alrededor de dos bits. Lo primero es hacer que el bucle espere hasta que termine un hilo. Creo que esto se logra mediante el uso de threads :: shared's cond_wait () y una variable de semáforo.

El segundo es obtener el valor de retorno de make, para que sepa si algo falló y para detener la compilación. Para hacerlo, tendría que unir () cada subproceso para obtener el resultado de system (), el código de salida del proceso.

Lo siento por la respuesta apresurada. Esperemos que la comunidad llene el resto.

¿Gnu make en HPUX no tiene la marca -j?

http://hpux.connect.org.uk/ hppd / hpux / Gnu / make-3.81 /

Usando GNU Parallel puedes escribir:

parallel -j6 make -f Makefile obj{}.o ::: {1..500}

Instalación de 10 segundos:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Obtenga más información: http://www.gnu.org/software/parallel/parallel_tutorial .html https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Si el sistema operativo está gestionando adecuadamente la comunicación y la programación entre procesadores, debería poder convertir todas las marcas en procesos en segundo plano, siempre que no haya interdependencias.

Si todos son independientes, emitiría una serie de comandos como este:

make -f Makefile obj1.o &
make -f Makefile obj2.o &
...
make -f Makefile objn.o &

Con las dependencias, colóquelas con el símbolo doble ( & amp; & amp; ) para que el elemento dependiente no se inicie hasta que su "padre" haya terminado.

Me doy cuenta de que esa no es la solución que solicitaste, pero es la forma en que atacaría el problema :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top