GNU Make

Kompilera kod parallellt med Make

Kompilera kod parallellt med Make

Vem du än frågar hur du bygger programvara ordentligt kommer med Make som ett av svaren. På GNU / Linux-system är GNU Make [1] den öppna källkodsversionen av originalet Make som släpptes för mer än 40 år sedan - 1976. Gör arbeten med en Makefile - en strukturerad ren textfil med det namnet som bäst kan beskrivas som bygghandboken för programvarubyggningsprocessen. Makefilen innehåller ett antal etiketter (kallade mål) och de specifika instruktioner som krävs för att bygga varje mål.

Enkelt sagt är Make ett byggverktyg. Den följer receptet från uppgifter från Makefile. Det låter dig upprepa stegen automatiskt snarare än att skriva dem i en terminal (och förmodligen göra misstag när du skriver).

Listning 1 visar ett exempel på Makefile med de två målen "e1" och "e2" samt de två specialmålen "alla" och "rena.”Kör“ make e1 ”kör instruktionerna för mål“ e1 ”och skapar en tom fil. Att köra "make e2" gör detsamma för mål "e2" och skapar den tomma filen två. Samtalet "make all" utför instruktionerna för mål e1 först och e2 nästa. För att ta bort de tidigare skapade filerna en och två, helt enkelt genomföra samtalet "gör rent.”

Listning 1

alla: e1 e2
e1:
tryck på en
e2:
tryck på två
rena:
rm en två

Running Make

Det vanliga fallet är att du skriver din Makefile och sedan bara kör kommandot "make" eller "make all" för att bygga programvaran och dess komponenter. Alla mål är byggda i serieordning och utan någon parallellisering. Den totala byggtiden är summan av tiden som krävs för att bygga varje enskilt mål.

Detta tillvägagångssätt fungerar bra för små projekt men tar ganska lång tid för medelstora och större projekt. Detta tillvägagångssätt är inte längre uppdaterat eftersom de flesta av de nuvarande cpusen är utrustade med mer än en kärna och möjliggör körning av mer än en process åt gången. Med dessa idéer i åtanke tittar vi på huruvida och hur byggprocessen kan parallelliseras. Målet är att helt enkelt minska byggtiden.

Gör förbättringar

Det finns några alternativ vi har - 1) förenkla koden, 2) distribuera de enskilda uppgifterna på olika datanoder, bygg koden där och samla resultatet därifrån, 3) bygg koden parallellt på en enda maskin och 4) kombinera alternativ 2 och 3.

Alternativ 1) är inte alltid lätt. Det kräver viljan att analysera körtiden för den implementerade algoritmen och kunskap om kompilatorn, dvs.e., hur översätter kompilatorn instruktionerna på programmeringsspråket till processorinstruktioner.

Alternativ 2) kräver åtkomst till andra datanoder, till exempel dedikerade datanoder, oanvända eller mindre använda maskiner, virtuella maskiner från molntjänster som AWS eller hyrd datorkraft från tjänster som LoadTeam [5]. I verkligheten används denna metod för att bygga programvarupaket. Debian GNU / Linux använder det så kallade Autobuilder-nätverket [17], och RedHat / Fedors använder Koji [18]. Google kallar sitt system BuildRabbit och förklaras perfekt i föredraget av Aysylu Greenberg [16]. distcc [2] är en så kallad distribuerad C-kompilator som låter dig kompilera kod på olika noder parallellt och ställa in ditt eget byggsystem.

Alternativ 3 använder parallellisering på lokal nivå. Detta kan vara alternativet med det bästa kostnads-nyttoförhållandet för dig, eftersom det inte kräver ytterligare hårdvara som i alternativ 2. Kravet att köra Make parallellt är att lägga till alternativet -j i samtalet (kort för -jobb). Detta anger antalet jobb som körs samtidigt. Listan nedan ber att göra för att köra fyra jobb parallellt:

Listning 2

$ make --jobb = 4

Enligt Amdahls lag [23] kommer detta att minska byggtiden med nästan 50%. Tänk på att detta tillvägagångssätt fungerar bra om de enskilda målen inte är beroende av varandra. till exempel krävs inte utgången från mål 5 för att bygga mål 3.

Det finns dock en bieffekt: utsignalen från statusmeddelandena för varje Make-mål verkar godtyckligt och dessa kan inte längre tydligt tilldelas ett mål. Utgångsbeställningen beror på den faktiska ordningen på jobbet.

Definiera Make Execution Order

Finns det uttalanden som hjälper dig att förstå vilka mål som beror på varandra? Ja! Exemplet Makefile i Listing 3 säger detta:

* för att bygga målet "alla", kör instruktionerna för e1, e2 och e3

* mål e2 kräver att mål e3 byggs tidigare

Detta innebär att målen e1 och e3 kan byggas parallellt, först, sedan följer e2 så snart byggnaden av e3 är klar, slutligen.

Listning 3

alla: e1 e2 e3
e1:
tryck på en
e2: e3
tryck på två
e3:
tryck på tre
rena:
rm en två tre

Visualisera Make Dependencies

Det smarta verktyget make2graph från makefile2graph [19] -projektet visualiserar Make-beroenden som en riktad acyklisk graf. Detta hjälper till att förstå hur de olika målen beror på varandra. Make2graph matar ut grafbeskrivningar i punktformat som du kan förvandla till en PNG-bild med hjälp av punktkommandot från Graphviz-projektet [22]. Samtalet är som följer:

Listning 4

$ gör alla -Bind | make2graph | punkt -Tpng -o graf.png

För det första kallas Make med målet "allt" följt av alternativen "-B" för att villkorslöst bygga alla mål, "-n" (förkortning för "-tork-kör") för att låtsas köra instruktionerna per mål, och " -d ”(“ -debug ”) för att visa felsökningsinformation. Utgången är piped för att göra2graph som rör dess utdata till punkt som genererar bildfilgrafen.png i PNG-format.


Byggberoende diagram för listning 3

Fler kompilatorer och byggsystem

Som redan förklarats ovan utvecklades Make för mer än fyra decennier sedan. Genom åren har utförande av jobb parallellt blivit allt viktigare och antalet specialdesignade kompilatorer och byggsystem för att uppnå en högre nivå av parallellisering har ökat sedan dess. Listan över verktyg innehåller dessa:

De flesta av dem har utformats med tanke på parallellisering och ger ett bättre resultat vad gäller byggtid än Make.

Slutsats

Som du har sett är det värt att tänka på parallella byggnader eftersom det avsevärt minskar byggtiden upp till en viss nivå. Ändå är det inte lätt att uppnå och kommer med vissa fallgropar [3]. Det rekommenderas att analysera både din kod och dess byggväg innan du går in i parallella byggnader.

Länkar och referenser

Hur man utvecklar ett spel på Linux
För ett decennium sedan skulle inte många Linux-användare förutsäga att deras favoritoperativsystem en dag skulle vara en populär spelplattform för ko...
Portar med öppen källkod för kommersiella spelmotorer
Gratis, öppen källkod och plattformsmekaniska rekreationer kan användas för att spela gamla såväl som några av de ganska senaste speltitlarna. I den h...
Bästa kommandoradsspel för Linux
Kommandoraden är inte bara din största allierade när du använder Linux, det kan också vara källan till underhållning eftersom du kan använda den för a...