частичная параллельная и последовательная компиляция с make - PullRequest
0 голосов
/ 07 октября 2019

Я компилирую llvm с make. Когда я выполняю параллельную компиляцию, мне не хватает оперативной памяти на этапах компоновки. Возможна ли параллельная компиляция для всех объектных файлов и последовательная компиляция на этапе компоновки? На данный момент остановите компиляцию, когда моя машина начнет замену, и просто перезапустите процесс сборки с помощью make -j1, было бы замечательно, если бы это можно было сделать без взаимодействия с человеком.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Если потребление памяти каким-либо образом коррелирует с нагрузкой, вы можете ограничить make, чтобы учесть нагрузку с опцией -l. Соответствующая документация :

Когда система сильно загружена, вы, вероятно, захотите выполнить меньше заданий, чем при небольшой загрузке. Вы можете использовать опцию '-l', чтобы указать make, чтобы ограничить число одновременно выполняемых заданий на основе средней нагрузки. За параметром '-l' или '--max-load' следует число с плавающей запятой.

Это может или не может помочь в вашем случае, но это может стоить проверить.

0 голосов
/ 07 октября 2019

Мне неизвестна какая-либо реализация make, которая динамически адаптирует степень параллелизма в соответствии с потреблением ресурсов. Действительно, хотя в некоторой степени существует потенциал для этого, проблема не может быть решена на make, поскольку потребление ресурсов процессами не является статичным. То есть make может предположительно наблюдать, скажем, что физическая ОЗУ была перегружена, и реагировать, сдерживая запуск новых дочерних процессов, но он не может легко защитить от запуска нескольких дочерних процессов, пока потребление ресурсов низкое, что затем приводит ктребует больше ресурсов, чем доступно.

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

make -j4 object1.o object2.o object3.o object4.o
make

Хотя это довольно громоздко. Предположим, что существует цель (или вы можете ее создать), которая представляет все объектные файлы, но не какие-либо из связанных библиотек / исполняемых файлов, тогда вы можете использовать это:

Makefile

OBJECTS = object1.o object2.o object3.o object4.o

all: my_program

my_program: objects
        # ...

# This target collects all the objects:
objects: $(OBJECTS)

.PHONY: all objects

Командная строка

make -j4 objects
make
...