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

Как скомпилировать несколько ядер с использованием mingw внутри QTCreator

У меня четырехъядерный процессор i7 на моем рабочем столе Windows. Я пытаюсь получить mingw32-make, чтобы скомпилировать, используя как можно больше ядра. Я добавил -j8 в поля "Сделать аргументы" в разделе "Настройки сборки" → "Шаги сборки". mingw32-make, похоже, полностью игнорирует этот параметр, так как я не получаю никакого улучшения скорости. Когда я просматриваю использование ЦП в диспетчере задач, он остается на уровне 13%, и я вижу только один экземпляр g++.

Прямо сейчас, перестройка всего проекта с использованием mingw занимает 3 полных минуты. Восстановление его с помощью MSVC занимает всего 15 секунд.

Для вашей информации я включил опцию предварительно скомпилированного заголовка в настройках проекта. Это ускоряет работу с VC. Но я все еще не вижу преимущества предварительно скомпилированного заголовка с mingw.

Поделитесь своими комментариями, если вам когда-либо приходилось собирать несколько исходных файлов параллельно с QTCreator. Благодарю!

4b9b3361

Ответ 1

Вот что я сделал.

В меню Инструменты → Параметры в Qt Creator в разделе "Сборка и запуск" есть опция "Использовать jom вместо nmake". Я проверил эту коробку, но ничего не изменилось. Поэтому вместо этого я перешел к настройкам сборки проекта, и в категории шагов шага есть элемент "Сделать". Разверните подробные сведения об этом, и вы найдете элемент "Override mingw32-make.exe:". Я вставил "C:\QtSDK\QtCreator\bin\jom.exe" там, и вдруг я строил с несколькими ядрами.

Работал для меня на Qt Creator 2.4.1. Попробуйте.

Ответ 2

-j8 вероятно, не работает из-за ограничения в GNU Make on Win32.

Попробуйте поместить только -j в поле make arguments. Это говорит Make, чтобы порождать столько процессов компиляции, сколько может - если у вас достаточно ОЗУ и процессора для его обработки, это должно быть быстрее, чем один компилятор.

К сожалению, это только два варианта (без изменения Make файлов): либо -j1, либо неограниченный -j

Полная информация: GNU Make on Win32 не поддерживает сервер заданий, поэтому родительский процесс Make не может отслеживать количество процессов компиляции, порожденных любыми суб-Make. Чтобы быть в безопасности, Sub-Make работает только с -j1. Я считаю, что созданный qmake/Qt Creator Makefile использует несколько уровней Makefile. Сначала я выяснил эту проблему с Microchip MPLAB X IDE, просмотрите этот поток для получения дополнительной информации

Эта цитата из README.W32, распространяемая с помощью GNU Make

Поддержка параллельных построек

Параллельные сборки (-jN) поддерживаются в этом порту с помощью 2 ограничения:

  • Количество параллельных процессов имеет жесткий предел 64,         из-за того, как этот порт реализует         подпроцессы;

  • Метод сервера заданий (доступен, когда Make работает в Posix         платформы) не поддерживается, что означает, что вы должны пройти         Явный -jN переключается на суб-Make в рекурсивном Makefile.         Если суб-Make не получает явный ключ -jN, он         по умолчанию будет -j1, то есть no parallelism в суб-Make.

Ответ 3

Добавить -j9 (заменить 9 на значение NUMBER_OF_PROCESSORS (Windows)/$(nproc) (Linux) плюс один - это оптимально) для всех

QString makefilein = " -f " + subtarget->makefile;

в qmake\generatorators\makefile.cpp (найдите его самостоятельно).

Это результат как

QString makefilein = " -j9 -f " + subtarget->makefile;

затем запустите configure.exe с соответствующими параметрами (! и дополнительными -qmake -dont-process, чтобы избежать избыточного количества файлов make файлов!).

Проблема заключается в том, что вы получаете два набора процессов во время сборки "debug and release". Таким образом, общее количество возникающих процессов составляет 18 +.

Ответ 4

Использовать переменную среды MAKE_COMMAND:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%

Ответ 5

-j - путь, к сожалению, для меня проект настолько велик, что он использует всю мою доступную память, и мой компьютер зависает, поэтому имейте это в виду. Брендан сказал, что нет возможности использовать только половину ваших сердечников, например, жаль, если это правда.

Ответ 6

Проблема заключается в том, что в исходном make не поддерживается поддержка рабочих станций. Так что у порта mingw32 тоже этого не было. С тех пор он был добавлен. Я считаю, что самая старая версия с "правильной" поддержкой сервера заданий - 3.82.90. Вы можете найти это по ссылке ниже.

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/

Ответ 7

В Qt Creator перейдите в Projects → Build and Run → вашу настройку сборки MinGW → Build Environment (это находится на экране ниже "Общие/Сборка шагов/Очистить шаги" ), а затем добавьте переменную MAKEFLAGS и установите его на -j8. Я тестировал это на своей двухъядерной машине с -j4 и QtCreator 4.4.1 и MinGW 5.3.0. При компиляции мой процессор работает со скоростью 100%, как это видно в диспетчере задач. Без этого варианта это было около 25%, поэтому я предполагаю, что он работает точно так, как ожидалось. Сборка теперь намного быстрее.