Koga god pitate kako pravilno izraditi softver, jedan će od odgovora smisliti Make. Na GNU / Linux sustavima, GNU Make [1] je verzija izvornog softvera s otvorenim kodom koja je objavljena prije više od 40 godina - 1976. godine. Make works s Makefile - strukturiranom običnom tekstualnom datotekom s tim imenom koja se najbolje može opisati kao priručnik za izradu procesa izrade softvera. Makefile sadrži brojne oznake (koje se nazivaju ciljevi) i specifične upute potrebne za izgradnju svakog cilja.
Jednostavno rečeno, Make je alat za izgradnju. Slijedi recept zadataka iz Makefilea. Omogućuje vam automatsko ponavljanje koraka, umjesto da ih upisujete u terminal (i vjerojatno griješite dok tipkate).
Popis 1 prikazuje primjer Makefile s dva cilja "e1" i "e2", kao i dva posebna cilja "sve" i "čisto."Izvođenjem" make e1 "izvršavaju se upute za cilj" e1 "i stvara se prazna datoteka. Pokretanje "make e2" čini isto za cilj "e2" i stvara praznu datoteku dva. Poziv "učini sve" prvo izvršava upute za cilj e1 i e2 sljedeći. Da biste uklonili prethodno stvorene datoteke jedna i dvije, jednostavno pokrenite poziv „počisti."
Popis 1
sve: e1 e2e1:
dodirnite jedan
e2:
dodirnite dva
čist:
rm jedan dva
Trčanje Make
Uobičajeni slučaj je da napišete svoj Makefile, a zatim samo pokrenete naredbu "make" ili "make all" za izgradnju softvera i njegovih komponenti. Svi su ciljevi građeni serijskim redoslijedom i bez ikakve paralelizacije. Ukupno vrijeme izrade je zbroj vremena potrebnog za izgradnju svakog pojedinog cilja.
Ovaj pristup dobro funkcionira za male projekte, ali traje prilično dugo za srednje i veće projekte. Ovaj pristup više nije ažuran, jer je većina trenutnog procesora opremljena s više jezgri i omogućuje istodobno izvršavanje više procesa. Imajući ove ideje na umu, gledamo može li se i kako proces izrade paralelno usporediti. Cilj je jednostavno smanjiti vrijeme izrade.
Napravite poboljšanja
Postoji nekoliko mogućnosti koje imamo - 1) pojednostaviti kôd, 2) distribuirati pojedinačne zadatke na različite računalne čvorove, tamo graditi kod i odatle prikupljati rezultat, 3) paralelno graditi kôd na jednom stroju i 4) kombinirati opcije 2 i 3.
Opcija 1) nije uvijek lagana. Potrebna je volja za analizom vremena provedbe implementiranog algoritma i znanja o kompajleru, tj.e., kako prevoditelj prevodi upute na programskom jeziku u upute procesora.
Opcija 2) zahtijeva pristup drugim računalnim čvorovima, na primjer, namjenskim računalnim čvorovima, nekorištenim ili manje korištenim strojevima, virtualnim strojevima iz usluga u oblaku poput AWS-a ili unajmljenoj računarskoj snazi od usluga poput LoadTeam-a [5]. U stvarnosti se ovaj pristup koristi za izradu softverskih paketa. Debian GNU / Linux koristi takozvanu mrežu Autobuilder [17], a RedHat / Fedors Koji [18]. Google svoj sustav naziva BuildRabbit i to je savršeno objasnio u govoru Aysylu Greenberg [16]. distcc [2] je takozvani distribuirani C kompajler koji vam omogućuje paralelno kompajliranje koda na različitim čvorovima i postavljanje vlastitog sustava gradnje.
Opcija 3 koristi paralelizaciju na lokalnoj razini. Ovo može biti opcija s najboljim omjerom troškova i koristi za vas, jer ne zahtijeva dodatni hardver kao u opciji 2. Zahtjev za paralelnim pokretanjem Make-a dodaje se opcija -j u pozivu (skraćeno od -jobs). Ovo određuje broj poslova koji se istodobno izvode. Popis u nastavku traži da napravite paralelno pokretanje 4 posla:
Popis 2
$ make --jobs = 4Prema Amdahlovom zakonu [23], ovo će smanjiti vrijeme izrade za gotovo 50%. Imajte na umu da ovaj pristup dobro funkcionira ako pojedinačni ciljevi ne ovise jedni o drugima; na primjer, izlaz cilja 5 nije potreban za izgradnju cilja 3.
Međutim, postoji jedan nuspojava: izlaz statusnih poruka za svaki Učini cilj čini se proizvoljan i oni više ne mogu biti jasno dodijeljeni cilju. Izlazni redoslijed ovisi o stvarnom redoslijedu izvršenja posla.
Definirajte nalog za izvršenje
Postoje li izjave koje pomažu u razumijevanju ciljeva koji ovise jedni o drugima? Da! Primjer Makefile u Popisu 3 kaže ovo:
* za izgradnju ciljanih "svih", pokrenite upute za e1, e2 i e3
* cilj e2 zahtijeva da se cilj e3 izgradi prije
To znači da se ciljevi e1 i e3 mogu graditi paralelno, prvo, zatim slijedi e2 čim se završi izgradnja e3, konačno.
Popis 3
sve: e1 e2 e3e1:
dodirnite jedan
e2: e3
dodirnite dva
e3:
dodirnite tri
čist:
rm jedan dva tri
Vizualizirajte Izrada ovisnosti
Pametan alat make2graph iz projekta makefile2graph [19] vizualizira izradu ovisnosti kao usmjereni aciklički graf. To pomaže razumjeti kako različiti ciljevi ovise jedni o drugima. Make2graph daje opise grafikona u formatu točkica koje možete pretvoriti u PNG sliku pomoću naredbe točka iz projekta Graphviz [22]. Poziv je sljedeći:
Popis 4
$ make all -Bnd | make2graph | točka -Tpng -o graf.pngPrvo se poziva Make s ciljem "all", a zatim opcijama "-B" za bezuvjetno izgradnju svih ciljeva, "-n" (skraćenica od "-dry-run") da bi se pretvarao da izvršava upute po cilju i " -d "(" -debug ") za prikaz podataka o otklanjanju pogrešaka. Izlaz se cijevi da make2graph koji svoj izlaz usmjeri u točku koja generira graf slikovne datoteke.png u PNG formatu.
Grafikon ovisnosti o gradnji za popis 3
Više kompajlera i sustava gradnje
Kao što je već gore objašnjeno, Make je razvijen prije više od četiri desetljeća. Tijekom godina paralelno izvršavanje poslova postajalo je sve važnije, a od tada je rastao broj posebno dizajniranih kompajlera i sustava za izgradnju kako bi se postigla viša razina paralelizacije. Popis alata uključuje sljedeće:
- Bazel [20]
- CMake [4]: skraćuje Make na više platformi i stvara datoteke opisa koje je kasnije koristio Make
- distmake [12]
- Distribuirani sustav izrade (DMS) [10] (čini se da je mrtav)
- dmake [13]
- LSF marka [15]
- Apache Maven
- Mezon
- Ninja Build
- NMake [6]: Napravite za Microsoft Visual Studio
- PyDoit [8]
- Qmake [11]
- ponoviti [14]
- SCons [7]
- Vaf [9]
Većina ih je dizajnirana s paralelizacijom na umu i nude bolji rezultat u pogledu vremena izrade od Make-a.
Zaključak
Kao što ste vidjeli, vrijedi razmisliti o paralelnim gradnjama jer značajno smanjuje vrijeme izrade do određene razine. Ipak, to nije lako postići, a dolazi s određenim zamkama [3]. Prije stupanja u paralelne gradnje preporuča se analizirati i vaš kôd i njegovu putanju gradnje.
Poveznice i reference
- [1] GNU Make Manual: Paralelno izvršavanje, https: // www.gnu.org / software / make / manual / html_node / Parallel.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] John Graham-Cumming: Zamke i blagodati GNU-a čine paralelizaciju, https: // www.cmcrossroads.com / article / zamke-i-koristi-gnu-make-paralelizacija
- [4] CMake, https: // cmake.org /
- [5] LoadTeam, https: // www.loadteam.com /
- [6] NMake, https: // docs.Microsofta.com / en-us / cpp / build / reference / nmake-reference?pogled = msvc-160
- [7] SCons, https: // www.scons.org /
- [8] PyDoit, https: // pydoit.org /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Distribuirani sustav izrade (DMS), http: // www.nongnu.org / dms / index.html
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-priručnik.html
- [12] distmake, https: // sourceforge.net / projects / distmake /
- [13] dmake, https: // docs.proročište.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] ponoviti, https: // ponoviti.readthedocs.io / hr / najnovije /
- [15] LSF Make, http: // sunray2.mit.edu / kits / platform-lsf / 7.0.6/1 / guides / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Izgradnja distribuiranog sustava gradnje na Google Scaleu, GoTo Conference 2016, https: // gotocon.com / dl / goto-chicago-2016 / slides / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debianov sustav gradnje, mreža Autobuilder, https: // www.debian.org / devel / buildd / index.en.html
- [18] koji - RPM sustav za izgradnju i praćenje, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Bazel, https: // bazel.izgraditi/
- [21] Vodič za Makefile, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.graphviz.org
- [23] Amdahlov zakon, Wikipedia, https: // en.wikipedija.org / wiki / Amdahl% 27s_law