Название: Распараллеливание компиляции Отправлено: pastor от Ноябрь 12, 2008, 14:15 Что это такое? Данная возможность указывает компилятору запускать несколько процессов на компиляцию, что в свою очередь сокрашает время сборки проекта в несколько раз. Данная возможность особенно полезна для владельцев многоядерных процессоров.
Linux В Linux с этим деоа обстоят очень просто. Для этого нужно выполнить команду make со следующими параметрами: make -j [processMax], где processMax - кол-во желаемых процессов. Примечание: Библиотека Qt поддерживает сборку с вышеуказанным параметром. Из своего опыта скажу, что время компиляции сократилось примерно в раза 4. Так что, экономте свое время ;) Windows В Windows дела обсоят хуже, но такая возможность есть. Она оффициально представлена в Visual Studio 2008, но также пресудствует в Visual Studio 2005 (хотя и не задокументирована). Итак.., за это отвечает флаг компиляции /MP Флаг /MP указывает компилятору компилировать файлы параллельно в пределах одного проекта. Обычно это дает линейный прирост скорости компиляции. Процесс линковки остаеться такойже (флаг не влияет на её скорость). Как же воспользоваться данным флагом? Очень просто, достаточно добавить в файл вашего проекта (*.pro) стороку и пересобрать проект: QMAKE_CXXFLAGS_RELEASE += -MP[processMax] где processMax - кол-во желаемых процессов. Вы можите спросить почему флан используеться только RELEASE сборки?. По умолчанию, флаг /Gm включен для режима DEBUG сборки, и отключен для режима RELEASE сборки. В DEBUG сборке флаг /MP конфликтует с флагом /Gm, в результате будет проигнорирован (отключен). В этом заключаеться основной недостаток. Про остальные флаги с которыми конфликтует флаг /MP можно посмотреть здесь: MSDN: /MP (Build with Multiple Processes) (http://msdn.microsoft.com/en-us/library/bb385193.aspx) Собирать Qt с таким флагом не пытался. Огранизация своего проекта для параллельной сборки Если вы пишите библиотеку или другое приложение с несколькими модулями, которые зависят друг от друга и вы (или третьи лица) захотите распараллелить её сборку, то для начала нужно выполнить одно требование - указать очередность сборки модулей. Это делаеться добавлением строки CONFIG += ordered в файл проекта. Пример: Цитировать CONFIG += ordered SUBDIRS = module1 \ module2 \ module3 \ ... При этом вы гарантированно получите очередность сборки. ЗЫ: Думаю эта статья будет кому-то полезна. Рад выслушать критику :) ЗЗЫ: После критики добавим её в вику Название: Re: Распараллеливание компиляции Отправлено: Detonator от Ноябрь 12, 2008, 16:39 Пробовал я это. Паралельная сборка в VisualStudio отключает предкомпилируемые хидеры, что в итоге дает гораздо худшую скорость чем в один поток но с хидерами. Для компиляции самой qt может оно и будет быстрее, но для проекта я выбрал хидеры.
Название: Re: Распараллеливание компиляции Отправлено: pastor от Ноябрь 12, 2008, 17:06 Да, есть такое : /MP (Build with Multiple Processes) (http://msdn.microsoft.com/en-us/library/bb385193.aspx). Немного обновил статью по этому поводу. Есть ещё несколько флагов компилятора с которыми конфлинтует флаг /MP.
Название: Re: Распараллеливание компиляции Отправлено: Пантер от Ноябрь 12, 2008, 18:14 Закинь в вики статейку.
Название: Re: Распараллеливание компиляции Отправлено: pastor от Ноябрь 12, 2008, 18:26 Обязательно закину
Название: Re: Распараллеливание компиляции Отправлено: pastor от Ноябрь 30, 2008, 17:50 Статью закинул в вики: Распараллеливание компиляции в Qt (http://prog.org.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D0%B8_%D0%B2_Qt)
Название: Re: Распараллеливание компиляции Отправлено: juvf от Январь 14, 2009, 12:48 Да в линуксе просто, но распараллеливание в qmake нету. Поэтому как распараллелить компиляцию Qt проекта prj.pro (имею ввиду не компиляцию самой библиотеки Qt)? Надо как-то при компиляции готового, созданного qmake`ом, мейкфайла указать чтобы использовался make с опцией -j[n]. Т.е. как я понимаю надо указать какую-то опцию в prj.pro
Название: Re: Распараллеливание компиляции Отправлено: Rcus от Январь 14, 2009, 13:13 huh?
обычно сборка приложения с использованием qmake выглядит как вызов Код: \> qmake && make Код: \> qmake && make -j4 Без указания количества процессов приложения нормально собираются, а вот для сборки самой Qt 3 гигабайт памяти не хватает - падает в своп на сборке assistant/webkit и не может оттуда выбраться :) Название: Re: Распараллеливание компиляции Отправлено: Dendy от Январь 14, 2009, 13:27 Распараллеливание на уровне Make делается за счёт корректно сгенерированного Makefile. То-есть в котором указаны ВСЕ зависимости между узлами дерева сборки. В этом случае Make берёт независимые ветки дерева и выполняет их в различных потоках.
Насколько я помню QMake не может создать корректный Makefile, так как у него отсутствует механизм указания зависимостей между целями. До какой-то степени внутри одного проекта зависимости указываются нормально, но шаг влево, шаг вправо, прыжок на месте и есть риск нарваться на ошибку при сборке. В какой-то мере помогает костыль: CONFIG += ordered, но это запрещает параллельную сборку подпроектов сообще. Вобщем, ещё одна причина использовать CMake. Название: Re: Распараллеливание компиляции Отправлено: juvf от Январь 14, 2009, 14:04 Я попробовал сначала qmake`ом сделать makefile, а потом вручную запустил make для этого makefile. Запускал два раза без опции -j и с ней.
Первый раз make без посторонних параметров работал в два раза дольше чем с параметром -j2. Процессор двухядерный Название: Re: Распараллеливание компиляции Отправлено: lesav от Март 10, 2011, 18:26 Windows MinGW
Добавляем поддержку паралельной компиляции MinGW в qmake: Итак, что нужно : 1. Свободное время, ~10 минут 2. Изменить файлы qt/qmake/generators/makefile.cpp qt/qmake/generators/mac/pbuilder_pbx.cpp qt/qmake/generators/symbian/symmake.cpp qt/qmake/generators/symbian/symmake_abld.cpp Найти в исходниках ключ -f, и везде, где встречяется упоминание типа: $(MAKE) -f или makefilein = " -f " или "make -C -f " поменять на $(MAKE) -j9 -f или makefilein = " -j9 -f " или "make -C -j9 -f " Где: ключ -j (Джоб) указывает количество одновременно выполняемых потоков компиляции (в моем случае девять). Кол-во потоков компиляции выбираем равным числу ядер процессора + 1 или +2. Для процессоров ай7 или других с поддержкой гипертрейдинга Кол-во потоков компиляции выбираем равным числу ядер умножить на два + 1 либо +2, либо +3. Перед сборкой qmake необходимо прописать Qt-шные пути в файле qt/src/corelib/global/qconfig.cpp Код
3. Сохраняем текущий qmake под ничего незначащим именем qmake-original (как говориться на всякий пожарный случай) copy C:\qt\2010.05\qt\bin\qmake.exe C:\qt\2010.05\qt\bin\qmake-original.exe 4. После всех действий остается выполнить несколько команд cd C:\qt\2010.05\qt\qmake C:\qt\2010.05\qt\bin\qmake.exe C:\qt\2010.05\mingw\bin\mingw32-make -j9 -f Makefile.Release И наслаждаемся! ))) Будет приятно, если эта информация кому нибудь пригодится! Название: Re: Распараллеливание компиляции Отправлено: Akon от Март 10, 2011, 21:27 Windows:
вместо nmake использовал тулзу jom. В qmake никаких специальных флагов не выставляется. Название: Re: Распараллеливание компиляции Отправлено: lesav от Март 11, 2011, 06:37 Windows: вместо nmake использовал тулзу jom Причем здесь nmake | jom ? Мой пост касается MinGW (http://www.prog.org.ru/index.php?topic=8037.msg114910#msg114910) mingw32-make -j9 -f Makefile.Release Название: Re: Распараллеливание компиляции Отправлено: juvf от Март 11, 2011, 06:55 Цитировать Будет приятно, если эта информация кому нибудь пригодится! Пригодилась. на ваш способ Qt4.7 работает.ps способ с "QMAKE_CXXFLAGS_RELEASE += -MP " или передача в мэйк -j не работает с mingw32-make. Проверил. pps У одного прогера под виндой работает опция -j. У меня не работает. Оказалось что я использую mingw32-make из SDK. А у него нет мингв. Он использует какойто make.exe. С make под виндой всё просто, опцию -j и будет счастье Название: Re: Распараллеливание компиляции Отправлено: juvf от Март 11, 2011, 07:00 Windows может в wiki добавить? Распараллеливание компиляции в Qt (http://prog.org.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D0%B8_%D0%B2_Qt)Добавляем поддержку паралельной компиляции в qmake: Название: Re: Распараллеливание компиляции Отправлено: juvf от Март 11, 2011, 07:22 Цитировать Кол-во потоков компиляции выбираем равным числу ядер процессора + 1 или +2. Почему не +1? почему не "= числу ядер"?Название: Re: Распараллеливание компиляции Отправлено: Akon от Март 11, 2011, 08:16 Windows: вместо nmake использовал тулзу jom Причем здесь nmake | jom ? Мой пост касается MinGW (http://www.prog.org.ru/index.php?topic=8037.msg114910#msg114910) mingw32-make -j9 -f Makefile.Release А при чем здесь конкретно твой пост? Название: Re: Распараллеливание компиляции Отправлено: lesav от Март 11, 2011, 08:32 Пригодилась. Ваш способ Qt4.7 работает. ps способ с "QMAKE_CXXFLAGS_RELEASE += -MP " или передача в мэйк -j не работает с mingw32-make. Проверил. Вы глубоко заблуждаетесь! mingw32-make поддерживает ключ -j Просто при вызове mingw32-make без указания ключа -f, используется дефолтный Makefile, в котором вызывается mingw32-make уже без паралельной компиляции. Посмотрите внимательно лог сборки. После того, как вы повторите действия из моего поста (см. выше (http://www.prog.org.ru/index.php?topic=8037.msg114910#msg114910)), у вас появится возможность быстро собирать приложения в MinGW. Почему не +1? почему не "= числу ядер"? Это официальные рекомендации. +1 уменьшает время простоя процессора при переключении задач Название: Re: Распараллеливание компиляции Отправлено: juvf от Март 11, 2011, 11:22 Цитировать Вы глубоко заблуждаетесь! Действительно, заблуждался. -j без -f не работал. Ну тогда можно просто передать в mingw32-make два ключа -j9 -f Makefile.Release После передачи 2-х ключей и у меня стало быстро компеляца без "добавления поддержки паралельной компиляции MinGW в qmake". Зачем тогда нужно добавлять что-то в qmake, если достаточно в мингв-мэйк передать 2 ключа? Название: Re: Распараллеливание компиляции Отправлено: Akon от Март 11, 2011, 14:34 Я привел один из способов под Windows. К твоему посту мой пост не имеет никакого отношения. Или что не так? Название: Re: Распараллеливание компиляции Отправлено: lesav от Март 11, 2011, 14:56 Я привел один из способов под Windows. К твоему посту мой пост не имеет никакого отношения. Или что не так? Я скромно извиняюсь! Просто я поднял тему из глубины 2009 года, и решил что ответ был на мой пост! Мою ошибку признаю. Эх надо было новую тему открывать. Название: Re: Распараллеливание компиляции Отправлено: lesav от Март 11, 2011, 17:06 Пригодилась. Ваш способ Qt4.7 работает. pps У одного прогера под виндой работает опция -j. У меня не работает. Оказалось что я использую mingw32-make из SDK. А у него нет мингв. Он использует какойто make.exe. С make под виндой всё просто, опцию -j и будет счастье Не будет счастья! Ибо make.exe и mingw32-make.exe Это одно и тоже! Вызывая make -j9 вы фактически вводите команду make -j9 -f Makefile All make хватается за сценарий сборки Makefile в котором указано, что для сборки проекта необходимо вызвать make -f Makefile.Debug и затем запусить make -f Makefile.Release Ключ -j не наследуется на последующие вызовы make А сценарии сборки Makefile.Release и Makefile.Debug сгенерил qmake. Лечить нужно qmake см. методу в Wiki (http://prog.org.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D0%B8_%D0%B2_Qt#Windows_MinGW) Название: Re: Распараллеливание компиляции Отправлено: LisandreL от Июнь 26, 2011, 16:47 lesav, cпасибо за мануал. Разбирался по нему.
В новом SDK немного изменилась структура папок, но в целом изменения минимальны: 1) Изменяем файлы C:\QtSDK\QtSources\4.7.3\qmake\generators\makefile.cpp C:\QtSDK\QtSources\4.7.3\qmake\generators\mac\pbuilder_pbx.cpp C:\QtSDK\QtSources\4.7.3\qmake\generators\symbian\symmake.cpp C:\QtSDK\QtSources\4.7.3\qmake\generators\symbian\symmake_abld.cpp (для компиляции только под Win видимо достаточно только первого файла) Заменяем: $(MAKE) -f или makefilein = " -f " или "make -C "+…+" -f " на $(MAKE) -j9 -f или makefilein = " -j9 -f " или "make -C "+…+" -j9 -f " 2) Создаём файл C:\QtSDK\QtSources\4.7.3\src\corelib\global\qconfig.cpp Код
3) Запускаем Qt 4.7.3 for Desktop (MinGW) cd c:\QtSDK\QtSources\4.7.3\qmake\ qmake mingw32-make -j9 -f Makefile.Release Ждём окончания компиляции. 4) Забираем получившийся exe-шник C:\QtSDK\QtSources\4.7.3\bin\qmake.exe Название: Re: Распараллеливание компиляции Отправлено: ppk от Август 10, 2011, 23:06 Вроде бы сделал все по инструкции, но при запуске qmake получаем:
Код: WARNING: Failure to find: windows/registry.cpp Код: C:/QtSDK/mingw/bin/mingw32-make -j3 -f Makefile.Release Что с этим делать не очень понятно. Может кто-то подскажет как решить проблему? Название: Re: Распараллеливание компиляции Отправлено: Пантер от Январь 18, 2012, 11:43 lesav, спасибо большое за мануал - работает замечательно.
Название: Re: Распараллеливание компиляции Отправлено: lesav от Январь 18, 2012, 22:54 Очень рад что пригодилось.
PS Мое правило: Не люблю кого-то ждать, и чтоб меня ждали. Время нужно беречь. Название: Re: Распараллеливание компиляции Отправлено: lesav от Февраль 06, 2012, 08:55 Вроде бы сделал все по инструкции, но при запуске qmake получаем: Код: WARNING: Failure to find: windows/registry.cpp Код: C:/QtSDK/mingw/bin/mingw32-make -j3 -f Makefile.Release Что с этим делать не очень понятно. Может кто-то подскажет как решить проблему? Выполнить Код: set QTDIR=f:\Qt\qt-4.8.0-mingw-shared Дождаться момента, когда начнет собираться qmake, и прекратить далнейшее выполнение configure.exe Затем Код: cd ./qmake Название: Re: Распараллеливание компиляции Отправлено: LisandreL от Февраль 06, 2012, 09:38 К слову, альтернативный метод распараллеливание компиляции в MinGW:
Проекты > Настройки сборки > Сборка: mingw32-make.exe in … > Параметры make: -j9 -f Makefile.Release (ну и -j9 -f Makefile.Debug для дебажной версии). Вот так: (http://s1.hostingkartinok.com/uploads/images/2012/02/8b6e1b15300d071ff050c0d943d0fbc3.png) (http://hostingkartinok.com) Плюсы: + ничего не надо собирать Минусы: - указанные строчки надо указывать в каждой MinGW-сборке каждого проекта Название: Re: Распараллеливание компиляции Отправлено: Fregloin от Февраль 12, 2012, 12:28 distcc вам в помощь, очень хорошая штука, проверено многократно. проект, который собирался 3 минуты, теперь собирается за минуту двадцать сек.
|