Russian Qt Forum
Август 18, 2017, 21:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Распараллеливание компиляции  (Прочитано 11250 раз)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« : Ноябрь 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)

Собирать Qt с таким флагом не пытался.

Огранизация своего проекта для параллельной сборки

Если вы пишите библиотеку или другое приложение с несколькими модулями, которые зависят друг от друга и вы (или третьи лица) захотите распараллелить её сборку, то для начала нужно выполнить одно требование - указать очередность сборки модулей. Это делаеться добавлением строки

CONFIG += ordered

в файл проекта. Пример:

Цитировать
CONFIG += ordered

SUBDIRS  = module1 \
                module2 \
                module3 \
                ...

При этом вы гарантированно получите очередность сборки.


ЗЫ: Думаю эта статья будет кому-то полезна. Рад выслушать критику Улыбающийся
ЗЗЫ: После критики добавим её в вику
« Последнее редактирование: Ноябрь 12, 2008, 17:08 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Detonator
Гость
« Ответ #1 : Ноябрь 12, 2008, 16:39 »

Пробовал я это. Паралельная сборка в VisualStudio отключает предкомпилируемые хидеры, что в итоге дает гораздо худшую скорость чем в один поток но с хидерами. Для компиляции самой qt может оно и будет быстрее, но для проекта я выбрал хидеры.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Ноябрь 12, 2008, 17:06 »

Да, есть такое : /MP (Build with Multiple Processes). Немного обновил статью по этому поводу. Есть ещё несколько флагов компилятора с которыми конфлинтует флаг /MP.
« Последнее редактирование: Ноябрь 12, 2008, 17:10 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5634


Жаждущий знаний


Просмотр профиля
« Ответ #3 : Ноябрь 12, 2008, 18:14 »

Закинь в вики статейку.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
-------------------------------
https://twitter.com/panter_dsd
https://facebook.com/panter.dsd
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Ноябрь 12, 2008, 18:26 »

Обязательно закину
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Ноябрь 30, 2008, 17:50 »

Статью закинул в вики: Распараллеливание компиляции в Qt
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
juvf
Крякер
****
Offline Offline

Сообщений: 353


Просмотр профиля
« Ответ #6 : Январь 14, 2009, 12:48 »

Да в линуксе просто, но распараллеливание в qmake нету. Поэтому как распараллелить компиляцию Qt проекта prj.pro (имею ввиду не компиляцию самой библиотеки Qt)? Надо как-то при компиляции готового, созданного qmake`ом, мейкфайла указать чтобы использовался make с опцией -j[n]. Т.е. как я понимаю надо указать какую-то опцию в prj.pro
Записан
Rcus
Гость
« Ответ #7 : Январь 14, 2009, 13:13 »

huh?
обычно сборка приложения с использованием qmake выглядит как вызов
Код:
\> qmake && make
а тут будет
Код:
\> qmake && make -j4
правда такой вариант у меня с MinGW не работал (запускался только один поток сборки).
Без указания количества процессов приложения нормально собираются, а вот для сборки самой Qt 3 гигабайт памяти не хватает - падает в своп на сборке assistant/webkit и не может оттуда выбраться Улыбающийся
Записан
Dendy
Гость
« Ответ #8 : Январь 14, 2009, 13:27 »

Распараллеливание на уровне Make делается за счёт корректно сгенерированного Makefile. То-есть в котором указаны ВСЕ зависимости между узлами дерева сборки. В этом случае Make берёт независимые ветки дерева и выполняет их в различных потоках.

Насколько я помню QMake не может создать корректный Makefile, так как у него отсутствует механизм указания зависимостей между целями. До какой-то степени внутри одного проекта зависимости указываются нормально, но шаг влево, шаг вправо, прыжок на месте и есть риск нарваться на ошибку при сборке. В какой-то мере помогает костыль: CONFIG += ordered, но это запрещает параллельную сборку подпроектов сообще.

Вобщем, ещё одна причина использовать CMake.
Записан
juvf
Крякер
****
Offline Offline

Сообщений: 353


Просмотр профиля
« Ответ #9 : Январь 14, 2009, 14:04 »

Я попробовал сначала qmake`ом сделать makefile, а потом вручную запустил make для этого makefile. Запускал два раза без опции -j и с ней.
Первый раз make без посторонних параметров работал в два раза дольше чем с параметром -j2.
Процессор двухядерный
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 231


qnx.org.ru


Просмотр профиля
« Ответ #10 : Март 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
Код
C++ (Qt)
static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=C:\\qt\\2010.05\\qt";
static const char qt_configure_documentation_path_str[512 + 12] = "qt_docspath=C:\\qt\\2010.05\\qt\\doc";
static const char qt_configure_headers_path_str      [512 + 12] = "qt_hdrspath=C:\\qt\\2010.05\\qt\\include";
static const char qt_configure_libraries_path_str    [512 + 12] = "qt_libspath=C:\\qt\\2010.05\\qt\\lib";
static const char qt_configure_binaries_path_str     [512 + 12] = "qt_binspath=C:\\qt\\2010.05\\qt\\bin";
static const char qt_configure_plugins_path_str      [512 + 12] = "qt_plugpath=C:\\qt\\2010.05\\qt\\plugins";
static const char qt_configure_imports_path_str      [512 + 12] = "qt_impspath=C:\\qt\\2010.05\\qt\\imports";
static const char qt_configure_data_path_str         [512 + 12] = "qt_datapath=C:\\qt\\2010.05\\qt";
static const char qt_configure_translations_path_str [512 + 12] = "qt_trnspath=C:\\qt\\2010.05\\qt\\translations";
static const char qt_configure_examples_path_str     [512 + 12] = "qt_xmplpath=C:\\qt\\2010.05\\qt\\examples";
static const char qt_configure_demos_path_str        [512 + 12] = "qt_demopath=C:\\qt\\2010.05\\qt\\demos";
 
/*
static const char qt_configure_prefix_path_str       [512 + 12] = "qt_prfxpath=C:\\qt-greenhouse\\Trolltech\\Code_less_create_more\\Trolltech\\Code_less_create_more\\Troll\\4.6\\qt";
static const char qt_configure_documentation_path_str[512 + 12] = "qt_docspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/doc";
static const char qt_configure_headers_path_str      [512 + 12] = "qt_hdrspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/include";
static const char qt_configure_libraries_path_str    [512 + 12] = "qt_libspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/lib";
static const char qt_configure_binaries_path_str     [512 + 12] = "qt_binspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/bin";
static const char qt_configure_plugins_path_str      [512 + 12] = "qt_plugpath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/plugins";
static const char qt_configure_imports_path_str      [512 + 12] = "qt_impspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/imports";
static const char qt_configure_data_path_str         [512 + 12] = "qt_datapath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt";
static const char qt_configure_translations_path_str [512 + 12] = "qt_trnspath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/translations";
static const char qt_configure_examples_path_str     [512 + 12] = "qt_xmplpath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/examples";
static const char qt_configure_demos_path_str        [512 + 12] = "qt_demopath=C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.6/qt/demos";
*/

 


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


И наслаждаемся! )))

Будет приятно, если эта информация кому нибудь пригодится!


« Последнее редактирование: Март 11, 2011, 08:40 от lesav » Записан

Akon
Хакер
*****
Offline Offline

Сообщений: 605


Просмотр профиля
« Ответ #11 : Март 10, 2011, 21:27 »

Windows:
вместо nmake использовал тулзу jom.
В qmake никаких специальных флагов не выставляется.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 231


qnx.org.ru


Просмотр профиля
« Ответ #12 : Март 11, 2011, 06:37 »

Windows:
вместо nmake использовал тулзу jom

Причем здесь nmake  | jom ?
Мой пост касается MinGW

mingw32-make -j9 -f Makefile.Release
Записан

juvf
Крякер
****
Offline Offline

Сообщений: 353


Просмотр профиля
« Ответ #13 : Март 11, 2011, 06:55 »

Цитировать
Будет приятно, если эта информация кому нибудь пригодится!

Пригодилась. на ваш способ Qt4.7 работает.

ps способ с "QMAKE_CXXFLAGS_RELEASE += -MP " или передача в мэйк -j не работает с mingw32-make. Проверил.
pps У одного прогера под виндой работает опция -j. У меня не работает. Оказалось что я использую mingw32-make из SDK. А у него нет мингв. Он использует какойто make.exe. С make под виндой всё просто, опцию -j и будет счастье
Записан
juvf
Крякер
****
Offline Offline

Сообщений: 353


Просмотр профиля
« Ответ #14 : Март 11, 2011, 07:00 »

Windows
Добавляем поддержку паралельной компиляции в qmake:
может в wiki добавить? Распараллеливание компиляции в Qt
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.251 секунд. Запросов: 22.