Kdokoli se zeptáte, jak správně sestavit software, přijde jako jedna z odpovědí na Make. V systémech GNU / Linux je GNU Make [1] verzí Open-source původní verze Make, která byla vydána před více než 40 lety - v roce 1976. Make works with a Makefile - a structured plain text file with that name that can be best mentioned as the construction manual for the software building process. Makefile obsahuje řadu štítků (nazývaných cíle) a specifické pokyny, které je třeba provést k sestavení každého cíle.
Jednoduše řečeno, Make je nástroj pro sestavení. Následuje recept na úkoly z Makefile. Umožňuje vám opakovat kroky automatizovaným způsobem, místo aby jste je psali do terminálu (a pravděpodobně při psaní děláte chyby).
Výpis 1 ukazuje příklad Makefile se dvěma cíli „e1“ a „e2“ a také se dvěma speciálními cíli „all“ a „clean“.„Spuštěním příkazu„ make e1 “se provedou pokyny pro cíl„ e1 “a vytvoří se prázdný soubor. Spuštění příkazu „make e2“ provede totéž pro cíl „e2“ a vytvoří prázdný soubor dva. Volání „make all“ provede pokyny pro cíl e1 jako první a e2 pro další. Chcete-li odstranit dříve vytvořené soubory jedna a dvě, jednoduše proveďte volání „make clean.“
Výpis 1
vše: e1 e2e1:
dotkněte se jednoho
e2:
dotkni se dvou
čistý:
rm jedna dvě
Běžící značka
Běžným případem je, že napíšete svůj Makefile a poté stačí spustit příkaz „make“ nebo „make all“ pro sestavení softwaru a jeho komponent. Všechny cíle jsou postaveny v sériovém pořadí a bez jakékoli paralelizace. Celková doba sestavení je součet času potřebného k sestavení každého jednotlivého cíle.
Tento přístup funguje dobře pro malé projekty, ale pro střední a větší projekty trvá poměrně dlouho. Tento přístup již není aktuální, protože většina současných cpus je vybavena více než jedním jádrem a umožňuje provádění více než jednoho procesu najednou. S ohledem na tyto myšlenky se podíváme na to, zda a jak lze proces sestavení paralelizovat. Cílem je jednoduše zkrátit dobu sestavení.
Proveďte vylepšení
Existuje několik možností, které máme - 1) zjednodušit kód, 2) distribuovat jednotlivé úkoly na různé výpočetní uzly, vytvořit kód tam a shromáždit výsledek odtud, 3) vytvořit kód paralelně na jednom počítači a 4) kombinujte možnosti 2 a 3.
Možnost 1) není vždy snadná. Vyžaduje to vůli analyzovat běh implementovaného algoritmu a znalosti o kompilátoru, tj.E., jak překladač překládá instrukce v programovacím jazyce do instrukcí procesoru.
Možnost 2) vyžaduje přístup k dalším výpočetním uzlům, například vyhrazeným výpočetním uzlům, nepoužívaným nebo méně používaným strojům, virtuálním strojům z cloudových služeb, jako je AWS, nebo pronajatému výpočetnímu výkonu od služeb, jako je LoadTeam [5]. Ve skutečnosti se tento přístup používá k vytváření softwarových balíčků. Debian GNU / Linux používá takzvanou síť Autobuilder [17] a RedHat / Fedors používá Koji [18]. Google nazývá svůj systém BuildRabbit a je dokonale vysvětlen v přednášce Aysylu Greenberg [16]. distcc [2] je takzvaný distribuovaný kompilátor C, který umožňuje paralelní kompilaci kódu na různých uzlech a nastavení vlastního sestavovacího systému.
Možnost 3 používá paralelizaci na místní úrovni. Může to být volba s nejlepším poměrem nákladů a přínosů, protože nevyžaduje další hardware jako v možnosti 2. Požadavek na paralelní spuštění Make je přidání volby -j do hovoru (zkratka pro -jobs). Určuje počet úloh, které jsou spuštěny současně. Níže uvedený seznam požaduje, aby bylo možné spustit paralelně 4 úlohy:
Výpis 2
$ make --jobs = 4Podle Amdahlova zákona [23] to zkrátí dobu výstavby o téměř 50%. Mějte na paměti, že tento přístup funguje dobře, pokud jednotlivé cíle na sobě nezávisí; například výstup cíle 5 není vyžadován k vytvoření cíle 3.
Existuje však jeden vedlejší efekt: výstup stavových zpráv pro každý Make target se zdá být libovolný a tyto již nelze jasně přiřadit k cíli. Pořadí výstupu závisí na skutečném pořadí provádění úlohy.
Definujte Provést příkaz k provedení
Existují tvrzení, která pomáhají pochopit, které cíle na sobě závisí? Ano! Příklad Makefile ve výpisu 3 říká toto:
* Chcete-li vytvořit cíl „vše“, postupujte podle pokynů pro e1, e2 a e3
* Terč e2 vyžaduje, aby byl terč e3 postaven dříve
To znamená, že cíle e1 a e3 lze stavět paralelně, nejdříve, poté následuje e2, jakmile je stavba e3 dokončena, nakonec.
Výpis 3
vše: e1 e2 e3e1:
dotkněte se jednoho
e2: e3
dotkni se dvou
e3:
dotkněte se tří
čistý:
rm jedna dva tři
Vizualizujte Make Dependencies
Chytrý nástroj make2graph z projektu makefile2graph [19] vizualizuje vytváření závislostí jako směrovaný acyklický graf. To pomáhá pochopit, jak různé cíle na sobě závisí. Make2graph vydává popisy grafů ve formátu bodů, které můžete převést na obrázek PNG pomocí příkazu tečka z projektu Graphviz [22]. Hovor je následující:
Výpis 4
$ make all -Bnd | make2graph | dot -Tpng -o graf.pngNejprve je vyvolán Make s cílem „all“, následovaný možnostmi „-B“, které bezpodmínečně vytvoří všechny cíle, „-n“ (zkratka pro „-dry-run“), aby předstíral spuštění pokynů pro každý cíl, a „ -d ”(“ -debug ”) pro zobrazení informací o ladění. Výstup je směrován na make2graph, který spojuje svůj výstup s tečkou, která generuje grafický soubor obrázku.png ve formátu PNG.
Graf závislosti sestavení pro výpis 3
Více překladačů a sestavovacích systémů
Jak již bylo vysvětleno výše, Make byl vyvinut před více než čtyřmi desetiletími. V průběhu let se paralelní provádění úloh stalo stále důležitějším a od té doby vzrostl počet speciálně navržených překladačů a sestavovacích systémů pro dosažení vyšší úrovně paralelizace. Seznam nástrojů zahrnuje tyto:
- Bazel [20]
- CMake [4]: zkracuje označení cross-platform Make a vytváří soubory s popisy, které později použije Make
- distmake [12]
- Distributed Make System (DMS) [10] (zdá se být mrtvý)
- dmake [13]
- Značka LSF [15]
- Apache Maven
- Meson
- Ninja Build
- NMake [6]: Značka pro Microsoft Visual Studio
- PyDoit [8]
- Qmake [11]
- znovu [14]
- SCons [7]
- Waf [9]
Většina z nich byla navržena s ohledem na paralelizaci a nabízí lepší výsledek ohledně doby sestavení než Make.
Závěr
Jak jste viděli, stojí za to přemýšlet o paralelních sestaveních, protože významně snižuje čas sestavení až na určitou úroveň. Přesto to není snadné dosáhnout a přichází s určitými nástrahami [3]. Před vstupem do paralelních sestav se doporučuje analyzovat váš kód i cestu jeho sestavení.
Odkazy a reference
- [1] GNU Make Manual: Parallel Execution, https: // www.gnu.org / software / make / manual / html_node / paralelní.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: Úskalí a výhody GNU Make Parallelization, https: // www.cm křižovatka.com / article / úskalí-a-výhody-gnu-make-paralelizace
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.loadteam.com /
- [6] NMake, https: // dokumenty.Microsoft.com / en-us / cpp / build / reference / nmake-reference?view = msvc-160
- [7] SCons, https: // www.scons.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Distributed Make System (DMS), http: // www.nongnu.org / dms / index.html
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-manual.html
- [12] distmake, https: // sourceforge.net / projects / distmake /
- [13] dmake, https: // dokumenty.věštec.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] předělat, https: // předělat.readthedocs.io / en / nejnovější /
- [15] LSF Make, http: // sunray2.mit.edu / soupravy / platforma-lsf / 7.0.6/1 / průvodci / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Budování distribuovaného systému sestavení v měřítku Google, konference GoTo 2016, https: // gotocon.com / dl / goto-chicago-2016 / slides / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debian Build System, síť Autobuilder, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - systém vytváření a sledování otáček, https: // stránkování.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazel, https: // bazel.stavět/
- [21] Výukový program Makefile, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.graphviz.org
- [23] Amdahlův zákon, Wikipedia, https: // en.wikipedia.org / wiki / Amdahl% 27s_law