GNU gamintojas

Kodo sudarymas lygiagrečiai naudojant „Make“

Kodo sudarymas lygiagrečiai naudojant „Make“

Kiekvienas, kurio paklausite, kaip tinkamai sukurti programinę įrangą, pateiks „Make“ kaip vieną iš atsakymų. GNU / Linux sistemose „GNU Make“ [1] yra originalaus „Make“, kuris buvo išleistas daugiau nei prieš 40 metų - 1976 m., Atvirojo kodo versija. Kurkite darbus naudodami „Makefile“ - struktūrizuotą paprasto teksto failą tokiu pavadinimu, kurį geriausiai galima apibūdinti kaip programinės įrangos kūrimo proceso statybos vadovą. „Makefile“ yra daugybė etikečių (vadinamų taikiniais) ir konkrečios instrukcijos, kurias reikia atlikti kuriant kiekvieną tikslą.

Paprasčiau tariant, „Make“ yra kūrimo įrankis. Tai seka „Makefile“ užduočių receptu. Tai leidžia pakartoti veiksmus automatizuotai, o ne įvesti juos į terminalą (ir tikriausiai suklysti rašant).

1 sąraše pateikiamas „Makefile“ pavyzdys su dviem tikslais „e1“ ir „e2“, taip pat dviem specialiaisiais tikslais „visi“ ir „švarus“.„Vykdydami„ make e1 “, įvykdomos„ e1 “tikslo instrukcijos ir sukuriamas tuščias failas. Paleidus „make e2“, tas pats padaromas tikslui „e2“ ir sukuriant tuščią failą du. Skambučiu „padaryti viską“ vykdomos instrukcijos, skirtos tikslui e1 pirmiausia ir paskui e2. Norėdami pašalinti anksčiau sukurtus pirmąjį ir antrąjį failus, tiesiog atlikite skambutį „make clean.“

1 sąrašas

visi: e1 e2
e1:
palieskite vieną
e2:
palieskite du
švarus:
rm vienas du

Bėgantis „Make“

Dažnas atvejis yra tas, kad jūs parašote savo „Makefile“ ir tada tiesiog paleiskite komandą „make“ arba „make all“, kad sukurtumėte programinę įrangą ir jos komponentus. Visi taikiniai yra pastatyti eilės tvarka ir be jokių lygiagrečių. Bendras kūrimo laikas yra laiko suma, reikalinga kiekvienam tikslui sukurti.

Šis metodas tinka mažiems projektams, tačiau vidutinių ir didesnių projektų atveju jis trunka gana ilgai. Šis metodas nebėra atnaujintas, nes daugumoje dabartinių procesorių yra daugiau nei vienas branduolys ir leidžia vienu metu vykdyti daugiau nei vieną procesą. Atsižvelgdami į šias idėjas, mes žvelgiame į tai, ar ir kaip galima sukonstruoti kūrimo procesą. Tikslas yra tiesiog sutrumpinti kūrimo laiką.

Padarykite patobulinimus

Yra keletas variantų, kuriuos mes turime: 1) supaprastinti kodą, 2) paskirstyti atskiras užduotis į skirtingus skaičiavimo mazgus, sukurti kodą ten ir surinkti rezultatą iš ten, 3) lygiagrečiai kurti kodą vienoje mašinoje ir 4) sujungti 2 ir 3 variantus.

1 variantas) ne visada lengva. Tam reikia valios išanalizuoti įdiegto algoritmo vykdymo laiką ir žinių apie kompiliatorių, t.e., kaip kompiliatorius programavimo kalba paverčia instrukcijas procesoriaus instrukcijomis.

2 variantas) reikalinga prieiga prie kitų skaičiavimo mazgų, pavyzdžiui, paskirtų skaičiavimo mazgų, nenaudojamų ar mažiau naudotų mašinų, virtualių mašinų iš debesijos paslaugų, pvz., AWS, arba nuomojamos skaičiavimo galios iš tokių paslaugų kaip „LoadTeam“ [5]. Iš tikrųjų šis metodas naudojamas kuriant programinės įrangos paketus. „Debian GNU / Linux“ naudoja vadinamąjį „Autobuilder“ tinklą [17], o „RedHat“ / „Fedors“ - „Koji“ [18]. „Google“ vadina savo sistemą „BuildRabbit“ ir tai puikiai paaiškina Aysylu Greenberg pokalbyje [16]. distcc [2] yra vadinamasis paskirstytasis C kompiliatorius, leidžiantis lygiagrečiai sukompiliuoti kodą įvairiuose mazguose ir sukurti savo sukūrimo sistemą.

3 variante lygiagretinimas naudojamas vietiniu lygiu. Tai gali būti variantas, kurio kainos ir naudos santykis yra geriausias, nes tam nereikia papildomos aparatūros, kaip nurodyta 2 variante. Reikalavimas paleisti „Make“ lygiagrečiai yra skambučio pridėjimas -j (trumpinys -jobs). Tai nurodo vienu metu vykdomų darbų skaičių. Žemiau pateiktame sąraše prašoma „Make“ atlikti lygiagrečiai 4 darbus:

2 sąrašas

$ make --jobs = 4

Pagal Amdahlio įstatymą [23] tai sutrumpins kūrimo laiką beveik 50%. Atminkite, kad šis metodas veikia gerai, jei pavieniai tikslai nepriklauso vienas nuo kito; pavyzdžiui, 5 tikslo išvesties nereikia norint sukurti 3 tikslą.

Tačiau yra vienas šalutinis poveikis: kiekvieno „Make“ taikinio būsenos pranešimų išvestis atrodo savavališkai ir jų nebegalima aiškiai priskirti taikiniui. Išvesties tvarka priklauso nuo faktinės darbo vykdymo tvarkos.

Apibrėžkite „Make Execution Order“

Ar yra teiginių, padedančių suprasti, kurie taikiniai priklauso vienas nuo kito? Taip! 3 sąrašo „Makefile“ pavyzdys sako:

* norėdami sukurti tikslą „visi“, vykdykite e1, e2 ir e3 instrukcijas

* Tikslas e2 reikalauja, kad tikslas e3 būtų sukurtas anksčiau

Tai reiškia, kad tikslai e1 ir e3 gali būti pastatyti lygiagrečiai, pirmiausia, tada e2 seka, kai tik baigiama statyti e3, galiausiai.

3 sąrašas

visi: e1 e2 e3
e1:
palieskite vieną
e2: e3
palieskite du
e3:
palieskite tris
švarus:
rm vienas du trys

Vizualizuokite „Make Dependencies“

Protingas įrankis „make2graph“ iš „makefile2graph“ [19] projekto vizualizuoja „Make“ priklausomybes kaip nukreiptą aciklinį grafiką. Tai padeda suprasti, kaip skirtingi taikiniai priklauso vienas nuo kito. „Make2graph“ pateikia taškų formato grafiko aprašymus, kuriuos galite transformuoti į PNG vaizdą naudodami taško komandą iš „Graphviz“ projekto [22]. Skambinama taip:

4 sąrašas

$ padaryti viską -Bnd | make2graph | taškas -Tpng -o grafikas.png

Pirma, „Make“ iškviečiamas su tikslu „visi“, po kurio pateikiamos parinktys „-B“, kad būtų galima besąlygiškai pastatyti visus taikinius, „-n“ (sutrumpintai reiškia „-dry-run“) apsimetinėti vykdančiu nurodymus pagal tikslą ir „ -d “(„ -debug “), kad būtų rodoma derinimo informacija. Išvestis perduodama į „make2graph“, kuri išvestį į tašką paverčia vaizdo failo grafiku.png PNG formatu.


3 sąrašo sukūrimo priklausomybės grafikas

Daugiau kompiliatorių ir komponavimo sistemų

Kaip jau paaiškinta aukščiau, „Make“ buvo sukurta daugiau nei prieš keturis dešimtmečius. Bėgant metams, lygiagrečiai atlikti darbus tapo vis svarbiau, o nuo to laiko specialiai sukurtų kompiliatorių ir sukurtų sistemų skaičius siekiant aukštesnio lygiagretumo lygio. Įrankių sąraše yra šie:

Dauguma jų buvo suprojektuoti atsižvelgiant į lygiagretumą ir siūlo geresnį rezultatą atsižvelgiant į sukūrimo laiką nei „Make“.

Išvada

Kaip matėte, verta pagalvoti apie lygiagretus kūrimus, nes tai žymiai sumažina kūrimo laiką iki tam tikro lygio. Vis dėlto tai pasiekti nėra lengva ir kyla tam tikrų spąstų [3]. Prieš pereinant prie lygiagrečių versijų, rekomenduojama išanalizuoti kodą ir jo sukūrimo kelią.

Nuorodos ir nuorodos

Įdiekite naujausią „Dolecin Emulator“, skirtą „Gamecube“ ir „Wii“, sistemoje „Linux“
„Delfinų emuliatorius“ leidžia žaisti pasirinktus „Gamecube“ ir „Wii“ žaidimus „Linux“ asmeniniuose kompiuteriuose (PC). „Dolphin Emulator“ yra laisv...
Kaip naudoti „GameConqueror Cheat Engine“ sistemoje „Linux“
Straipsnyje pateikiamas „GameConqueror“ apgaulės variklio naudojimo „Linux“ vadove. Daugelis žaidėjų, žaidžiančių sistemoje „Windows“, dažnai naudoja ...
Geriausi „Linux“ žaidimų konsolių emuliatoriai
Šiame straipsnyje bus išvardyta populiari žaidimų konsolių emuliavimo programinė įranga, skirta „Linux“. „Emuliacija“ yra programinės įrangos suderina...