make: отключить параллельное выполнение некоторых целей - PullRequest
4 голосов
/ 22 августа 2011

У меня есть работа по компиляции, где связывание требует много работы ввода-вывода. У нас около дюжины ядер, поэтому мы запускаем make -j13, но когда дело доходит до связывания 6 целей, я бы хотел, чтобы они выполнялись циклически. Я думал о том, чтобы сделать одну зависимость от другой, но я думаю, что это сломает отдельные цели. Есть идеи, как решить эту маленькую проблему?

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

make сам по себе не предоставляет механизм для запроса «N из них, но не более M из них одновременно».

Вы можете попробовать использовать команду sem из пакета GNU параллельно в рецепте правил компоновщика. Его документация содержит пример того, как одновременно запускается только один экземпляр инструмента . В вашем примере вы бы позволили make запускать до 13 sem с за раз, но только один из них одновременно будет запускать компоновщик, в то время как другие блокируют.

Недостатком является то, что вы можете попасть в ситуацию, когда 5 из 13 ваших рабочих мест make связаны с экземплярами sem, которые все ожидают завершения процесса компоновщика. В зависимости от структуры вашей сборки это может означать потерю процессорного времени. По-прежнему бьет 6 линкеров, одновременно бьющих диск: -)

0 голосов
/ 22 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...