Как скомпилировать на нескольких ядрах, используя 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 это путь, к сожалению для меня, проект настолько большой, что он использует всю мою доступную память и мой компьютер зависает, так что имейте это в виду. Брендан сказал, что нет способа использовать только половину ваших ядер, например, что жаль, если это правда.

Другие вопросы по тегам