GNU Make

Paralelno kompiliranje koda pomoću programa Make

Paralelno kompiliranje koda pomoću programa Make

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 e2
e1:
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 = 4

Prema 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 e3
e1:
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.png

Prvo 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:

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

Najbolje aplikacije za mapiranje gamepada za Linux
Ako volite igrati igre na Linuxu s gamepadom umjesto tipičnim sustavom za unos tipkovnice i miša, za vas postoji nekoliko korisnih aplikacija. Mnoge r...
Korisni alati za Linux igrače
Ako volite igrati igre na Linuxu, velika je vjerojatnost da ste možda koristili aplikacije i uslužne programe poput Wine, Lutris i OBS Studio za pobol...
HD Remastered igre za Linux koje ranije nisu imale Linux izdanje
Mnogi programeri i izdavači igara dolaze s HD remasterom starih igara kako bi produžili životni vijek franšize, molimo obožavatelje da zatraže kompati...