Как скомпилировать на нескольких ядрах, используя mingw внутри QTCreator - PullRequest
21 голосов
/ 24 февраля 2012

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

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

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

Пожалуйста, поделитесь своими комментариями, если у вас когда-нибудь был mingw для параллельной компиляции нескольких исходных файлов из QTCreator. Спасибо!

Ответы [ 7 ]

22 голосов
/ 24 февраля 2012

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

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

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

11 голосов
/ 24 февраля 2012

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

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

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

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

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

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

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

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

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

4 голосов
/ 16 октября 2012

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

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

строк в qmake \ generators \ makefile.cpp (найдите сами).

Получается как

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

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

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

3 голосов
/ 24 февраля 2012

Использовать MAKE_COMMAND переменная окружения:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%
1 голос
/ 21 ноября 2017

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

0 голосов
/ 25 апреля 2014

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

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

0 голосов
/ 22 марта 2012

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

...