32

Вопрос по makefile, opencv, c – сделать -j4 или -j8

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

<span>Tl; др:<code>make -j $(nproc)</code></span>

Nov 01, 2017, 5:20 PMотhanshenrik

<span>Смотрите также<a href="http://stackoverflow.com/q/4778389/1172302">stackoverflow.com/q/4778389/1172302</a></span>

Jun 30, 2013, 11:08 AMотNikos Alexandris

4ответа

56

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

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

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

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

24

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

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

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

Есть несколько практических правил, но я предполагаю, что установка на общую сумму + 1 является наиболее распространенным. Идея заключается в том, что все ядра имеют свой собственный поток, и есть еще один дополнительный управляющий поток, который обрабатывает цели и который будет следующим.

2

-j опция используется только для ускорения сборки приложения, она определяет, сколько заданийmake может появиться для сборки. Вы можете установить-j или даже выше-j так что компиляция может происходить параллельно.

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

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

2

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

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

RelatedQuestions