GNU kaubamärk

Koodi komponeerimine paralleelselt Make abil

Koodi komponeerimine paralleelselt Make abil

Kes küsib, kuidas tarkvara korralikult ehitada, pakub ühe vastusena välja Make. GNU / Linuxi süsteemides on GNU Make [1] algse Make avatud lähtekoodiga versioon, mis anti välja rohkem kui 40 aastat tagasi - 1976. aastal. Tehke tööd Makefile'iga - selle nimega struktureeritud lihttekstifailiga, mida saab kõige paremini kirjeldada tarkvara ehitamise protsessi käsiraamatuna. Makefile sisaldab mitmeid silte (nn sihtmärke) ja konkreetseid juhiseid, mis tuleb iga sihtmärgi ülesehitamiseks täita.

Lihtsalt öeldes on Make ehitustööriist. See järgib Makefile'i ülesannete retsepti. See võimaldab teil samme automatiseeritult korrata, selle asemel, et neid terminali sisestada (ja tõenäoliselt vigu kirjutades).

Loendis 1 on toodud Makefile'i näide kahe sihtmärgi "e1" ja "e2" ning kahe sihtmärgi "kõik" ja "puhas" kohta.„„ Make e1 ”käivitamine täidab sihtmärgi„ e1 ”juhised ja loob tühja faili. „Make e2” käivitamine teeb sama ka sihtmärgi „e2” jaoks ja loob tühja faili kaks. Kõne "tee kõik" täidab juhised sihtmärgile e1 ja järgmisena e2. Varem loodud failide ühe ja teise eemaldamiseks käivitage lihtsalt kõne „tee puhas.”

Nimekiri 1

kõik: e1 e2
e1:
puudutage ühte
e2:
puudutage kahte
puhas:
rm üks kaks

Jookse Mark

Tavaline on see, et kirjutate oma Makefile'i ja käivitate tarkvara ja selle komponentide loomiseks lihtsalt käsu "make" või "make all". Kõik sihtmärgid on ehitatud jadajärjekorras ja ilma paralleelsuseta. Kogu ehitamisaeg on summa, mis on vajalik iga üksiku sihtmärgi ehitamiseks.

See lähenemisviis sobib hästi väikeprojektide jaoks, kuid võtab keskmiste ja suuremate projektide jaoks üsna kaua aega. See lähenemine pole enam ajakohane, kuna enamik praegustest protsessoritest on varustatud mitme tuumaga ja võimaldavad korraga käivitada rohkem kui ühte protsessi. Neid ideid silmas pidades vaatame, kas ja kuidas saab koostamisprotsessi paralleelseks muuta. Eesmärk on lihtsalt ehitusaega lühendada.

Tehke parandusi

Meil on mõned võimalused - 1) lihtsustada koodi, 2) jaotada üksikud ülesanded erinevatele arvutisõlmedele, ehitada kood sinna ja koguda sealt tulemus, 3) ehitada kood paralleelselt ühele masinale ja 4) ühendage valikud 2 ja 3.

Variant 1) ei ole alati lihtne. See nõuab tahet analüüsida rakendatud algoritmi tööaega ja teadmisi kompilaatori kohta, s.t.e., kuidas kompilaator tõlgib programmeerimiskeeles olevad juhised protsessori juhisteks.

Variant 2) nõuab juurdepääsu teistele arvutisõlmedele, näiteks spetsiaalsetele arvutisõlmedele, kasutamata või vähem kasutatud masinatele, pilveteenuste (näiteks AWS) virtuaalsetele masinatele või renditud arvutusvõimsusele sellistest teenustest nagu LoadTeam [5]. Tegelikult kasutatakse seda lähenemist tarkvarapakettide loomiseks. Debiani GNU / Linux kasutab nn Autobuilderi võrku [17] ja RedHat / Fedors Kojit [18]. Google kutsub oma süsteemi BuildRabbit ja seda on Aysylu Greenbergi vestluses suurepäraselt selgitatud [16]. distcc [2] on niinimetatud hajutatud C kompilaator, mis võimaldab teil paralleelselt kompileerida koodi erinevatele sõlmedele ja seadistada oma ehitussüsteemi.

3. võimalus kasutab paralleelsust kohalikul tasandil. See võib olla teie jaoks parima kulude ja tulude suhtega variant, kuna see ei vaja täiendavat riistvara, nagu 2. variandi puhul. Nõue käivitada paralleelselt Make lisab kõnesse valiku -j (lühidalt -jobs). See määrab korraga käivitatavate töökohtade arvu. Allolevas loendis palutakse teha paralleelselt 4 töökoha käivitamiseks Make:

Nimekiri 2

$ make --jobs = 4

Amdahli seaduse [23] kohaselt vähendab see ehitamisaega ligi 50%. Pidage meeles, et see lähenemine töötab hästi, kui üksikud sihtmärgid ei sõltu üksteisest; näiteks ei ole sihtmärgi 5 loomiseks vaja sihtmärgi 5 väljundit.

Siiski on üks kõrvalmõju: olekuteadete väljund iga Make sihtmärgi kohta tundub meelevaldne ja neid ei saa enam sihtmärgile selgelt omistada. Väljundjärjestus sõltub töö täitmise tegelikust järjestusest.

Määrake käsk Tehke täitmise korraldus

Kas on väiteid, mis aitavad teha aru, millised sihtmärgid üksteisest sõltuvad? Jah! Makefile'i näide loendis 3 ütleb seda:

* sihtmärgi „kõik“ loomiseks käivitage juhised e1, e2 ja e3 jaoks

* target e2 eeldab, et target e3 tuleb enne ehitada

See tähendab, et kõigepealt saab sihtmärke e1 ja e3 ehitada paralleelselt, seejärel järgneb e2 kohe, kui e3 hoone on valmis.

Loend 3

kõik: e1 e2 e3
e1:
puudutage ühte
e2: e3
puudutage kahte
e3:
puudutage kolme
puhas:
rm üks kaks kolm

Visualiseerige Make Dependencies

Makefile2graph [19] projekti nutikas tööriist make2graph visualiseerib Make sõltuvused suunatud atsüklilise graafina. See aitab mõista, kuidas erinevad sihtmärgid üksteisest sõltuvad. Make2graph väljastab punktvormingus graafikakirjeldused, mille saate teisendada PNG-pildiks, kasutades projekti Graphviz punkti käsku [22]. Kõne on järgmine:

Nimekiri 4

$ tee kõik -Bnd | make2graph | punkt -Tpng -o graafik.png

Esiteks kutsutakse Make sihtmärgiga „kõik”, millele järgnevad valikud „-B” kõigi sihtmärkide tingimusteta ehitamiseks, „-n” (lühidalt “-dry-run”) teeskleb juhiste käitamist sihtmärgi kohta ja “ -d ”(“ -debug ”) silumisteabe kuvamiseks. Väljund edastatakse failile make2graph, mis viib väljundi punktini, mis loob pildifaili graafiku.PNG-vormingus png.


Loendi 3 koostamise sõltuvuse graafik

Rohkem koostajaid ja ehituskavasid

Nagu juba eespool selgitatud, töötati Make välja rohkem kui neli aastakümmet tagasi. Aastate jooksul on paralleelselt tööde teostamine muutunud üha olulisemaks ning kõrgema paralleelsuse taseme saavutamiseks spetsiaalselt loodud kompilaatorite ja ehituskomplektide arv on sellest ajast peale kasvanud. Tööriistade loend sisaldab neid:

Enamik neist on loodud paralleelsust silmas pidades ja pakuvad paremat tulemust koostamise aja osas kui Make.

Järeldus

Nagu nägite, tasub mõelda paralleelse järgu peale, kuna see vähendab ehitamise aega teatud tasemeni märkimisväärselt. Sellegipoolest pole seda lihtne saavutada ja sellega kaasnevad teatud lõksud [3]. Enne paralleelsetesse järkudesse astumist on soovitatav analüüsida nii oma koodi kui ka selle loomise teed.

Lingid ja viited

Kuidas installida ja mängida Doomi Linuxis
Doomi sissejuhatus Doom-seeria sai alguse 90ndatel pärast algse Doomi väljaandmist. See oli kohene hitt ja sellest ajast alates on mänguseeria pälvinu...
Vulkan Linuxi kasutajatele
Iga uue põlvkonna graafikakaartidega näeme, et mängude arendajad ületavad graafilise truuduse piire ja jõuavad fotorealismile ühe sammu lähemale. Kuid...
OpenTTD vs Simutrans
Oma transpordisimulatsiooni loomine võib olla lõbus, lõõgastav ja äärmiselt köitev. Sellepärast peate endale meelepärase leidmiseks kindlasti proovima...