2016-05-05 9 views
0

Ich habe eine test script, die von Stunden bis Tagen dauert. Das Testskript erstellt wiederholt eine Bibliothek und führt seine Selbsttests unter verschiedenen Konfigurationen aus.Override -j Einstellung für eine Quelldatei?

Auf Desktops und Servern erfreut sich das Skript einer Beschleunigung, da es -j N verwendet, wobei N die Anzahl der verfügbaren Cores ist. Es dauert ungefähr 2 Stunden, um das Testskript auszuführen.

Auf dev-Boards wie ein LeMaker Hikey (8-core ARM64/2GB RAM) und CubieTruck (8-core ARM/2GB RAM), kann ich nicht -j N (für noch N=2 oder N=4) verwenden, weil eine Datei ein echtes Monster ist und verursacht eine OOM töten. In diesem Fall kann es Tage dauern, bis das Skript ausgeführt wird.

Meine Frage ist, wie kann ich ein make Rezept erstellen, das GNUmake anweist, diese eine Quelldatei mit -j 1 zu behandeln? Ist es überhaupt möglich?

+1

Wenn Sie mehrere Module haben, sollten Sie die große Bibliothek mit nur einem Kern erstellen. – xdevs23

Antwort

1

Ich bin mir nicht sicher, ob es möglich ist. Es ist nicht klar, wie Make Jobs zwischen Kernen aufteilt.

4.9 Special Built-in Target Names erwähnt

.NOTPARALLEL

  • Wenn .NOTPARALLEL als Ziel genannt wird, dann wird dieser Aufruf von make seriell ausgeführt werden, auch wenn die -j Option gegeben ist. Beliebig rekursiv aufgerufene Make-Befehl wird weiterhin parallel Rezepten ausführen (es sei denn sein Makefile enthält auch dieses Ziel). Alle Voraussetzungen auf dieses Ziel werden ignoriert.

jedoch 5.7.3 Communicating Options to a Sub-make sagt:

Die -j Option ist ein Sonderfall (siehe Parallel Execution). Wenn Sie es bis zu einem gewissen numerischen Wert gesetzt N und Ihr Betriebssystem unterstützt es (fast jedes UNIX-System, andere normalerweise nicht), die Eltern machen und alle Unter Marken kommunizieren werden, um sicherzustellen, dass gibt es nur N Jobs zwischen allen gleichzeitig ausgeführt. Beachten Sie, dass jeder Job, der rekursiven markiert (siehe Statt Ausführen Rezepte) zählt nicht gegen die Gesamtaufträge (sonst könnten wir N Unter macht zum Laufen bringen und haben keine Schlitze für eine wirkliche Arbeit übrig!)

Wenn Ihr Betriebssystem die obige Kommunikation nicht unterstützt, wird -j 1 immer in MAKEFLAGS anstelle des angegebenen Werts angegeben. Dies ist der Fall, wenn die -j Option an Sub-Maker übergeben wurde, würden Sie viel mehr Jobs parallel ausgeführt als Sie gefragt. Wenn Sie -j mit keinem numerischen Argument angeben, dh so viele Jobs wie möglich parallel ausführen, wird dies weitergegeben, da mehrere Unendlichkeiten nicht mehr als eins sind.

Dies deutet darauf hin, dass es keine Möglichkeit gibt, einen bestimmten Auftrag einem einzelnen Kern zuzuordnen.Es lohnt sich, einen Schuss abzugeben.

+0

Danke. Ich habe versucht, eine '.NOTPARALLEL: regtest.cpp' hinzuzufügen, aber es führte zu einer Serialisierung des Builds. IBM hat [clearmake] (ftp://public.dhe.ibm.com/software/rational/docs/docset/doc/cpf_4.2/ccase_ux/ccbuild/ccbuild-81.html) mit einer besseren Dokumentation. Aber unter GNU's make, '.NOTPARALLEL: regtest.cpp libcryptopp.a libcryptop.dylib libcryptopp.so' hat den Build noch serialisiert. – jww

+0

@jww Versuchen Sie den ['--max-load'] (https://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options-Summary) Schalter. 'Gibt an, dass keine neuen Rezepte gestartet werden sollen, wenn andere Rezepte ausgeführt werden und der Lastmittelwert mindestens geladen ist (eine Fließkommazahl). Wenn kein Argument vorhanden ist, wird ein vorheriges Lade-Limit entfernt. Wieder ist es ziemlich vage, aber es scheint, als ob Sie in der Lage sein sollten, das Lade-Limit für dieses eine Rezept festzulegen. –

0

Machen Sie das große Ziel zuerst, dann alles andere danach parallel.

.PHONY: all 
all: 
    ⋮ 

.PHONY: all-limited-memory 
all-limited-memory: 
    ${MAKE} -j1 bigfile 
    ${MAKE} all 

So, jetzt

  • $ make -j16 all funktioniert wie erwartet.
  • $ make -j4 all-memory-limited erstellt bigfile seriell (Beenden, wenn Fehler), weitermachen, um den Rest parallel zu tun.
Verwandte Themen