GNU-merkki

Koodin kääntäminen rinnakkain Make-toiminnolla

Koodin kääntäminen rinnakkain Make-toiminnolla

Kuka tahansa, jolta kysyt, miten ohjelmisto rakennetaan oikein, tulee olemaan yksi vastauksista Make. GNU / Linux-järjestelmissä GNU Make [1] on avoimen lähdekoodin versio alkuperäisestä Makeista, joka julkaistiin yli 40 vuotta sitten - vuonna 1976. Tee töitä Makefile-tiedostolla - tällä nimellä strukturoidulla tekstitiedostolla, joka voidaan parhaiten kuvata ohjelmiston rakennusprosessin rakennusoppaaksi. Makefile sisältää useita tarroja (kutsutaan kohteiksi) ja erityiset ohjeet, jotka on suoritettava kunkin kohteen rakentamiseksi.

Yksinkertaisesti sanottuna Make on rakennustyökalu. Se noudattaa Makefile-tehtävien reseptiä. Sen avulla voit toistaa vaiheet automatisoidusti sen sijaan, että kirjoittaisit ne päätelaitteeseen (ja todennäköisesti tekisit virheitä kirjoittaessasi).

Luettelossa 1 on esimerkki Makefilesta, jossa on kaksi kohdetta "e1" ja "e2" sekä kaksi erityistavoitetta "kaikki" ja "puhdas".”Make e1: n suorittaminen suorittaa kohteen” e1 ”ohjeet ja luo tyhjän tiedoston. Make e2: n suorittaminen tekee saman kohdealueelle e2 ja luo kaksi tyhjää tiedostoa. Kutsu "tee kaikki" suorittaa ohjeet kohteelle e1 ensin ja e2 seuraavaksi. Jos haluat poistaa aiemmin luodut tiedostot yksi ja kaksi, suorita puhelu "puhdista.”

Listaus 1

kaikki: e1 e2
e1:
kosketa yhtä
e2:
kosketa kahta
puhdas:
rm yksi kaksi

Juokseva merkki

Yleinen tapaus on, että kirjoitat Makefileesi ja suoritat sitten komennon "make" tai "make all" rakentaaksesi ohjelmiston ja sen komponentit. Kaikki kohteet on rakennettu sarjajärjestyksessä ilman rinnakkaistamista. Kokonaisrakennusaika on summa, joka tarvitaan jokaisen kohteen rakentamiseen.

Tämä lähestymistapa toimii hyvin pienissä projekteissa, mutta kestää melko kauan keskisuurissa ja suurissa projekteissa. Tämä lähestymistapa ei ole enää ajan tasalla, koska suurin osa nykyisistä prosessoreista on varustettu useammalla kuin yhdellä ytimellä ja mahdollistaa useamman kuin yhden prosessin suorittamisen kerrallaan. Nämä ajatukset mielessä tarkastelemme, voidaanko rakennusprosessia rinnastaa. Tavoitteena on yksinkertaisesti lyhentää rakennusaikaa.

Tee parannuksia

Meillä on muutama vaihtoehto - 1) yksinkertaistamme koodia, 2) jaamme yksittäiset tehtävät eri laskennan solmuihin, rakennamme koodin sinne ja kerätään tulos sieltä, 3) rakennetaan koodi rinnakkain yhteen koneeseen 4) yhdistää vaihtoehdot 2 ja 3.

Vaihtoehto 1) ei ole aina helppoa. Se vaatii tahtoa analysoida toteutetun algoritmin ajonaikaa ja tietoa kääntäjästä, ts.e., kuinka kääntäjä kääntää ohjelmointikielen ohjeet prosessorin ohjeiksi.

Vaihtoehto 2) vaatii pääsyn muihin laskennasolmuihin, esimerkiksi omistettuihin tietokonesolmuihin, käyttämättömiin tai vähemmän käytettyihin koneisiin, virtuaalikoneisiin pilvipalveluista, kuten AWS, tai vuokrattuun laskentatehoon palveluista, kuten LoadTeam [5]. Todellisuudessa tätä lähestymistapaa käytetään ohjelmistopakettien rakentamiseen. Debian GNU / Linux käyttää ns. Autobuilder-verkkoa [17] ja RedHat / Fedors Kojia [18]. Google kutsuu järjestelmäänsä BuildRabbitiksi, ja Aysylu Greenberg selittää sen puheessa täydellisesti [16]. distcc [2] on ns. hajautettu C-kääntäjä, jonka avulla voit kääntää koodia eri solmuihin rinnakkain ja luoda oman koontijärjestelmän.

Vaihtoehto 3 käyttää rinnakkaistamista paikallistasolla. Tämä voi olla vaihtoehto, jolla on paras kustannus-hyötysuhde sinulle, koska se ei vaadi lisälaitteita, kuten vaihtoehdossa 2. Vaatimus suorittaa Make rinnakkain on lisätä -j-vaihtoehto puheluun (lyhenne sanoista -jobs). Tämä määrittää samanaikaisesti suoritettavien töiden määrän. Alla olevassa luettelossa pyydetään Make suorittamaan 4 työpaikkaa samanaikaisesti:

Listaus 2

$ make --jobs = 4

Amdahlin lain [23] mukaan tämä lyhentää rakennusaikaa lähes 50%. Muista, että tämä lähestymistapa toimii hyvin, jos yksittäiset tavoitteet eivät ole riippuvaisia ​​toisistaan; esimerkiksi tavoitteen 5 lähtöä ei vaadita kohteen 3 rakentamiseen.

On kuitenkin yksi sivuvaikutus: jokaisen Make-kohteen tilaviestien lähtö näyttää mielivaltaiselta, eikä niitä voida enää osoittaa selvästi kohteelle. Lähtötilaus riippuu työn suorittamisen todellisesta järjestyksestä.

Määritä Suorita suoritusjärjestys

Onko olemassa lausuntoja, jotka auttavat tekemään ymmärtämään, mitkä kohteet riippuvat toisistaan? Joo! Listan 3 Makefile-esimerkki sanoo tämän:

* rakentaaksesi kohteen "kaikki", suorita ohjeet malleille e1, e2 ja e3

* kohde e2 edellyttää, että kohde e3 on rakennettu aiemmin

Tämä tarkoittaa, että kohteet e1 ja e3 voidaan rakentaa rinnan ensin, sitten e2 seuraa heti kun e3: n rakennus on valmis.

Listaus 3

kaikki: e1 e2 e3
e1:
kosketa yhtä
e2: e3
kosketa kahta
e3:
kosketa kolmea
puhdas:
rm yksi kaksi kolme

Visualisoi Tee riippuvuuksia

Makefile2graph [19] -projektin fiksu työkalu make2graph visualisoi Make-riippuvuudet suuntautuneena asyklisenä kaaviona. Tämä auttaa ymmärtämään, miten eri kohteet riippuvat toisistaan. Make2graph antaa pisteformaatissa kuvaajan kuvaukset, jotka voit muuntaa PNG-kuviksi käyttämällä Graphviz-projektin pistekomentoa [22]. Puhelu on seuraava:

Listaus 4

$ tee kaikki -Bnd | make2graph | piste -Tpng -o-kaavio.png

Ensinnäkin Makea kutsutaan kohteella "kaikki", jota seuraa vaihtoehdot "-B" kaikkien tavoitteiden rakentamiseksi ehdoitta, "-n" (lyhenne sanoista "-dry-run") teeskentelemään ohjeiden suorittamista kohdekohtaisesti ja " -d ”(“ -debug ”) näyttää virheenkorjaustiedot. Lähtö johdetaan malliin make2graph, joka johtaa tuotoksen pisteeseen, joka luo kuvatiedostokaavion.png PNG-muodossa.


Luettelon 3 rakennusriippuvuuskaavio

Lisää kääntäjiä ja koontijärjestelmiä

Kuten jo edellä selitettiin, Make kehitettiin yli neljä vuosikymmentä sitten. Vuosien mittaan työpaikkojen suorittaminen rinnakkain on tullut yhä tärkeämmäksi, ja korkeamman rinnakkaisuuden saavuttamiseksi erityisesti suunniteltujen kääntäjien ja rakennusjärjestelmien määrä on kasvanut siitä lähtien. Työkalujen luettelo sisältää nämä:

Suurin osa niistä on suunniteltu rinnakkaistamista silmällä pitäen ja tarjoavat paremman tuloksen rakennusajan suhteen kuin Make.

Johtopäätös

Kuten olet nähnyt, kannattaa miettiä rinnakkaisia ​​koontiversioita, koska se vähentää rakennusaikaa merkittävästi tietylle tasolle. Silti sitä ei ole helppo saavuttaa, ja siihen liittyy tiettyjä karhuja [3]. On suositeltavaa analysoida sekä koodi että sen koontirata ennen siirtymistä rinnakkaisiin koontiversioihin.

Linkit ja viitteet

Hyödyllisiä työkaluja Linux-pelaajille
Jos haluat pelata pelejä Linuxissa, on todennäköistä, että olet käyttänyt sovelluksia ja apuohjelmia, kuten Wine, Lutris ja OBS Studio, pelikokemuksen...
HD Remastered Games for Linux that Never had a Linux Release Earlier
Many game developers and publishers are coming up with HD remaster of old games to extend the life of franchise, please fans requesting compatibility ...
Kuinka käyttää AutoKey-toimintoa Linux-pelien automatisointiin
AutoKey on työpöydän automaatioapuohjelma Linuxille ja X11: lle, ohjelmoitu Python 3, GTK ja Qt. Komentosarjojen ja MACRO-toimintojen avulla voit auto...