GNU Make

Компилиране на код в паралел с помощта на Make

Компилиране на код в паралел с помощта на Make

Който и да попитате как правилно да изградите софтуер, ще излезе с 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 e2
e1:
докоснете едно
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 e3
e1:
докоснете едно
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 е разработен преди повече от четири десетилетия. С течение на годините паралелното изпълнение на работни места става все по-важно и оттогава броят на специално проектираните компилатори и изграждащи системи за постигане на по-високо ниво на паралелизация нараства. Списъкът с инструменти включва следните:

Повечето от тях са проектирани с мисъл за успоредяване и предлагат по-добър резултат по отношение на времето за изграждане от Make.

Заключение

Както видяхте, струва си да помислите за паралелни компилации, тъй като значително намалява времето за изграждане до определено ниво. Все пак не е лесно да се постигне и идва с определени клопки [3]. Препоръчително е да анализирате както вашия код, така и неговия път на компилация, преди да преминете към паралелни компилации.

Връзки и справки

Как да увеличите FPS в Linux?
FPS означава Кадри в секунда. Задачата на FPS е да измерва честотата на кадрите при възпроизвеждане на видео или игрални изпълнения. С прости думи бро...
Топ Oculus App Lab Games
Ако сте собственик на слушалки на Oculus, тогава трябва да знаете за странично зареждане. Sideloading е процесът на инсталиране на несъхранявано съдър...
Топ 10 игри за игра на Ubuntu
Платформата на Windows е една от доминиращите платформи за игри поради огромния процент игри, които се развиват днес, за да поддържат Windows. Може ли...