GNU Make

Kompilace kódu paralelně pomocí Make

Kompilace kódu paralelně pomocí Make

Kdokoli se zeptáte, jak správně sestavit software, přijde jako jedna z odpovědí na Make. V systémech GNU / Linux je GNU Make [1] verzí Open-source původní verze Make, která byla vydána před více než 40 lety - v roce 1976. Make works with a Makefile - a structured plain text file with that name that can be best mentioned as the construction manual for the software building process. Makefile obsahuje řadu štítků (nazývaných cíle) a specifické pokyny, které je třeba provést k sestavení každého cíle.

Jednoduše řečeno, Make je nástroj pro sestavení. Následuje recept na úkoly z Makefile. Umožňuje vám opakovat kroky automatizovaným způsobem, místo aby jste je psali do terminálu (a pravděpodobně při psaní děláte chyby).

Výpis 1 ukazuje příklad Makefile se dvěma cíli „e1“ a „e2“ a také se dvěma speciálními cíli „all“ a „clean“.„Spuštěním příkazu„ make e1 “se provedou pokyny pro cíl„ e1 “a vytvoří se prázdný soubor. Spuštění příkazu „make e2“ provede totéž pro cíl „e2“ a vytvoří prázdný soubor dva. Volání „make all“ provede pokyny pro cíl e1 jako první a e2 pro další. Chcete-li odstranit dříve vytvořené soubory jedna a dvě, jednoduše proveďte volání „make clean.“

Výpis 1

vše: e1 e2
e1:
dotkněte se jednoho
e2:
dotkni se dvou
čistý:
rm jedna dvě

Běžící značka

Běžným případem je, že napíšete svůj Makefile a poté stačí spustit příkaz „make“ nebo „make all“ pro sestavení softwaru a jeho komponent. Všechny cíle jsou postaveny v sériovém pořadí a bez jakékoli paralelizace. Celková doba sestavení je součet času potřebného k sestavení každého jednotlivého cíle.

Tento přístup funguje dobře pro malé projekty, ale pro střední a větší projekty trvá poměrně dlouho. Tento přístup již není aktuální, protože většina současných cpus je vybavena více než jedním jádrem a umožňuje provádění více než jednoho procesu najednou. S ohledem na tyto myšlenky se podíváme na to, zda a jak lze proces sestavení paralelizovat. Cílem je jednoduše zkrátit dobu sestavení.

Proveďte vylepšení

Existuje několik možností, které máme - 1) zjednodušit kód, 2) distribuovat jednotlivé úkoly na různé výpočetní uzly, vytvořit kód tam a shromáždit výsledek odtud, 3) vytvořit kód paralelně na jednom počítači a 4) kombinujte možnosti 2 a 3.

Možnost 1) není vždy snadná. Vyžaduje to vůli analyzovat běh implementovaného algoritmu a znalosti o kompilátoru, tj.E., jak překladač překládá instrukce v programovacím jazyce do instrukcí procesoru.

Možnost 2) vyžaduje přístup k dalším výpočetním uzlům, například vyhrazeným výpočetním uzlům, nepoužívaným nebo méně používaným strojům, virtuálním strojům z cloudových služeb, jako je AWS, nebo pronajatému výpočetnímu výkonu od služeb, jako je LoadTeam [5]. Ve skutečnosti se tento přístup používá k vytváření softwarových balíčků. Debian GNU / Linux používá takzvanou síť Autobuilder [17] a RedHat / Fedors používá Koji [18]. Google nazývá svůj systém BuildRabbit a je dokonale vysvětlen v přednášce Aysylu Greenberg [16]. distcc [2] je takzvaný distribuovaný kompilátor C, který umožňuje paralelní kompilaci kódu na různých uzlech a nastavení vlastního sestavovacího systému.

Možnost 3 používá paralelizaci na místní úrovni. Může to být volba s nejlepším poměrem nákladů a přínosů, protože nevyžaduje další hardware jako v možnosti 2. Požadavek na paralelní spuštění Make je přidání volby -j do hovoru (zkratka pro -jobs). Určuje počet úloh, které jsou spuštěny současně. Níže uvedený seznam požaduje, aby bylo možné spustit paralelně 4 úlohy:

Výpis 2

$ make --jobs = 4

Podle Amdahlova zákona [23] to zkrátí dobu výstavby o téměř 50%. Mějte na paměti, že tento přístup funguje dobře, pokud jednotlivé cíle na sobě nezávisí; například výstup cíle 5 není vyžadován k vytvoření cíle 3.

Existuje však jeden vedlejší efekt: výstup stavových zpráv pro každý Make target se zdá být libovolný a tyto již nelze jasně přiřadit k cíli. Pořadí výstupu závisí na skutečném pořadí provádění úlohy.

Definujte Provést příkaz k provedení

Existují tvrzení, která pomáhají pochopit, které cíle na sobě závisí? Ano! Příklad Makefile ve výpisu 3 říká toto:

* Chcete-li vytvořit cíl „vše“, postupujte podle pokynů pro e1, e2 a e3

* Terč e2 vyžaduje, aby byl terč e3 postaven dříve

To znamená, že cíle e1 a e3 lze stavět paralelně, nejdříve, poté následuje e2, jakmile je stavba e3 dokončena, nakonec.

Výpis 3

vše: e1 e2 e3
e1:
dotkněte se jednoho
e2: e3
dotkni se dvou
e3:
dotkněte se tří
čistý:
rm jedna dva tři

Vizualizujte Make Dependencies

Chytrý nástroj make2graph z projektu makefile2graph [19] vizualizuje vytváření závislostí jako směrovaný acyklický graf. To pomáhá pochopit, jak různé cíle na sobě závisí. Make2graph vydává popisy grafů ve formátu bodů, které můžete převést na obrázek PNG pomocí příkazu tečka z projektu Graphviz [22]. Hovor je následující:

Výpis 4

$ make all -Bnd | make2graph | dot -Tpng -o graf.png

Nejprve je vyvolán Make s cílem „all“, následovaný možnostmi „-B“, které bezpodmínečně vytvoří všechny cíle, „-n“ (zkratka pro „-dry-run“), aby předstíral spuštění pokynů pro každý cíl, a „ -d ”(“ -debug ”) pro zobrazení informací o ladění. Výstup je směrován na make2graph, který spojuje svůj výstup s tečkou, která generuje grafický soubor obrázku.png ve formátu PNG.


Graf závislosti sestavení pro výpis 3

Více překladačů a sestavovacích systémů

Jak již bylo vysvětleno výše, Make byl vyvinut před více než čtyřmi desetiletími. V průběhu let se paralelní provádění úloh stalo stále důležitějším a od té doby vzrostl počet speciálně navržených překladačů a sestavovacích systémů pro dosažení vyšší úrovně paralelizace. Seznam nástrojů zahrnuje tyto:

Většina z nich byla navržena s ohledem na paralelizaci a nabízí lepší výsledek ohledně doby sestavení než Make.

Závěr

Jak jste viděli, stojí za to přemýšlet o paralelních sestaveních, protože významně snižuje čas sestavení až na určitou úroveň. Přesto to není snadné dosáhnout a přichází s určitými nástrahami [3]. Před vstupem do paralelních sestav se doporučuje analyzovat váš kód i cestu jeho sestavení.

Odkazy a reference

Hry Výukový program OpenTTD
Výukový program OpenTTD
OpenTTD je jednou z nejpopulárnějších her pro obchodní simulaci. V této hře musíte vytvořit skvělé dopravní podnikání. Začnete však na začátku kolem r...
Hry SuperTuxKart pro Linux
SuperTuxKart pro Linux
SuperTuxKart je skvělý titul navržený tak, aby vám ve vašem systému Linux přinesl zážitek Mario Kart zdarma. Je to docela náročné a zábavné hrát, je n...
Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
The Battle for Wesnoth je jednou z nejpopulárnějších strategických her s otevřeným zdrojovým kódem, které si v tuto chvíli můžete zahrát. Tato hra se ...