GNU Make

Vzporedno prevajanje kode z uporabo programa Make

Vzporedno prevajanje kode z uporabo programa Make

Kogar koli vprašate, kako pravilno zgraditi programsko opremo, bo kot enega od odgovorov izbral Make. V sistemih GNU / Linux je GNU Make [1] odprtokodna različica originalne znamke, ki je bila izdana pred več kot 40 leti - leta 1976. Make deluje z datoteko Makefile - strukturirano navadno besedilno datoteko s tem imenom, ki jo lahko najbolje opišemo kot gradbeni priročnik za postopek izdelave programske opreme. Datoteka Make vsebuje številne oznake (imenovane cilji) in posebna navodila, ki jih je treba izvesti za izdelavo vsakega cilja.

Preprosto povedano, Make je orodje za gradnjo. Sledi receptu nalog iz datoteke Makefile. Omogoča avtomatizirano ponavljanje korakov, namesto da bi jih vnašali v terminal (in med tipkanjem verjetno delali napake).

Seznam 1 prikazuje primer Makefile z dvema ciljema "e1" in "e2" ter dvema posebnima ciljema "all" in "clean."Zagon" make e1 "izvede navodila za cilj" e1 "in ustvari eno prazno datoteko. Zagon »make e2« naredi enako za ciljni »e2« in ustvari dve prazni datoteki. Klic »naredi vse« najprej izvede navodila za cilj e1 in e2 naslednji. Če želite odstraniti prej ustvarjeni datoteki ena in dve, preprosto izvedite klic »počisti."

Seznam 1

vsi: e1 e2
e1:
dotaknite se enega
e2:
dotaknite se dva
čisto:
rm ena dva

Running Make

Običajni primer je, da napišete svojo datoteko Makefile in nato samo zaženete ukaz »make« ali »make all« za izdelavo programske opreme in njenih komponent. Vsi cilji so zgrajeni v zaporednem zaporedju in brez paralelizacije. Skupni čas gradnje je vsota časa, ki je potreben za izdelavo vsakega posameznega cilja.

Ta pristop dobro deluje pri majhnih projektih, za srednje in večje pa traja precej dolgo. Ta pristop ni več posodobljen, saj je večina sedanjih procesorjev opremljena z več kot enim jedrom in omogoča izvajanje več kot enega procesa hkrati. Z mislijo na te ideje preučujemo, ali in kako je mogoče vzporedni postopek gradnje. Cilj je preprosto zmanjšati čas izdelave.

Naredite izboljšave

Obstaja nekaj možnosti - 1) poenostavitev kode, 2) porazdelitev posameznih nalog na različna računalniška vozlišča, tam zgraditi kodo in od tam zbrati rezultat, 3) vzporedno zgraditi kodo na enem stroju in 4) združite možnosti 2 in 3.

Možnost 1) ni vedno enostavna. Zahteva voljo za analizo časa izvajanja implementiranega algoritma in znanja o prevajalniku, tj.e., kako prevajalnik prevede navodila v programskem jeziku v navodila procesorja.

Možnost 2) zahteva dostop do drugih računalniških vozlišč, na primer namenskih računalniških vozlišč, neuporabljenih ali manj rabljenih strojev, navideznih strojev iz storitev v oblaku, kot je AWS, ali najetih računalniških moči pri storitvah, kot je LoadTeam [5]. V resnici se ta pristop uporablja za izdelavo programskih paketov. Debian GNU / Linux uporablja tako imenovano omrežje Autobuilder [17], RedHat / Fedors pa Koji [18]. Google pokliče svoj sistem BuildRabbit in je v pogovoru Aysylu Greenberg popolnoma pojasnjen [16]. distcc [2] je tako imenovani porazdeljeni prevajalnik C, ki omogoča vzporedno prevajanje kode na različnih vozliščih in nastavitev lastnega sistema gradnje.

Možnost 3 uporablja paralelizacijo na lokalni ravni. To je morda najboljša možnost za vas, saj ne potrebuje dodatne strojne opreme, kot pri možnosti 2. Zahteva za zagon vzporedno z Make je dodajanje možnosti -j v klic (kratica za -jobs). To določa število opravil, ki se izvajajo hkrati. Spodnji seznam zahteva, da Make vzporedno izvaja 4 zaposlitve:

Seznam 2

$ make --jobs = 4

Po Amdahlovem zakonu [23] bo to zmanjšalo čas gradnje za skoraj 50%. Upoštevajte, da ta pristop deluje dobro, če posamezni cilji niso odvisni drug od drugega; na primer, rezultat cilja 5 ni potreben za izdelavo cilja 3.

Vendar obstaja en stranski učinek: izpis sporočil o stanju za vsako ciljno oznako se zdi poljuben in teh ni več mogoče jasno dodeliti cilju. Izhodni vrstni red je odvisen od dejanskega vrstnega reda izvedbe opravila.

Določite nalog za izvršitev

Ali obstajajo izjave, ki pomagajo razumeti, kateri cilji so odvisni drug od drugega? Da! Primer Makefile v seznamu 3 pravi naslednje:

* če želite zgraditi ciljno "vse", zaženite navodila za e1, e2 in e3

* Cilj e2 zahteva, da je cilj e3 zgrajen prej

To pomeni, da je mogoče cilje e1 in e3 graditi vzporedno, najprej, nato sledi e2 takoj, ko je gradnja e3 končana, končno.

Seznam 3

vsi: e1 e2 e3
e1:
dotaknite se enega
e2: e3
dotaknite se dva
e3:
dotaknite se tri
čisto:
rm ena dva tri

Vizualizirajte Naredite odvisnosti

Pametno orodje make2graph iz projekta makefile2graph [19] vizualizira odvisnosti Make kot usmerjeni aciklični graf. To pomaga razumeti, kako so različni cilji odvisni drug od drugega. Make2graph prikaže opise grafov v obliki pik, ki jih lahko pretvorite v sliko PNG z ukazom pika iz projekta Graphviz [22]. Klic je naslednji:

Seznam 4

$ make all -Bnd | make2graph | pika -Tpng -o graf.png

Najprej se pokliče Make s ciljem "all", čemur sledijo možnosti "-B" za brezpogojno gradnjo vseh ciljev, "-n" (okrajšava za "-dry-run"), da se pretvarja, da izvaja navodila po cilju, in " -d "(" -debug ") za prikaz informacij o odpravljanju napak. Izhod je usmerjen v make2graph, ki izhod usmerja v piko, ki generira graf slikovne datoteke.png v formatu PNG.


Graf odvisnosti gradnje za seznam 3

Več prevajalnikov in sistemov za gradnjo

Kot že razloženo zgoraj, je bil Make razvit pred več kot štirimi desetletji. Z leti je vzporedno opravljanje delovnih mest postajalo vedno bolj pomembno, od takrat pa je naraščalo število posebej zasnovanih prevajalnikov in sistemov za izdelavo paralelnosti. Seznam orodij vključuje ta:

Večina jih je bila zasnovana z mislijo na paralelizacijo in ponujajo boljši rezultat glede časa izdelave kot Make.

Zaključek

Kot ste videli, je vredno razmisliti o vzporednih gradnjah, saj znatno zmanjšajo čas gradnje na določeno raven. Kljub temu ga ni enostavno doseči in ima določene pasti [3]. Preden stopite v vzporedne gradnje, je priporočljivo analizirati svojo kodo in njeno pot gradnje.

Povezave in reference

Kako prikazati števec FPS v igrah Linux
Linux gaming je dobil velik zagon, ko je Valve leta 2012 napovedal podporo Linuxu za odjemalca Steam in njihove igre. Od takrat se je veliko AAA in in...
Kako prenesti in igrati Sid Meier's Civilization VI v Linuxu
Uvod v igro Civilization 6 je sodoben pogled na klasični koncept, uveden v seriji iger Age of Empires. Ideja je bila dokaj preprosta; začeli bi v zelo...
Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...