2015-10-13 2 views
2

Я запускаю файл NDK для Android, используя ndk-build, который является обычным gnu make, который запускается с шаблонами makefile google. Я запускаю его с помощью ndk-build -j8, и я могу подтвердить, что действительно команда make работает с -j8
Компиляция, однако, продолжает скомпилировать мои исходные файлы по одному, никогда не запуская clang++ еще один раз за раз. Это было не всегда так. Всего несколько дней назад я использовал те же самые точные сценарии, и он использовал все 8 ядер и был намного быстрее.
Что может сделать gnu сделать не уважать -j8 вдруг?
Есть ли способ заставить gnu произвести любую пояснительную информацию об этом? Различные опции --debug, похоже, не говорят об этом.gnu make -j8 не работает в параллельном режиме

Запуск от OSX 10.10.5, версия GNU Make является 3,81

Update: Если я ndk-build clean раньше, сборка я сразу же после того, как это работает на всех 8 ядер. После сборки сделана на следующий день после возвращения, чтобы использовать только 1 ядро ​​

+1

Я предполагаю, что у вас есть некоторые странные зависимости в вашем 'Makefile'. Мы не можем ответить на ваш вопрос, прежде чем его увидеть. Возможно, некоторые файлы '-include'd помещают некоторый беспорядок. –

+0

Кстати, вы действительно должны обновить GNU 'make' до 4.1 и/или использовать [remake] (http://bashdb.sourceforge.net/remake/) или' make -trace' для отладки таких проблем; попробуйте 'make clean' и/или' make distclean' –

+0

. Ваш вопрос должен быть закрыт с двух сторон вне темы: не отображается код (вы должны показать свой 'Makefile'), но просят отладить его и многое другое по теме [superuser ] (http://superuser.com/) –

ответ

3

Вы можете проверить, что на самом деле makemake (используйте which make и type make, чтобы увидеть, есть ли упаковочные скрипты, функция или псевдонимы, связанная).

Это может быть также быть в игре: Communicating options to a s submake:

Опция -j является частным случаем (см Parallel Execution). Если вы установите его на некоторое числовое значение N, и ваша операционная система поддерживает его (в большинстве случаев любая система UNIX, другие обычно не будут), родительский make и все суб-элементы будут взаимодействовать, чтобы обеспечить выполнение только N заданий на то же время между ними. Обратите внимание, что любая работа, которая отмечена рекурсивной (см Вместо исполнения рецептов) не учитывается в общем объеме работ (в противном случае мы могли бы получить N к югу делает запуск и не имеют слотов осталось для любой реальной работы!)

И отношение к вам:

Если ваша операционная система не поддерживает вышеупомянутую связь, то -j 1 всегда помещается в MAKEFLAGS вместо значения, указанного. Это связано с тем, что если опция -j была передана под суб-макетам, вы получите гораздо больше заданий, которые будут выполняться параллельно, чем вы просили. Если вы дадите -j без числового аргумента, то есть для запуска как можно большего числа заданий параллельно, это передается вниз, так как множество бесконечностей не более одного.

+0

Нет подмарок, я вижу только один make-процесс – shoosh

+0

@shoosh, чтобы убедиться, что это не ваш 'make', создайте фиктивный make-файл, у которого есть куча целей, которые просто вызывают« echo' statements и выполняют 'make all - -jobs = 16'. См. Мой [вопрос] (http://stackoverflow.com/q/37734959/4784683) – Adrian

1

Просто Гадание:

  1. Поиск для .NOTPARALLEL псевдо-мишени в ваших замыкающие файлов. Это предотвращает параллельное создание gnu.
  2. У вас есть -l set и нагрузка выше этого? Затем make не будет запускать более одного задания за раз.
  3. Вы уверены, что есть незастроенные вещи для сборки, а вы перестраиваете?Конечно, make будет только распараллелить задачи, он знает, что они независимы друг от друга
1

Ответы, приведенные выше, дали известные ссылки на вопросы, касающиеся вашего вопроса.

Не зная больше о вашей установке, я могу только догадываться:

Может быть, как-то, работает ваш сценарий сборки это негативно влияет на MAKEFLAGS.

Вы можете попробовать напрямую передать количество заданий в скрипт ndk-build. Редактировать NDK-скрипт сборки так:

$GNUMAKE -j8 -f $YourProgramDir/.../build-local.mk "[email protected]"