Който и да попитате как правилно да изградите софтуер, ще излезе с Make като един от отговорите. В системите GNU / Linux GNU Make [1] е версията с отворен код на оригиналния Make, издадена преди повече от 40 години - през 1976 г. Make работи с Makefile - структуриран обикновен текстов файл с това име, който може да бъде най-добре описан като ръководство за изграждане на процеса на изграждане на софтуер. Makefile съдържа редица етикети (наречени цели) и конкретните инструкции, необходими за изпълнението на всяка цел.
Просто казано, Make е инструмент за изграждане. Той следва рецептата на задачите от Makefile. Тя ви позволява да повтаряте стъпките по автоматичен начин, вместо да ги пишете в терминал (и вероятно да правите грешки, докато пишете).
Листинг 1 показва пример Makefile с двете цели „e1“ и „e2“, както и двете специални цели „all“ и „clean.”Изпълнявайки“ make e1 ”, се изпълняват инструкциите за целта“ e1 ”и се създава празната файлова. Изпълнението на „make e2“ прави същото за целта „e2“ и създава празен файл два. Извикването на „make all“ изпълнява първо инструкциите за целеви e1 и e2 следващи. За да премахнете създадените преди това файлове един и два, просто изпълнете повикването „make clean.”
Листинг 1
всички: e1 e2e1:
докоснете едно
e2:
докоснете две
чисто:
rm едно две
Стартиране на Make
Често срещаният случай е, че пишете вашия Makefile и след това просто изпълнявате командата „make“ или „make all“, за да изградите софтуера и неговите компоненти. Всички цели са построени в последователен ред и без никакво успоредяване. Общото време за изграждане е сумата от времето, необходимо за изграждането на всяка една цел.
Този подход работи добре за малки проекти, но отнема доста време за средни и по-големи проекти. Този подход вече не е актуален, тъй като повечето от текущите процесори са оборудвани с повече от едно ядро и позволяват изпълнението на повече от един процес наведнъж. Имайки предвид тези идеи, ние разглеждаме дали и как процесът на изграждане може да бъде паралелизиран. Целта е просто да се намали времето за изграждане.
Направете подобрения
Има няколко опции, които имаме - 1) опростяване на кода, 2) разпределяне на отделните задачи върху различни изчислителни възли, изграждане на кода там и събиране на резултата от там, 3) изграждане на кода паралелно на една машина и 4) комбинирайте опции 2 и 3.
Вариант 1) не винаги е лесен. Изисква воля за анализ на времето на изпълнение на внедрения алгоритъм и знания за компилатора, т.е.д., как компилаторът превежда инструкциите на езика за програмиране в инструкции на процесора.
Вариант 2) изисква достъп до други изчислителни възли, например специални изчислителни възли, неизползвани или по-малко използвани машини, виртуални машини от облачни услуги като AWS или наета изчислителна мощност от услуги като LoadTeam [5]. В действителност този подход се използва за изграждане на софтуерни пакети. Debian GNU / Linux използва така наречената мрежа Autobuilder [17], а RedHat / Fedors използва Koji [18]. Google нарича своята система BuildRabbit и е отлично обяснена в беседата на Aysylu Greenberg [16]. distcc [2] е така наречения разпределен C компилатор, който ви позволява да компилирате код на различни възли паралелно и да настроите собствена система за изграждане.
Вариант 3 използва паралелизация на местно ниво. Това може да е опцията с най-доброто съотношение разходи-ползи за вас, тъй като не изисква допълнителен хардуер, както при опция 2. Изискването за паралелно изпълнение на Make е добавянето на опцията -j в повикването (съкращение от -jobs). Това указва броя на заданията, които се изпълняват едновременно. Списъкът по-долу иска да се направи, за да се изпълняват паралелно 4 работни места:
Листинг 2
$ make --jobs = 4Според закона на Амдал [23], това ще намали времето за изграждане с близо 50%. Имайте предвид, че този подход работи добре, ако отделните цели не зависят една от друга; например изходът на цел 5 не се изисква за изграждане на цел 3.
Има обаче един страничен ефект: изходът на съобщенията за състоянието за всяко направяне на цел изглежда произволно и те вече не могат да бъдат ясно присвоени на цел. Изходният ред зависи от действителния ред на изпълнение на заданието.
Определете Изпълнение на заповед
Има ли изявления, които помагат да се направи разбиране кои цели зависят една от друга? Да! Примерът Makefile в листинг 3 казва това:
* за да изградите целеви „всички“, изпълнете инструкциите за e1, e2 и e3
* target e2 изисква target e3 да бъде изграден преди
Това означава, че целите e1 и e3 могат да бъдат изградени паралелно, първо, след това e2 следва веднага след завършването на изграждането на e3, накрая.
Листинг 3
всички: e1 e2 e3e1:
докоснете едно
e2: e3
докоснете две
e3:
докоснете три
чисто:
rm едно две три
Визуализирайте Направете зависимости
Умният инструмент make2graph от проекта makefile2graph [19] визуализира Make Make зависимостите като насочена ациклична графика. Това помага да се разбере как различните цели зависят една от друга. Make2graph извежда описания на графики в точков формат, които можете да трансформирате в PNG изображение, използвайки точката команда от проекта Graphviz [22]. Обаждането е както следва:
Листинг 4
$ make all -Bnd | make2graph | точка -Tpng -o графика.pngПърво, Make се извиква с целта „всички“, последвана от опциите „-B“ за безусловно изграждане на всички цели, „-n“ (съкратено от „-dry-run“), за да се преструва, че изпълнява инструкциите за цел, и „ -d ”(„ -debug ”) за показване на информация за отстраняване на грешки. Изходът се подава към make2graph, който насочва изхода му към точка, която генерира графиката на графичния файл.png във формат PNG.
Графиката на графика на зависимост за списъка 3
Още компилатори и системи за изграждане
Както вече беше обяснено по-горе, Make е разработен преди повече от четири десетилетия. С течение на годините паралелното изпълнение на работни места става все по-важно и оттогава броят на специално проектираните компилатори и изграждащи системи за постигане на по-високо ниво на паралелизация нараства. Списъкът с инструменти включва следните:
- Базел [20]
- CMake [4]: съкращава междуплатформената марка и създава описателни файлове, използвани по-късно от Make
- distmake [12]
- Система за разпределена марка (DMS) [10] (изглежда мъртва)
- dmake [13]
- LSF марка [15]
- Apache Maven
- Мезон
- Ninja Build
- NMake [6]: Направете за Microsoft Visual Studio
- PyDoit [8]
- Qmake [11]
- повторно [14]
- SCons [7]
- Waf [9]
Повечето от тях са проектирани с мисъл за успоредяване и предлагат по-добър резултат по отношение на времето за изграждане от Make.
Заключение
Както видяхте, струва си да помислите за паралелни компилации, тъй като значително намалява времето за изграждане до определено ниво. Все пак не е лесно да се постигне и идва с определени клопки [3]. Препоръчително е да анализирате както вашия код, така и неговия път на компилация, преди да преминете към паралелни компилации.
Връзки и справки
- [1] GNU Make Manual: Паралелно изпълнение, https: // www.gnu.org / software / make / manual / html_node / Parallel.html
- [2] distcc: https: // github.com / distcc / distcc
- [3] Джон Греъм-Къминг: Капаните и ползите от GNU правят паралелизация, https: // www.cmcrossroads.com / article / pitfalls-and-benefit-gnu-make-paralelization
- [4] CMake, https: // cmake.организация /
- [5] LoadTeam, https: // www.loadteam.com /
- [6] NMake, https: // docs.Microsoft.com / en-us / cpp / build / reference / nmake-reference?изглед = msvc-160
- [7] SCons, https: // www.кифли.организация /
- [8] PyDoit, https: // pydoit.организация /
- [9] Waf, https: // gitlab.com / ita1024 / waf /
- [10] Система за разпределена марка (DMS), http: // www.нонгну.org / dms / index.html
- [11] Qmake, https: // doc.qt.io / qt-5 / qmake-manual.html
- [12] distmake, https: // sourceforge.net / projects / distmake /
- [13] dmake, https: // docs.оракул.com / cd / E19422-01 / 819-3697 / dmake.html
- [14] повторно, https: // повторно.readthedocs.io / bg / най-новите /
- [15] LSF Make, http: // sunray2.мит.edu / kits / platform-lsf / 7.0.6/1 / guides / kit_lsf_guide_source / print / lsf_make.pdf
- [16] Aysylu Greenberg: Изграждане на разпределена система за изграждане в Google Scale, GoTo Conference 2016, https: // gotocon.com / dl / goto-chicago-2016 / slides / AysyluGreenberg_BuildingADistributedBuildSystemAtGoogleScale.pdf
- [17] Debian Build System, Autobuilder network, https: // www.debian.org / devel / buildd / index.бр.html
- [18] koji - система за изграждане и проследяване на RPM, https: // pagure.io / koji /
- [19] makefile2graph, https: // github.com / lindenb / makefile2graph
- [20] Базел, https: // базел.изграждане /
- [21] Урок за Makefile, https: // makefiletutorial.com /
- [22] Graphviz, http: // www.graphviz.орг
- [23] Законът на Амдал, Уикипедия, https: // en.wikipedia.org / wiki / Amdahl% 27s_law