Как скомпилировать на нескольких ядрах, используя mingw внутри QTCreator
У меня на рабочем столе Windows четырехъядерный процессор i7. Я пытаюсь заставить mingw32-make скомпилировать как можно больше ядер. Я добавил -j8 в поля "Создать аргументы" в разделе "Параметры сборки" -> "Действия по сборке". Кажется, mingw32-make полностью игнорирует эту опцию, так как я не получаю никакого улучшения скорости от этого. Когда я просматриваю загрузку ЦП в диспетчере задач, он остается на уровне 13%, и я вижу только один запущенный экземпляр g++.
Прямо сейчас восстановление всего проекта с использованием mingw занимает 3 полных минуты. Восстановление его с помощью MSVC занимает всего 15 секунд.
К вашему сведению, я включил предварительно скомпилированный заголовок в настройках проекта. Это также значительно ускоряет работу с VC. Но я все еще не вижу преимущества предварительно скомпилированного заголовка с mingw.
Пожалуйста, поделитесь вашими комментариями, если у вас когда-нибудь был mingw для компиляции нескольких исходных файлов параллельно с QTCreator. Спасибо!
7 ответов
Вот что я сделал.
В меню Tools -> Options в Qt Creator, в разделе "Build and Run" есть опция "Использовать jom вместо nmake". Я установил этот флажок, но ничего не изменилось. Поэтому вместо этого я перешел к настройкам сборки проекта, и в категории шагов сборки есть пункт "Создать". Раскройте подробности об этом, и вы найдете элемент "Override mingw32-make.exe:". Я вставил туда "C:\QtSDK\QtCreator\bin\jom.exe", и внезапно я собрал несколько ядер.
Работал у меня на Qt Creator 2.4.1. Попробуйте.
-j8
вероятно не работает из-за ограничения в GNU Make на Win32.
Попробуйте положить просто -j
в поле make arguments. Это говорит Make, чтобы порождать как можно больше процессов компиляции - если у вас достаточно оперативной памяти и процессора, чтобы справиться с этим, это должно быть быстрее, чем одна компиляция.
К сожалению, это только два варианта (без изменения файлов Makefile): либо -j1
или неограниченно -j
Полная информация: GNU Make на Win32 не поддерживает сервер заданий, поэтому родительский процесс 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.
Добавлять -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+.
Использование MAKE_COMMAND
переменная окружения:
set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%
В Qt Creator перейдите в Projects -> Build & Run -> ваши конкретные настройки сборки MinGW -> Build Environment (это на экране ниже Общие / шаги сборки / чистые шаги..) и затем добавьте переменную MAKEFLAGS
и установите его -j8
, Я проверил это на моей двухъядерной машине с -j4
и QtCreator 4.4.1 и с MinGW 5.3.0. При компиляции мой процессор работает на 100 % производительности, как это видно в диспетчере задач. Без этой опции было около 25 %, поэтому я предполагаю, что она работает именно так, как ожидалось. Сборка теперь намного быстрее.
Проблема в том, что оригинальная марка не имеет поддержки сервера заданий. Так что у порта mingw32 его тоже не было. С тех пор он был добавлен однако. Я считаю, что самая старая версия с "правильной" поддержкой сервера заданий - 3.82.90. Вы можете найти это по ссылке ниже.
http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/
-j это путь, к сожалению для меня, проект настолько большой, что он использует всю мою доступную память и мой компьютер зависает, так что имейте это в виду. Брендан сказал, что нет способа использовать только половину ваших ядер, например, что жаль, если это правда.