Frage

Ich habe dieses große C ++ Projekt, das ich auf einer Plattform aufbauen muß, die keine parallel machen haben (wie machen -j auf Linux). Der Server verfügt über 6 CPUs und ich möchte manuell einen parallel Build tun.

Ich kann für etwa 300 Objektdateien eine Aufgabenliste wie folgt generieren. Ich benutze das Makefile für die Abhängigkeitsprüfungen und inkrementellen:

-f Makefile machen obj1.o

-f Makefile machen obj2.o

make -f Makefile obj3.o ...

Wie würde ich diese Aufgaben parallel mit nicht mehr als 6 Aufgaben ausgeführt wird zu einer Zeit mit Ksh und Perl ausführen? (Java oder Python ist nicht verfügbar :-()

War es hilfreich?

Lösung

In Perl sollte die man sich Parallel :: ForkManager . Man könnte so etwas tun:

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();
}

Andere Tipps

Eine Alternative zu Forking ist jeder macht in einem eigenen Thread ausgeführt werden.

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" });
    }
}

Ich bin leider Hand winken um zwei Bits. Zuerst macht die Schleife warten ruhend, bis ein Thread beendet. Ich glaube, diese Themen wird unter Verwendung :: geteilt ist cond_wait () und ein Semaphore-Variable.

Die zweite ist immer der Rückgabewert von Marke, so dass Sie wissen, ob etwas ausgefallen und die Build-Einhalt zu gebieten. Dazu müssen Sie die () jeden Thread beitreten müßten das Ergebnis des Systems () zu erhalten, wird der Prozess Exit-Code.

Sorry für die hastige Antwort. Hoffentlich wird die Gemeinschaft in dem Rest füllen.

Ist Gnu macht auf HP-UX nicht den Parameter -J hat?

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

Mit GNU Parallel können Sie schreiben:

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

10 Sekunden Installation:

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

Weitere Informationen: http://www.gnu.org/software/parallel/parallel_tutorial .html https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Wenn das Betriebssystem richtig Inter-Prozessor-Kommunikation und Zeitplanung ist der Umgang, sollten Sie nur in der Lage sein, alle Marken in backgrounded Prozesse zu werfen, solange es keine Abhängigkeiten.

Wenn sie alle unabhängig sind, dann würde ich gibt eine Reihe von Befehlen wie folgt aus:

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

Mit Abhängigkeiten, string sie mit den Doppel-Et-Zeichen (&&), so dass das abhängige Element beginnt erst seine ‚Eltern‘ beendet hat.

Ich weiß, das ist nicht ganz Lösung, die Sie angefordert, aber es ist, wie ich das Problem angreifen würde:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top