GNU Make

Kompilering av kode parallelt med Make

Kompilering av kode parallelt med Make

Den du spør om hvordan du bygger programvare riktig, kommer med Make som et av svarene. På GNU / Linux-systemer er GNU Make [1] Open Source-versjonen av originalen Make som ble utgitt for mer enn 40 år siden - i 1976. Lag arbeider med en Makefile - en strukturert ren tekstfil med det navnet som best kan beskrives som konstruksjonsmanualen for programvarebyggingsprosessen. Makefilen inneholder et antall etiketter (kalt mål) og de spesifikke instruksjonene som må utføres for å bygge hvert mål.

Enkelt sagt er Make et byggeverktøy. Den følger oppskriften på oppgaver fra Makefile. Det lar deg gjenta trinnene på en automatisk måte i stedet for å skrive dem i en terminal (og sannsynligvis gjøre feil mens du skriver).

Oppføring 1 viser et eksempel på Makefile med de to målene “e1” og “e2”, samt de to spesialmålene “alle” og “rene."Å kjøre" make e1 "utfører instruksjonene for målet" e1 "og lager den tomme filen. Å kjøre "make e2" gjør det samme for målet "e2" og skaper den tomme filen to. Anropet "make all" utfører instruksjonene for mål e1 først og e2 neste. For å fjerne de tidligere opprettede filene en og to, er det bare å utføre samtalen “gjør rent.”

Oppføring 1

alle: e1 e2
e1:
berør en
e2:
berør to
ren:
rm en to

Running Make

Det vanlige tilfellet er at du skriver Makefile og deretter bare kjører kommandoen "make" eller "make all" for å bygge programvaren og dens komponenter. Alle målene er bygget i serierekkefølge og uten noen parallellisering. Den totale byggetiden er summen av tid som kreves for å bygge hvert enkelt mål.

Denne tilnærmingen fungerer bra for små prosjekter, men tar ganske lang tid for mellomstore og større prosjekter. Denne tilnærmingen er ikke lenger oppdatert, da det meste av dagens cpus er utstyrt med mer enn en kjerne og tillater utføring av mer enn én prosess om gangen. Med disse ideene i bakhodet ser vi på om og hvordan byggeprosessen kan parallelliseres. Målet er å bare redusere byggetiden.

Gjør forbedringer

Det er noen få alternativer vi har - 1) forenkle koden, 2) distribuere enkeltoppgavene på forskjellige databehandlingsnoder, bygge koden der og samle resultatet derfra, 3) bygge koden parallelt på en enkelt maskin, og 4) kombiner alternativ 2 og 3.

Alternativ 1) er ikke alltid lett. Det krever vilje til å analysere kjøretiden til den implementerte algoritmen og kunnskap om kompilatoren, dvs.e., hvordan oversetter kompilatoren instruksjonene i programmeringsspråket til prosessorinstruksjoner.

Alternativ 2) krever tilgang til andre databehandlingsnoder, for eksempel dedikerte databehandlingsnoder, ubrukt eller mindre brukte maskiner, virtuelle maskiner fra skytjenester som AWS, eller leid datakraft fra tjenester som LoadTeam [5]. I virkeligheten brukes denne tilnærmingen til å bygge programvarepakker. Debian GNU / Linux bruker det såkalte Autobuilder-nettverket [17], og RedHat / Fedors bruker Koji [18]. Google kaller systemet BuildRabbit og forklares perfekt i samtalen av Aysylu Greenberg [16]. distcc [2] er en såkalt distribuert C-kompilator som lar deg kompilere kode på forskjellige noder parallelt og sette opp ditt eget byggesystem.

Alternativ 3 bruker parallellisering på lokalt nivå. Dette kan være alternativet med det beste nytte-forholdet for deg, da det ikke krever ekstra maskinvare som i alternativ 2. Kravet om å kjøre Make parallelt er å legge til alternativet -j i samtalen (forkortelse for -jobs). Dette spesifiserer antall jobber som kjøres samtidig. Oppføringen nedenfor ber om å lage for å kjøre fire jobber parallelt:

Oppføring 2

$ make --jobs = 4

I følge Amdahls lov [23] vil dette redusere byggetiden med nesten 50%. Husk at denne tilnærmingen fungerer bra hvis enkeltmålene ikke er avhengige av hverandre; for eksempel er ikke produksjonen fra mål 5 nødvendig for å bygge mål 3.

Det er imidlertid en bivirkning: produksjonen av statusmeldingene for hvert Make-mål virker vilkårlig, og disse kan ikke lenger tilordnes et mål tydelig. Utgangsordren avhenger av den faktiske rekkefølgen på jobben.

Definer Make Execution Order

Er det utsagn som hjelper Make til å forstå hvilke mål som avhenger av hverandre? Ja! Eksemplet Makefile i Listing 3 sier dette:

* for å bygge målet "alle", kjør instruksjonene for e1, e2 og e3

* mål e2 krever at mål e3 bygges før

Dette betyr at målene e1 og e3 kan bygges parallelt, først, deretter følger e2 så snart bygningen til e3 er fullført, til slutt.

Oppføring 3

alle: e1 e2 e3
e1:
berør en
e2: e3
berør to
e3:
berør tre
ren:
rm en to tre

Visualiser Make Dependencies

Det smarte verktøyet make2graph fra makefile2graph [19] -prosjektet visualiserer Make-avhengigheter som en rettet asyklisk graf. Dette hjelper til å forstå hvordan de forskjellige målene avhenger av hverandre. Make2graph gir grafbeskrivelser i prikkformat som du kan forvandle til et PNG-bilde ved hjelp av punktkommandoen fra Graphviz-prosjektet [22]. Samtalen er som følger:

Oppføring 4

$ gjør alt -Bind | make2graph | punkt -Tpng -o graf.png

For det første kalles Make med målet "all" etterfulgt av alternativene "-B" for ubetinget å bygge alle målene, "-n" (forkortelse for "-tør-run") for å late som om du kjører instruksjonene per mål, og " -d ”(“ -debug ”) for å vise feilsøkingsinformasjon. Utgangen røres for å lage2graph som rør utgangen til punkt som genererer bildefilgrafen.png i PNG-format.


Byggeavhengighetsgrafen for oppføring 3

Flere kompilatorer og byggesystemer

Som allerede forklart ovenfor ble Make utviklet for mer enn fire tiår siden. Gjennom årene har utførelse av jobber parallelt blitt mer og mer viktig, og antall spesialdesignede kompilatorer og byggesystemer for å oppnå et høyere nivå av parallellisering har vokst siden den gang. Liste over verktøy inkluderer disse:

De fleste av dem er designet med tanke på parallellisering og gir et bedre resultat med hensyn til byggetid enn Make.

Konklusjon

Som du har sett, er det verdt å tenke på parallelle bygg, da det reduserer byggetiden betydelig opp til et visst nivå. Likevel er det ikke lett å oppnå og kommer med visse fallgruver [3]. Det anbefales å analysere både koden din og dens byggesti før du går inn i parallelle bygg.

Lenker og referanser

HD Remastered Games for Linux som aldri hadde en Linux-utgave tidligere
Mange spillutviklere og utgivere kommer med HD-remaster av gamle spill for å forlenge franchisetiden, vennligst fans som ber om kompatibilitet med mod...
Hvordan bruke AutoKey til å automatisere Linux-spill
AutoKey er et desktopautomatiseringsverktøy for Linux og X11, programmert i Python 3, GTK og Qt. Ved å bruke skript og MACRO-funksjonalitet kan du aut...
Hvordan vise FPS-teller i Linux-spill
Linux-spill fikk et stort press da Valve kunngjorde Linux-støtte for Steam-klient og spillene deres i 2012. Siden den gang har mange AAA- og indiespil...