2013-04-01 4 views
1

Представьте, что у вас есть файл make с подкаталогами, которые будут созданы с помощью «make -c». У вас есть 4 целевых каталога. 3 из 4 выполняются, 1 нужно запустить. Вы бежите общую Makefile с:makefile с несколькими заданиями -j и подкаталогами

 
make -j 4 

Есть ли способ, чтобы сообщить системе Makefile для выполнения оставшейся цели с указанием марки -c -j 4, а не только 1? Если две цели будут отсутствовать, я бы хотел сделать -c -j 2 для каждого.

ответ

3

Я расскажу о правильном ответе Беты. Все индивидуальные процессы процесса взаимодействуют друг с другом и гарантируют, что никогда не будет больше N заданий, выполняемых во всех разных make invocations, когда вы используете -jN. В то же время они всегда гарантируют, что (при условии, что по крайней мере N заданий, которые могут быть запущены во всех make-вызовах), всегда будут выполняться N заданий.

Предположим, что у вас было 4 каталога с «чем заняться», которые каким-то образом вы могли бы знать априори, и поэтому вместо вызова одного экземпляра make с помощью -j4 и позволяющего сделать так, чтобы они вызывали 4 подпрограммы в обычном режиме, из заявлений, которые должны быть вызваны с -j1. Теперь предположим, что в первом каталоге было 10 целей, устаревших, второе - 5, третье - 20, а четвертое - 100 устаревших целей. Сначала у вас работает 4 задания параллельно. Затем, когда будут созданы 5 целей второго каталога, у вас будет только 3 задания, которые будут выполняться параллельно, а затем 2, а затем для остальной части четвертого каталога вы будете иметь только одну цель, которая будет построена за раз и не будет параллелизма. Это намного меньше.

Как работает GNU, вместо этого общаются все четыре экземпляра make. Когда второй каталог завершен, выполняемые задания доступны для других каталогов и т. Д. К концу сборки четвертый каталог одновременно создает четыре задания. Это намного больше.

Возможно, если вы объясните , почему вы хотите это сделать, было бы более полезно для нас в построении ответа.

+0

В последнем предложении говорится все. Единственные места, где я вижу людей, имеющих проблемы с параллельным оформлением, - это плохо определенные make-файлы. Если makefile хорошо определен, make не будет делать ошибок и будет работать оптимально; то есть нет способа, чтобы при заданном N была лучшая стратегия, чем та, которую в настоящее время используют make. – rioki

1

Сделать ручки, которые автоматически. От the manual:

Если вы установите [-j] для некоторого числового значения «N» и вашей операционной системы поддерживает его ... родитель сделать и все суб-марки будет связываться для того, чтобы есть только «N» работают одновременно с между ними.

+0

Возможно, мой вопрос был не ясен. Я знаю, что не будет больше -j рабочих мест. Мой вопрос в том, что если есть одна цель, я хочу сделать -j 4 на этом, две цели составляют -j 2 на каждый, 4 цели, make -j 1 на каждый ... – madreblu

+1

Нет, вы не можете этого сделать. Прежде всего, как узнать, какие каталоги являются актуальными и какие еще нужно делать? Он не может знать, пока он не вызывает make в подкаталоге, и к тому времени уже слишком поздно. Во-вторых, почему это было бы полезно? Фактически, выполнение того, что вы просите, уменьшит общий объем распараллеливания, которого вы могли бы достичь, поскольку может быть, что в первом каталоге был только один файл для сборки, а у второго - 100 файлов для сборки: теперь второй каталог может строить по одному, пока первый каталог не работает. – MadScientist

+0

Уменьшить? Как можно вызвать make -j 2 вместо make -j 1 уменьшить распараллеливание? Могут ли быть подобные make-структуры? – madreblu

Смежные вопросы