GNU Make

Kód fordítása párhuzamosan a Make használatával

Kód fordítása párhuzamosan a Make használatával

Akitől megkérdezzük, hogyan kell megfelelő módon felépíteni a szoftvert, az a válaszok egyikeként előállítja a Make-t. GNU / Linux rendszereken a GNU Make [1] az eredeti Make több mint 40 éve - 1976-ban - kiadott nyílt forráskódú változata. Készítsen munkát egy Makefile segítségével - egy ilyen nevű strukturált sima szövegfájl, amely a szoftverépítési folyamat építési kézikönyveként jellemezhető a legjobban. A Makefile számos címkét (ún. Célokat) és az egyes célok felépítéséhez végrehajtandó specifikus utasításokat tartalmaz.

Egyszerűen szólva a Make egy építési eszköz. Ez a Makefile feladatok receptjét követi. Lehetővé teszi, hogy automatizált módon ismételje meg a lépéseket, ahelyett, hogy gépbe írja őket (és valószínűleg hibázna gépelés közben).

Az 1. felsorolás egy példát mutat be a Makefile-re a két „e1” és „e2” céllal, valamint a két speciális „all” és „clean” céllal.”A„ make e1 ”futtatása végrehajtja az„ e1 ”célra vonatkozó utasításokat, és létrehozza az üres fájlt. A „make e2” futtatása ugyanezt teszi az „e2” célnál, és létrehozza az üres kettő fájlt. A „mindet” hívás hajtja végre az e1 cél és az e2 cél utasításait. A korábban létrehozott első és második fájl eltávolításához egyszerűen hajtsa végre a „make clean.”

1. felsorolás

mind: e1 e2
e1:
érintse meg az egyiket
e2:
kettőt érint
tiszta:
rm egy kettő

Futó Make

Gyakori eset, hogy megírja a Makefile fájlt, majd csak futtatja a „make” vagy „make all” parancsot a szoftver és annak összetevőinek felépítéséhez. Az összes célpont soros sorrendben és párhuzamosítás nélkül készül. A teljes építési idő az az idő összege, amely minden egyes cél megépítéséhez szükséges.

Ez a megközelítés jól működik kis projektek esetében, de közepes és nagyobb projekteknél meglehetősen hosszú. Ez a megközelítés már nem naprakész, mivel a jelenlegi CPU-k többsége egynél több maggal van ellátva, és egyszerre több folyamat végrehajtását teszi lehetővé. Ezeket az ötleteket szem előtt tartva megvizsgáljuk, hogy az építési folyamat párhuzamos-e és hogyan. A cél az építési idő egyszerű csökkentése.

Fejlesztések

Néhány lehetőségünk van: 1) egyszerűsítjük a kódot, 2) elosztjuk az egyes feladatokat különböző számítási csomópontokra, ott felépítjük a kódot, és onnan összegyűjtjük az eredményt, 3) párhuzamosan építjük a kódot egyetlen gépre, és 4) kombinálja a 2. és a 3. lehetőséget.

Az 1. lehetőség) nem mindig könnyű. Szüksége van a megvalósított algoritmus futási idejének elemzésére és a fordítóval kapcsolatos ismeretekre, azaz.e., hogyan fordítja le a fordító a programozási nyelv utasításait processzor utasításokra.

2. lehetőség) hozzáférést igényel más számítási csomópontokhoz, például dedikált számítási csomópontokhoz, használaton kívüli vagy kevésbé használt gépekhez, virtuális gépekhez felhőszolgáltatásokból, például AWS-től, vagy bérelt számítási teljesítményhez olyan szolgáltatásoktól, mint a LoadTeam [5]. A valóságban ezt a megközelítést használják szoftvercsomagok készítésére. A Debian GNU / Linux az úgynevezett Autobuilder hálózatot [17], a RedHat / Fedors pedig a Kojit használja [18]. A Google BuildRabbit-nek hívja a rendszerét, és Aysylu Greenberg beszédében tökéletesen elmagyarázza [16]. A distcc [2] egy úgynevezett elosztott C fordító, amely lehetővé teszi, hogy párhuzamosan fordítson kódokat különböző csomópontokra és beállítsa saját build rendszerét.

A 3. lehetőség helyi szinten párhuzamosítást használ. Lehet, hogy ez az opció az Ön számára a legjobb költség-haszon arány mellett, mivel nem igényel további hardvert, mint a 2. opcióban. A Make párhuzamos futtatásának követelménye a -j opció hozzáadása a híváshoz (röviden -jobs). Ez adja meg az egyszerre futtatott feladatok számát. Az alábbi felsorolás azt kéri a Make-től, hogy 4 feladatot futtasson párhuzamosan:

2. felsorolás

$ make --jobs = 4

Amdahl törvénye szerint [23] ez csaknem 50% -kal csökkenti az építési időt. Ne feledje, hogy ez a megközelítés jól működik, ha az egyes célok nem függnek egymástól; például az 5. cél kimenete nem szükséges a 3. cél felépítéséhez.

Van azonban egy mellékhatása: az állapotüzenetek kimenete minden Make célhoz tetszőlegesnek tűnik, és ezeket már nem lehet egyértelműen hozzárendelni egy célhoz. A kimeneti sorrend a munka végrehajtásának tényleges sorrendjétől függ.

Határozza meg a Végrehajtási sorrend megadását

Vannak-e olyan állítások, amelyek segítenek abban, hogy megértsék, mely célok függnek egymástól? Igen! A 3. listában szereplő Makefile példa ezt mondja:

* az „all” cél összeállításához futtassa az e1, e2 és e3 utasításokat

* Az e2 célhoz az e3 cél megépítése szükséges

Ez azt jelenti, hogy először az e1 és az e3 célokat lehet párhuzamosan felépíteni, majd e2 következik, amint elkészül az e3 építése, végül.

3. felsorolás

mind: e1 e2 e3
e1:
érintse meg az egyiket
e2: e3
kettőt érint
e3:
érintse meg a hármat
tiszta:
rm egy kettő három

Vizualizálja a Készítsen függőségeket

A makefile2graph [19] projekt okos make2graph eszköze a Make függőségeket irányított aciklikus gráfként jeleníti meg. Ez segít megérteni, hogy a különböző célok hogyan függnek egymástól. A Make2graph pont formátumú grafikonleírásokat ad ki, amelyeket PNG képpé alakíthat át a Graphviz projekt dot parancsával [22]. A hívás a következő:

4. felsorolás

$ mindent csinál -Bnd | make2graph | pont -Tpng -o grafikon.png

Először is, a Make-t az „all” céllal hívják meg, majd a „-B” opcióval feltétel nélkül felépítik az összes célt, a „-n” (rövidítve: „-dry-run”) úgy tesz, mintha az utasításokat célonként futtatnák, és „ -d ”(“ -debug ”) a hibakeresési információk megjelenítéséhez. A kimenetet a make2graph-hoz csatolják, amely kimenetét ponttá vezeti, amely létrehozza a képfájl grafikont.png PNG formátumban.


A 3. lista felépítésének függőségi grafikonja

További fordítók és build rendszerek

Mint már fentebb kifejtettük, a Make-t több mint négy évtizeddel ezelőtt fejlesztették ki. Az évek során a munkák párhuzamos végrehajtása egyre fontosabbá vált, és azóta nőtt a speciálisan tervezett fordítók és építő rendszerek száma a magasabb szintű párhuzamosság elérése érdekében. Az eszközök listája a következőket tartalmazza:

Legtöbbjüket a párhuzamosítás szem előtt tartásával tervezték, és jobb eredményt kínálnak a gyártási idő tekintetében, mint a Make.

Következtetés

Mint látta, érdemes gondolkodni a párhuzamos építésen, mivel ez jelentősen lerövidíti az elkészítési időt egy bizonyos szintig. Ennek ellenére nem könnyű megvalósítani, és bizonyos buktatókkal jár [3]. Javasoljuk, hogy a párhuzamos buildekbe lépés előtt elemezze mind a kódját, mind annak összeállítási útját.

Linkek és hivatkozások

Hogyan lehet rögzíteni és streamelni a játékmenetét Linuxon
Korábban a játékokat csak hobbinak tekintették, de az idő múlásával a játékipar hatalmas növekedést ért el a technológia és a játékosok száma szempont...
A legjobb játékok kézi követéssel
Az Oculus Quest nemrégiben bemutatta a vezérlés nélküli kézi követés nagyszerű ötletét. Az egyre növekvő számú játékkal és tevékenységgel, amelyek tám...
Az OSD-fedvény megjelenítése teljes képernyős Linux-alkalmazásokban és játékokban
Teljes képernyős játékok lejátszása vagy alkalmazások figyelemelterelés nélküli, teljes képernyős módban történő használata elvághatja a panelen vagy ...