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. Чтобы удалить ранее созданные файлы 1 и 2, просто выполните вызов «make clean».”

Листинг 1

все: e1 e2
e1:
прикоснуться к одному
e2:
коснуться двух
чистый:
пм один два

Запуск Make

Обычно вы пишете свой Makefile, а затем просто запускаете команду «make» или «make all» для сборки программного обеспечения и его компонентов. Все мишени построены в последовательном порядке и без распараллеливания. Общее время сборки - это сумма времени, необходимого для создания каждой отдельной цели.

Этот подход хорошо работает для небольших проектов, но занимает довольно много времени для средних и крупных проектов. Этот подход больше не актуален, поскольку большинство текущих процессоров оснащены более чем одним ядром и позволяют выполнять более одного процесса одновременно. Помня об этих идеях, мы рассмотрим, можно ли распараллелить процесс сборки и как это сделать. Цель состоит в том, чтобы просто сократить время сборки.

Внести улучшения

У нас есть несколько вариантов: 1) упростить код, 2) распределить отдельные задачи по разным вычислительным узлам, построить там код и собрать оттуда результат, 3) построить код параллельно на одной машине и 4) объедините варианты 2 и 3.

Вариант 1) не всегда просто. Это требует воли к анализу времени выполнения реализованного алгоритма и знаний о компиляторе, i.е., как компилятор переводит инструкции на языке программирования в инструкции процессора.

Вариант 2) требует доступа к другим вычислительным узлам, например, выделенным вычислительным узлам, неиспользуемым или менее используемым машинам, виртуальным машинам из облачных сервисов, таких как AWS, или арендованной вычислительной мощности из таких сервисов, как LoadTeam [5]. На самом деле такой подход используется для создания программных пакетов. Debian GNU / Linux использует так называемую сеть Autobuilder [17], а RedHat / Fedors использует Koji [18]. Google называет свою систему BuildRabbit, и это прекрасно объясняется в выступлении Айсылу Гринберг [16]. distcc [2] - это так называемый распределенный компилятор C, который позволяет компилировать код на разных узлах параллельно и настраивать собственную систему сборки.

Вариант 3 использует распараллеливание на локальном уровне. Это может быть вариант с наилучшим соотношением затрат и выгод для вас, поскольку он не требует дополнительного оборудования, как в варианте 2. Требование для параллельного запуска Make заключается в добавлении опции -j в вызов (сокращение от -jobs). Это указывает количество заданий, которые выполняются одновременно. В приведенном ниже листинге программа Make запускает 4 задания параллельно:

Листинг 2

$ make --jobs = 4

Согласно закону Амдала [23], это сократит время сборки почти на 50%. Имейте в виду, что этот подход хорошо работает, если отдельные цели не зависят друг от друга; например, выход цели 5 не требуется для построения цели 3.

Однако есть один побочный эффект: вывод сообщений о состоянии для каждой цели Make выглядит произвольно, и они больше не могут быть четко назначены цели. Порядок вывода зависит от фактического порядка выполнения задания.

Определить порядок выполнения

Есть ли утверждения, которые помогают Make понять, какие цели зависят друг от друга?? да! Пример Makefile в листинге 3 говорит следующее:

* чтобы создать цель «все», выполните инструкции для e1, e2 и e3

* цель e2 требует, чтобы цель e3 была построена раньше

Это означает, что цели e1 и e3 могут быть построены параллельно, сначала, затем следует e2, как только построение e3 будет завершено, и, наконец,.

Листинг 3

все: e1 e2 e3
e1:
прикоснуться к одному
e2: e3
коснуться двух
e3:
коснуться трех
чистый:
пм один два три

Визуализируйте зависимости Make

Умный инструмент make2graph из проекта makefile2graph [19] визуализирует зависимости Make в виде ориентированного ациклического графа. Это помогает понять, как разные цели зависят друг от друга. Make2graph выводит описания графиков в формате точек, которые можно преобразовать в изображение PNG с помощью команды точки из проекта Graphviz [22]. Звонок выглядит следующим образом:

Листинг 4

$ make all -Bnd | make2graph | точка -Tpng -o график.PNG

Во-первых, Make вызывается с целью «all», за которой следуют параметры «-B» для безоговорочного построения всех целей, «-n» (сокращение от «-dry-run») для имитации выполнения инструкций для каждой цели и « -d »(« -debug ») для отображения отладочной информации. Вывод передается в make2graph, который передает его вывод в точку, которая генерирует граф файла изображения.png в формате PNG.


График зависимости сборки для листинга 3

Другие компиляторы и системы сборки

Как уже объяснялось выше, Make был разработан более четырех десятилетий назад. С годами параллельное выполнение заданий становится все более важным, и с тех пор выросло количество специально разработанных компиляторов и систем сборки для достижения более высокого уровня распараллеливания. В список инструментов входят:

Большинство из них были разработаны с учетом распараллеливания и предлагают лучший результат в отношении времени сборки, чем Make.

Заключение

Как вы видели, стоит подумать о параллельных сборках, так как это значительно сокращает время сборки до определенного уровня. Тем не менее, добиться этого непросто, и в нем есть определенные подводные камни [3]. Перед переходом к параллельной сборке рекомендуется проанализировать как ваш код, так и путь его сборки.

Ссылки и ссылки

Как изменить направление прокрутки мыши и сенсорной панели в Windows 10
Мышь а также Сенсорная панельs не только упрощают вычисления, но и делают их более эффективными и требуют меньше времени. Мы не можем представить себе...
Как изменить указатель мыши и размер курсора, цвет и схему в Windows 10
Указатель мыши и курсор в Windows 10 - очень важные аспекты операционной системы. То же самое можно сказать и о других операционных системах, так что,...
Бесплатные движки с открытым исходным кодом для разработки игр для Linux
В этой статье будет рассмотрен список бесплатных игровых движков с открытым исходным кодом, которые можно использовать для разработки 2D- и 3D-игр в L...