GNU Make

Kompilering af kode parallelt ved hjælp af Make

Kompilering af kode parallelt ved hjælp af Make

Den, du spørger, hvordan man bygger software korrekt, kommer med Make som et af svarene. På GNU / Linux-systemer er GNU Make [1] Open Source-versionen af ​​den originale fabrikat, der blev udgivet for mere end 40 år siden - i 1976. Lav arbejder med en Makefile - en struktureret almindelig tekstfil med det navn, der bedst kan beskrives som konstruktionsmanualen til softwarebygningsprocessen. Makefilen indeholder et antal etiketter (kaldet mål) og de specifikke instruktioner, der skal udføres for at opbygge hvert mål.

Simpelthen er Make et byggeværktøj. Det følger opskriften på opgaver fra Makefile. Det giver dig mulighed for at gentage trinnene på en automatisk måde i stedet for at skrive dem i en terminal (og sandsynligvis lave fejl, mens du skriver).

Liste 1 viser et eksempel Makefile med de to mål “e1” og “e2” samt de to specialmål “alle” og “rene.”Kørsel af“ make e1 ”udfører instruktionerne til mål“ e1 ”og opretter den tomme fil en. Kørsel af "make e2" gør det samme for mål "e2" og opretter den tomme fil to. Opkaldet "make all" udfører instruktionerne til mål e1 først og e2 næste. For at fjerne de tidligere oprettede filer en og to skal du blot udføre opkaldet “gør rent.”

Liste 1

alle: e1 e2
e1:
tryk på en
e2:
tryk på to
ren:
rm en to

Running Make

Det almindelige tilfælde er, at du skriver din Makefile og derefter bare kører kommandoen "make" eller "make all" for at opbygge softwaren og dens komponenter. Alle mål er bygget i seriel rækkefølge og uden nogen parallelisering. Den samlede byggetid er summen af ​​tid, der kræves for at opbygge hvert enkelt mål.

Denne tilgang fungerer godt for små projekter, men tager temmelig lang tid for mellemstore og større projekter. Denne tilgang er ikke længere opdateret, da de fleste af de nuværende cpus er udstyret med mere end en kerne og tillader udførelse af mere end en proces ad gangen. Med disse ideer i tankerne ser vi på, om og hvordan byggeprocessen kan paralleliseres. Målet er simpelthen at reducere byggetiden.

Foretag forbedringer

Der er et par muligheder, vi har - 1) forenkle koden, 2) distribuere de enkelte opgaver på forskellige computernoder, opbyg koden der og saml resultatet derfra, 3) opbyg koden parallelt på en enkelt maskine, og 4) kombiner valgmulighed 2 og 3.

Mulighed 1) er ikke altid let. Det kræver viljen til at analysere køretid for den implementerede algoritme og viden om compileren, dvs.e., hvordan oversætter compileren instruktionerne på programmeringssprog til processorinstruktioner.

Mulighed 2) kræver adgang til andre computernoder, for eksempel dedikerede computernoder, ubrugte eller mindre brugte maskiner, virtuelle maskiner fra cloudtjenester som AWS eller lejet computerkraft fra tjenester som LoadTeam [5]. I virkeligheden bruges denne tilgang til at oprette softwarepakker. Debian GNU / Linux bruger det såkaldte Autobuilder-netværk [17], og RedHat / Fedors bruger Koji [18]. Google kalder sit system BuildRabbit og forklares perfekt i foredraget af Aysylu Greenberg [16]. distcc [2] er en såkaldt distribueret C-kompilator, der giver dig mulighed for at kompilere kode på forskellige noder parallelt og oprette dit eget build-system.

Mulighed 3 bruger parallelisering på lokalt niveau. Dette kan være den mulighed med det bedste cost-benefit-forhold for dig, da det ikke kræver yderligere hardware som i mulighed 2. Kravet om at køre Make parallelt er at tilføje optionen -j i opkaldet (forkortelse for -jobs). Dette specificerer antallet af job, der køres på samme tid. Nedenstående liste beder om at gøre for at køre 4 job parallelt:

Liste 2

$ make --jobs = 4

Ifølge Amdahls lov [23] vil dette reducere byggetiden med næsten 50%. Husk, at denne fremgangsmåde fungerer godt, hvis de enkelte mål ikke afhænger af hinanden; for eksempel er output fra mål 5 ikke påkrævet for at bygge mål 3.

Der er dog en bivirkning: output af statusmeddelelserne for hvert Make-mål vises vilkårligt, og disse kan ikke længere tydeligt tildeles et mål. Outputordren afhænger af den aktuelle ordre på jobudførelsen.

Definer Make Execution Order

Er der udsagn, der hjælper Gør at forstå, hvilke mål der afhænger af hinanden? Ja! Eksemplet Makefile i Listing 3 siger dette:

* for at bygge mål "alle" skal du køre instruktionerne til e1, e2 og e3

* mål e2 kræver, at mål e3 er bygget før

Dette betyder, at målene e1 og e3 kan bygges parallelt, først følger derefter e2, så snart bygningen af ​​e3 er afsluttet, til sidst.

Liste 3

alle: e1 e2 e3
e1:
tryk på en
e2: e3
tryk på to
e3:
tryk på tre
ren:
rm en to tre

Visualiser Make Dependencies

Det smarte værktøj make2graph fra makefile2graph [19] -projektet visualiserer Make-afhængigheder som en rettet acyklisk graf. Dette hjælper med at forstå, hvordan de forskellige mål afhænger af hinanden. Make2graph udsender grafbeskrivelser i prikformat, som du kan omdanne til et PNG-billede ved hjælp af punktkommandoen fra Graphviz-projektet [22]. Opkaldet er som følger:

Liste 4

$ gør alt -Bind | make2graph | dot -Tpng -o graf.png

For det første kaldes Make med målet "alle" efterfulgt af indstillingerne "-B" til ubetinget at bygge alle målene, "-n" (forkortelse for "-tør-run") for at foregive at køre instruktionerne pr. Mål og " -d ”(“ -debug ”) for at få vist fejlretningsoplysninger. Outputtet er piped for at gøre2graph, der rør dets output til prik, der genererer billedfilgrafen.png i PNG-format.


Bygningsafhængighedsgrafen til liste 3

Flere kompilatorer og build-systemer

Som allerede forklaret ovenfor blev Make udviklet for mere end fire årtier siden. Gennem årene er udførelse af job parallelt blevet mere og mere vigtigt, og antallet af specialdesignede compilere og byggesystemer for at opnå et højere niveau af parallelisering er vokset siden da. Listen over værktøjer inkluderer disse:

De fleste af dem er designet med parallelisering i tankerne og giver et bedre resultat med hensyn til byggetid end Make.

Konklusion

Som du har set, er det værd at tænke på parallelle builds, da det reducerer byggetiden betydeligt op til et bestemt niveau. Alligevel er det ikke let at opnå og kommer med visse faldgruber [3]. Det anbefales at analysere både din kode og dens build-sti, inden du går ind i parallelle builds.

Links og referencer

Sådan installeres og afspilles Doom på Linux
Introduktion til undergang Doom-serien opstod i 90'erne efter frigivelsen af ​​den originale Doom. Det var et øjeblikkeligt hit, og fra den tid af har...
Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...
OpenTTD vs Simutrans
Oprettelse af din egen transportsimulering kan være sjovt, afslappende og ekstremt lokkende. Derfor skal du sørge for at prøve så mange spil som mulig...