Подтвердить что ты не робот

Make -j4 или -j8

У меня есть 4 процессора и компилирую процессорное голодное приложение, я читал, что использование make с ключом -j4 было рекомендовано для OpenCV, лучше ли использовать -j8 и в чем преимущество создания для нескольких процессоров?

4b9b3361

Ответ 1

Как вы говорите, флаг -j сообщает, что ему разрешено порождать предоставленное количество "потоков". В идеале каждый поток выполняется на собственном ядре/процессоре, поэтому ваша многоядерная/процессорная среда используется в полной мере.

make сам не компилирует исходные файлы. Это делается компилятором (gcc). Файл Makefile (вход для make) содержит набор целей. Каждая цель имеет набор зависимостей (по другим целям) и правила построения цели. make читает Makefile и управляет всеми целями, зависимостями и правилами сборки. Помимо компиляции исходных файлов, вы можете использовать make для выполнения любой задачи, которая может быть описана командами оболочки.

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

Существует несколько правил большого пальца, но я думаю, что этот параметр для общей суммы <number of cores> + 1 является наиболее распространенным. Идея заключается в том, что все ядра имеют свой собственный поток, и есть еще один управляющий поток, который обрабатывает цели и который теперь будет построен.

Ответ 2

Ответы выше в основном правильны. Однако детали немного вводят в заблуждение. Например, нет необходимости добавлять дополнительное задание для "управляющего потока" (примечание: make на самом деле не многопоточно). make никогда не считает себя заданием для целей -j, поэтому, как сказал Гюйгенс выше, если вы скажете -j5, вы получите 5 компилируемых заданий, а не 4 плюс make.

Причина, по которой большинство людей использует [количество ядер] + [некоторое отступы], не имеет ничего общего с make или тем, что ему нужно, а скорее с природой компилятора. Компилятор - это просто очень сложный инструмент для перевода текста: он читает текст в одной форме и преобразует его в "текст" (двоичный) в другой форме. Многое из этого (особенно по мере того, как ваш язык становится более сложным, например С++), требуется много CPU. Но для этого также требуется много дискового ввода-вывода. Дисковый ввод-вывод работает медленно, поэтому, пока один компилятор ждет некоторые данные с диска, ядро ​​планирует запуск других заданий. Вот почему вы можете с пользой использовать одновременно больше, чем количество ядер.

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

Однако [число ядер] + [несколько] обычно является хорошим приближением.

Ответ 3

Опция -j используется только для ускорения сборки приложения, она определяет, сколько заданий make может появиться для сборки. Вы можете установить -j<nb core> или даже более высокий -j<nb-core * 1.5>, чтобы компиляция могла выполняться параллельно.

Он не влияет на скомпилированный код.

Для четырехъядерной системы вы можете попробовать make -j6. Если make может выполнять параллельные сборки, он запустит до 6 одновременных процессов компиляции (например, 6 вызовов в gcc).

Ответ 4

Один процессор на поток плюс один менеджер/загрузчик. Поскольку поток, который выполняет операции с дисками, технически почти бездействует с точки зрения процессора, добавьте его к общему количеству ядер.

Если процессор использует гиперпоточность, вы можете с уверенностью подсчитать каждое ядро ​​как два ядра и удвоить количество потоков, поэтому четырехъядерный процессор Intel Core i7 должен получить -j9 (восемь виртуальных ядер плюс менеджер). На четырехъядерном процессоре AMD использовать -j5