Ktokoľvek sa spýta, ako správne zostaviť softvér, ako jednu z odpovedí navrhne Make. V systémoch GNU / Linux je GNU Make [1] verziou pôvodného Make, ktorá vyšla pred viac ako 40 rokmi - v roku 1976, s otvoreným zdrojovým kódom. Make works with a Makefile - a štruktúrovaný textový súbor s týmto názvom, ktorý možno najlepšie opísať ako stavebný manuál procesu vytvárania softvéru. Makefile obsahuje množstvo štítkov (nazývaných ciele) a špecifické pokyny potrebné na vykonanie každého cieľa.
Jednoducho povedané, Make je nástroj na zostavenie. Riadi sa receptom úloh z Makefile. Umožňuje vám to opakovať kroky automatizovaným spôsobom a nemusíte ich zadávať do terminálu (a pravdepodobne pri zadávaní robiť chyby).
Zoznam 1 zobrazuje príklad súboru Makefile s dvoma cieľmi „e1“ a „e2“, ako aj s dvoma špeciálnymi cieľmi „all“ a „clean“.”Spustenie programu„ make e1 “vykoná pokyny pre cieľ„ e1 “a vytvorí prázdny súbor. Spustenie príkazu „make e2“ urobí to isté pre cieľ „e2“ a vytvorí prázdny súbor dva. Volanie príkazu „make all“ vykoná pokyny pre cieľ e1 prvý a e2 nasledujúci. Ak chcete odstrániť predtým vytvorené súbory jedna a dva, jednoducho vykonajte hovor „make clean.“
Zoznam 1
všetky: e1 e2e1:
dotkni sa jedného
e2:
dotkni sa dvoch
čistý:
rm jedna dva
Beh Značka
Bežným prípadom je, že napíšete svoj Makefile a potom stačí spustiť príkaz „make“ alebo „make all“ na vytvorenie softvéru a jeho komponentov. Všetky terče sú postavené v sériovom poradí a bez akejkoľvek paralelizácie. Celkový čas na zostavenie je súčet času, ktorý je potrebný na zostavenie každého jedného cieľa.
Tento prístup funguje dobre pre malé projekty, ale pre stredné a väčšie projekty trvá dosť dlho. Tento prístup už nie je aktuálny, pretože väčšina súčasných procesorov cpus je vybavená viac ako jedným jadrom a umožňuje vykonávanie viacerých procesov súčasne. S ohľadom na tieto nápady sa pozrieme na to, či a ako je možné proces zostavenia paralelizovať. Cieľom je jednoducho skrátiť čas potrebný na zostavenie.
Robte vylepšenia
Existuje niekoľko možností, ktoré máme - 1) zjednodušiť kód, 2) distribuovať jednotlivé úlohy na rôzne výpočtové uzly, vytvoriť kód tam a zhromaždiť z neho výsledok, 3) vytvoriť kód paralelne na jednom počítači a 4) skombinujte možnosti 2 a 3.
Možnosť 1) nie je vždy jednoduchá. Vyžaduje si vôľu analyzovať runtime implementovaného algoritmu a vedomosti o kompilátore, t.j.e., ako prekladač prekladá pokyny v programovacom jazyku do pokynov procesora.
Možnosť 2) vyžaduje prístup k ďalším výpočtovým uzlom, napríklad k špecializovaným výpočtovým uzlom, nepoužívaným alebo menej používaným počítačom, virtuálnym počítačom od cloudových služieb, ako je AWS, alebo k prenajatému výpočtovému výkonu od služieb, ako je LoadTeam [5]. V skutočnosti sa tento prístup používa na vytváranie softvérových balíkov. Debian GNU / Linux používa takzvanú sieť Autobuilder [17] a RedHat / Fedors používa Koji [18]. Google nazýva svoj systém BuildRabbit a je dokonale vysvetlený v prednáške Aysylu Greenberg [16]. distcc [2] je takzvaný distribuovaný kompilátor C, ktorý umožňuje paralelné kompilovanie kódu na rôznych uzloch a nastavenie vlastného systému zostavovania.
Možnosť 3 využíva paralelizáciu na miestnej úrovni. Toto môže byť možnosť s najlepším pomerom nákladov a prínosov pre vás, pretože nevyžaduje ďalší hardvér ako v možnosti 2. Požiadavka paralelného spustenia Makeu je pridanie možnosti -j do hovoru (skratka pre -jobs). Toto určuje počet úloh, ktoré sú spustené súčasne. Nasledujúci zoznam žiada, aby bolo možné spustiť súčasne 4 úlohy:
Zoznam 2
$ make --jobs = 4Podľa Amdahlovho zákona [23] sa tak zníži doba výstavby o takmer 50%. Majte na pamäti, že tento prístup funguje dobre, ak jednotlivé ciele navzájom nezávisia; napríklad výstup cieľa 5 nie je potrebný na zostavenie cieľa 3.
Existuje však jeden vedľajší efekt: výstup stavových správ pre každý cieľ Make sa javí ako ľubovoľný a tieto už nie je možné jasne priradiť k cieľu. Poradie výstupu závisí od skutočného poradia vykonania úlohy.
Definujte Vykonať príkaz
Existujú výroky, ktoré pomáhajú spoločnosti Make pochopiť, ktoré ciele na sebe navzájom závisia? Áno! Príklad súboru Makefile v zozname 3 hovorí toto:
* Ak chcete vytvoriť cieľ „všetky“, postupujte podľa pokynov pre e1, e2 a e3
* Terč e2 vyžaduje, aby bol terč e3 postavený skôr
To znamená, že ciele e1 a e3 je možné stavať paralelne, najskôr, potom nasleduje e2, akonáhle je stavba e3 dokončená, nakoniec.
Zoznam 3
všetky: e1 e2 e3e1:
dotkni sa jedného
e2: e3
dotkni sa dvoch
e3:
dotkni sa troch
čistý:
rm jedna dva tri
Vizualizujte Make Dependencies
Šikovný nástroj make2graph z projektu makefile2graph [19] vizualizuje Make dependencies ako nasmerovaný acyklický graf. To pomáha pochopiť, ako na sebe rôzne ciele závisia. Make2graph vydáva popisy grafov v bodovom formáte, ktorý môžete transformovať do obrázka PNG pomocou príkazu dot z projektu Graphviz [22]. Výzva je nasledovná:
Výpis 4
$ make all -Bnd | make2graph | bodka -Tpng -o graf.pngNajskôr sa Make zavolá s cieľom „všetci“, po ktorom nasledujú možnosti „-B“ na bezpodmienečné zostavenie všetkých cieľov, „-n“ (skratka pre „-dry-run“) predstierať spustenie pokynov podľa cieľov a -d “(„ -debug “) na zobrazenie ladiacich informácií. Výstup je privádzaný potrubím k make2graph, ktorý spojuje jeho výstup s bodkou, ktorá generuje graf obrázkového súboru.png vo formáte PNG.
Graf závislosti zostavenia pre zoznam 3
Viac prekladačov a zostavovacích systémov
Ako už bolo vysvetlené vyššie, značka Make bola vyvinutá pred viac ako štyrmi desaťročiami. V priebehu rokov sa paralelné vykonávanie úloh stalo čoraz dôležitejším a odvtedy vzrástol počet špeciálne navrhnutých kompilátorov a zostrojených systémov na dosiahnutie vyššej úrovne paralelizácie. Zoznam nástrojov obsahuje tieto:
- Bazel [20]
- CMake [4]: skracuje platformu Make a vytvára súbory s popismi, ktoré neskôr použije Make
- distmake [12]
- Distributed Make System (DMS) [10] (zdá sa byť mŕtvy)
- dmake [13]
- Značka LSF [15]
- Apache Maven
- Meson
- Ninja Build
- NMake [6]: Vytvorené pre Microsoft Visual Studio
- PyDoit [8]
- Qmake [11]
- znova [14]
- SCons [7]
- Waf [9]
Väčšina z nich bola navrhnutá s ohľadom na paralelizáciu a ponúka lepší výsledok, čo sa týka času zostavenia, ako Make.
Záver
Ako ste videli, stojí za to premýšľať o paralelných zostaveniach, pretože to výrazne skracuje čas potrebný na zostavenie na určitú úroveň. Napriek tomu to nie je ľahké dosiahnuť a prichádza s určitými nástrahami [3]. Pred vstupom do paralelných zostáv sa odporúča analyzovať váš kód aj cestu jeho zostavenia.
Odkazy a referencie
- [1] GNU Make Manual: Parallel Execution, https: // www.gnu.org / software / make / manual / html_node / paralelne.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: Úskalia a výhody GNU robia paralelizáciu, https: // www.cm križovatka.com / article / úskalia-a-výhody-gnu-make-paralelizácia
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.zaťažovací tím.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] Distribuovaný systém značenia (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.veštec.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] prerobiť, https: // prerobiť.readthedocs.io / sk / najnovšie /
- [15] LSF Make, http: // sunray2.mit.edu / súpravy / platforma-lsf / 7.0.6/1 / sprievodcovia / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Budovanie distribuovaného systému zostavovania v službe Google Scale, konferencia GoTo 2016, https: // gotocon.com / dl / goto-chicago-2016 / slides / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debian Build System, sieť Autobuilder, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - systém na sledovanie a sledovanie otáčok, https: // stránka.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazel, https: // bazel.stavať /
- [21] Výukový program Makefile, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.graphviz.org
- [23] Amdahlov zákon, Wikipedia, https: // en.wikipedia.org / wiki / Amdahl% 27s_law