Похоже, есть некоторые разногласия по поводу того, должно ли количество заданий в GNU make быть равным количеству ядер, или вы можете оптимизировать время сборки, добавив одно дополнительное задание, которое может быть поставлено в очередь, пока другие «работают» .
Лучше использовать -j4
или -j5
на четырехъядерной системе?
Вы видели (или проводили) какой-либо сравнительный анализ, который поддерживает одно или другое?
make `nproc`
to make CPU independant script :)Ответы:
Я бы сказал, что лучше всего протестировать его самостоятельно в вашей конкретной среде и рабочей нагрузке. Похоже, слишком много переменных (размер / количество исходных файлов, доступная память, кэширование диска, расположение исходного каталога и системных заголовков на разных дисках и т. Д.) Для универсального ответа.
По моему личному опыту (на 2-ядерном MacBook Pro) -j2 значительно быстрее, чем -j1, но помимо этого (-j3, -j4 и т. Д.) Нет измеримого ускорения. Так что для моей среды «вакансии == количество ядер» кажется хорошим ответом. (YMMV)
источник
Я запустил свой домашний проект на своем 4-ядерном ноутбуке с гиперпоточностью и записал результаты. Это довольно сложный для компилятора проект, но он включает в себя модульный тест продолжительностью 17,7 секунды в конце. Компиляции не очень интенсивны по вводу-выводу; доступной памяти очень много, а остальная часть находится на быстром SSD.
Основные результаты:
Я предполагаю прямо сейчас: если вы делаете что-то еще на своем компьютере, используйте количество ядер. Если вы этого не сделаете, используйте счетчик потоков. Превышение не дает никакой пользы. В какой-то момент они станут ограниченными в памяти и из-за этого разрушатся, что сделает компиляцию намного медленнее. Строка «inf» была добавлена намного позже, что вызвало у меня подозрение, что для 8+ заданий было некоторое тепловое дросселирование. Это действительно показывает, что для этого размера проекта нет действующих ограничений по памяти или пропускной способности. Однако это небольшой проект с 8 ГБ памяти для компиляции.
источник
Я лично использую
make -j n
где n - «количество ядер» + 1.Однако я не могу дать научное объяснение: я видел много людей, использующих одни и те же настройки, и пока они дали мне довольно хорошие результаты.
В любом случае, вы должны быть осторожны, потому что некоторые make-цепочки просто несовместимы с этой
--jobs
опцией и могут привести к неожиданным результатам. Если вы испытываете странные ошибки зависимости, просто попробуйтеmake
обойтись без них--jobs
.источник
В конечном итоге вам придется провести несколько тестов, чтобы определить лучшее число для вашей сборки, но помните, что ЦП - не единственный ресурс, который имеет значение!
Если у вас есть сборка, которая в значительной степени зависит от диска, например, то создание большого количества заданий в многоядерной системе на самом деле может быть медленнее , поскольку диску придется выполнять дополнительную работу, перемещая головку диска вперед и назад, чтобы обслуживать все различные задания (в зависимости от множества факторов, например, насколько хорошо ОС обрабатывает дисковый кеш, поддержка собственной очереди команд на диске и т. д.).
Кроме того, у вас есть «настоящие» ядра по сравнению с гиперпоточностью. Вы можете или не можете получить выгоду от создания заданий для каждого гиперпотока. Опять же, чтобы узнать это, вам придется провести тест.
Не могу сказать, что специально пробовал # баллы + 1 , но в наших системах (Intel i7 940, 4 ядра с гиперпоточностью, много ОЗУ и диски VelociRaptor) и в нашей сборке (крупномасштабная сборка C ++, в которой попеременно используются ЦП и я / O bound) между -j4 и -j8 очень мало различий. (Возможно, на 15% лучше ... но далеко не вдвое лучше.)
Если я ухожу на обед, я использую -j8, но если я хочу использовать свою систему для чего-нибудь еще во время ее сборки, я буду использовать меньшее число. :)
источник
-j 8
Я только что получил процессор Athlon II X2 Regor с Foxconn M / B и 4 ГБ памяти G-Skill.
Я поставил в конце «cat / proc / cpuinfo» и «free», чтобы другие могли видеть мои спецификации. Это двухъядерный Athlon II x2 с 4 ГБ оперативной памяти.
Я загрузил исходный код ядра следующего шага (linux-3.2.46) в / archive4;
извлек его (
tar -xjvf linux-3.2.46.tar.bz2
);cd'd в каталог (
cd linux-3.2.46
);и скопировал конфигурацию ядра по умолчанию через (
cp /usr/src/linux/.config .
);используется
make oldconfig
для подготовки конфигурации ядра 3.2.46;затем запустил make с различными заклинаниями -jX.
Я проверил время каждого запуска, выполнив make после команды time, например, «time make -j2». Между каждым запуском я 'rm -rf' дерево linux-3.2.46 и извлекал его повторно, копировал /usr/src/linux/.config по умолчанию в каталог, запускал make oldconfig и затем снова выполнял мой тест 'make -jX' .
простой "сделать":
как указано выше, но с make -j2
как указано выше, но с make -j3
как указано выше, но с make -j4
как указано выше, но с make -j8
'cat / proc / cpuinfo' дает:
'бесплатные' доходности:
источник
make -j
делать в этой системе? Make должен проверять загрузку и масштабировать количество процессов в зависимости от нагрузки.make -j
совсем не ограничивает количество рабочих мест. Обычно это катастрофа для среднего или крупного проекта, поскольку быстро создается больше заданий, чем может поддерживаться RAM. Вариант, который вам нужно ограничить по нагрузке-l [load]
, в сочетании с-j
Оба не ошибаются. Чтобы быть в гармонии с собой и с автором компилируемого программного обеспечения (на самом программном уровне действуют различные ограничения на многопоточность / однопоточность), я предлагаю вам использовать:
Примечания:
nproc
это команда linux, которая возвращает количество ядер / потоков (современный процессор), доступных в системе. Поместив его под галочкой, как указано выше, вы передадите номер команде make.Дополнительная информация: как кто-то упомянул, использование всех ядер / потоков для компиляции программного обеспечения может буквально задушить вашу коробку до смерти (отсутствие ответа) и может даже занять больше времени, чем использование меньшего количества ядер. Как я видел, один пользователь Slackware разместил здесь сообщение, что у него был двухъядерный ЦП, но он все еще проводил тесты до j 8, которые перестали отличаться при j 2 (только 2 аппаратных ядра, которые может использовать ЦП). Итак, чтобы избежать зависания окна, я предлагаю вам запустить его следующим образом:
Это будет передавать выходной сигнал ,
nproc
чтобыmake
и вычесть 2 ядра из своего результата.источник
Так же как исх .:
Из
Spawning Multiple Build Jobs
раздела в LKD :источник
По моему опыту, при добавлении дополнительных рабочих мест должны быть некоторые преимущества в производительности. Это просто потому, что дисковый ввод-вывод является одним из узких мест, помимо ЦП. Однако определить количество дополнительных заданий непросто, поскольку оно сильно зависит от количества ядер и типов используемого диска.
источник
Спустя много лет большинство этих ответов все еще верны. Однако произошли небольшие изменения: использование большего количества заданий, чем у вас есть физических ядер, теперь дает действительно значительное ускорение. В качестве дополнения к таблице Dascandy, вот мои времена для компиляции проекта на AMD Ryzen 5 3600X в Linux. (The Powder Toy, commit c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Я рекомендую проверить себя, но на основе отзывов других я обнаружил, что использование логического числа ядер для подсчета должностей хорошо работает в Zen. При этом система не теряет отзывчивости. Я полагаю, это относится и к недавним процессорам Intel. Обратите внимание, что у меня тоже есть SSD, так что, возможно, стоит проверить ваш процессор самостоятельно.
Тестирование проводилось на Ubuntu 19.10 с Ryzen 5 3600X, Samsung 860 Evo SSD (SATA) и 32 ГБ ОЗУ
Последнее замечание: у других людей с 3600X могут быть лучшие времена, чем у меня. Во время этого теста у меня был включен режим Eco, что немного снизило скорость процессора.
источник
ДА! На моем 3950x я запускаю -j32, и это экономит часы компиляции! Я все еще могу смотреть YouTube, просматривать веб-страницы и т. Д. Во время компиляции без каких-либо различий. Процессор не всегда привязан даже к 1 ТБ 970 PRO nvme или 1 ТБ Auros Gen4 nvme и 64 ГБ 3200C14. Даже когда это так, я не замечаю мудрого пользовательского интерфейса. Я планирую в ближайшем будущем протестировать с -j48 на некоторых крупных будущих проектах. Я ожидаю, как и вы, вероятно, увидеть некоторые впечатляющие улучшения. Те, у кого все еще есть четырехъядерный процессор, могут не получить такой же прирост ...
Сам Линус только что обновился до 3970x, и вы можете поставить свой самый низкий доллар, он, по крайней мере, использует -j64.
источник