Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > MSVC2008. Распаралелить процесс сборки


Автор: niXman 21.10.2009, 09:05
Здравствуйте.
Подскажите, можно ли заставить сию IDE собирать проект параллельно в несколько потоков?
При сборке проекта, заметил, что компилятор использует только одно ядро, а хотелось бы чтоб все. Ну чтоб быстрее процесс шел.

Автор: Lazin 21.10.2009, 09:18
Tools -> Options -> Projects and Solutions -> Build and Run -> maximum number of parallel project builds

правда для этого, нужно что-бы твой sloutions содержал несколько проектов

Автор: niXman 21.10.2009, 09:34
Цитата(Lazin @  21.10.2009,  07:18 Найти цитируемый пост)
правда для этого, нужно что-бы твой sloutions содержал несколько проектов 

Так проект всего один, но большой, долго собирается, а процессор не используется на полную.
Я предполагал что есть возможность настроить IDE так, чтоб make распределял компиляцию.

Добавлено через 1 минуту и 21 секунду
Или при сборке из IDE make не используется?
В общем каким способом можно реализовать задуманное?

Автор: Alek86 21.10.2009, 09:36
вопрос в тему
в 2005 если есть 3 проекта (2 lib и 1 exe), причем Lib2 использует функции из Lib1, а Exe - функции из Lib2, то:

1. если поставить в Exe зависимости на Lib1 и Lib2, то обе либы собираются параллельно
2. если установить зависимость Exe от Lib2, а у Lib2 зависимость от Lib1, то либы собираются строго последовательно
(второй способ предпочтительней (если появится Exe2, то у нее нужно зависимость только от Lib2 делать))

никто не знает, почему во втором способе последовательно? Это ж либы, их, вроде, можно и параллелить.

Добавлено через 1 минуту и 4 секунды
Цитата(niXman @  21.10.2009,  09:34 Найти цитируемый пост)
В общем каким способом можно реализовать задуманное?

как вариант разбить проект на главный и несколько либ
либы будут параллельно компилиться

Автор: niXman 21.10.2009, 09:43
Цитата(Alek86 @  21.10.2009,  07:36 Найти цитируемый пост)
Это ж либы, их, вроде, можно и параллелить.

Ну так не указывай зависимость либы от либы.

Автор: Alek86 21.10.2009, 09:48
Цитата(niXman @  21.10.2009,  09:43 Найти цитируемый пост)
Ну так не указывай зависимость либы от либы.

вопрос не в этом, а почему параллелит
сори, что в твоей теме, просто вспомнилось, да и вопрос примерно туда же

Автор: niXman 21.10.2009, 09:52
Цитата(Alek86 @  21.10.2009,  07:48 Найти цитируемый пост)
вопрос не в этом, а почему параллелит

Не знаю. Я меньше недели пользую сию IDE smile 

По теме: Может использовать другую систему сборки? Кто-то знает, cmake позволяет такое реализовать, и возможно ли его привязать к этой IDE?

Автор: Lazin 21.10.2009, 09:52
Цитата(niXman @  21.10.2009,  09:34 Найти цитируемый пост)
Так проект всего один, но большой, долго собирается, а процессор не используется на полную.
Я предполагал что есть возможность настроить IDE так, чтоб make распределял компиляцию.

при сборке из IDE make не используется, да и вообще, в поставку VC++ 2008 такое приложение не входит smile 
есть nmake, но он то-же не используется, для сборки проекта используется vcbuild.exe
и кстати, ты сам ответил на свой вопрос, раз проект большой и долго собирается, то его нужно разбить на части
возможно так-же использовать precompiled headers

Добавлено через 4 минуты и 14 секунд
Цитата(Alek86 @  21.10.2009,  09:36 Найти цитируемый пост)
вопрос в тему
в 2005 если есть 3 проекта (2 lib и 1 exe), причем Lib2 использует функции из Lib1, а Exe - функции из Lib2, то:

1. если поставить в Exe зависимости на Lib1 и Lib2, то обе либы собираются параллельно
2. если установить зависимость Exe от Lib2, а у Lib2 зависимость от Lib1, то либы собираются строго последовательно
(второй способ предпочтительней (если появится Exe2, то у нее нужно зависимость только от Lib2 делать))

никто не знает, почему во втором способе последовательно? Это ж либы, их, вроде, можно и параллелить.


ну это-же очевидно, если ты установил зависимость target2 от target1, то студия сначала соберет target1, а затем target2, так как перед сборкой target2 нужно собрать все, от чего он зависит, что-бы что-то собиралось параллельно, нужно что-бы зависимости между проектами имели форму дерева

Автор: Alek86 21.10.2009, 10:00
Цитата(Lazin @  21.10.2009,  09:52 Найти цитируемый пост)
если ты установил зависимость target2 от target1, то студия сначала соберет target1, а затем target2, так как перед сборкой target2

то есть зависимость - это тупейший инструмент, что за чем компилить, не смотря на то, что либы можно и распараллелить?

Автор: Lazin 21.10.2009, 10:01
Цитата(niXman @  21.10.2009,  09:52 Найти цитируемый пост)
По теме: Может использовать другую систему сборки? Кто-то знает, cmake позволяет такое реализовать, и возможно ли его привязать к этой IDE?

cmake есть смысл использовать, только если ты будешь собирать свой проект на разных платформах.
Но проблему это не решит, так как cmake создает решение для visual studio, после чего ты открываешь его и собираешь так-же как ты делаешь это сейчас.

Автор: niXman 21.10.2009, 10:01
Цитата(Lazin @  21.10.2009,  07:52 Найти цитируемый пост)
раз проект большой и долго собирается, то его нужно разбить на части

Не хотелось бы...

Цитата(Lazin @  21.10.2009,  07:52 Найти цитируемый пост)
возможно так-же использовать precompiled headers

Сейчас ознакомлюсь.

А по поводу:
Цитата(niXman @  21.10.2009,  07:52 Найти цитируемый пост)
Кто-то знает, cmake позволяет такое реализовать, и возможно ли его привязать к этой IDE?

Можете прокомментировать?

Автор: niXman 21.10.2009, 10:03
Уже прокомментировали. Спасибо. Тема закрыта.

Автор: Lazin 21.10.2009, 10:04
Цитата(Alek86 @  21.10.2009,  10:00 Найти цитируемый пост)
то есть зависимость - это тупейший инструмент, что за чем компилить, не смотря на то, что либы можно и распараллелить?

почему тупейший? если target1 - стат. библиотека, а target2 - приложение, то добавив зависимость между проектами, ты избавишь себя от необходимости вручную подключать библиотеку target1.lib smile 
к тому-же, откуда системе сборки знать, что библиотеки можно собрать независимо друг от друга, если это конечно возможно?

Автор: Alek86 21.10.2009, 10:08
Цитата(Lazin @  21.10.2009,  10:04 Найти цитируемый пост)
что библиотеки можно собрать независимо друг от друга, если это конечно возможно?

можешь привести пример, когда библиотеки нельзя собрать независимо друг от друга?

Автор: Lazin 21.10.2009, 10:23
Цитата(Alek86 @  21.10.2009,  10:08 Найти цитируемый пост)
можешь привести пример, когда библиотеки нельзя собрать независимо друг от друга?

если одна использует функции другой

Автор: MTWizard 21.10.2009, 10:49
Есть ещё решения проблемы:
1. Ключ компилятора /MP позволяет внутри одного проекта собирать файлы параллельно. Не работает с некоторыми другими ключами (точно не помню, но в релизе рабоает, в дебаге - не всегда)
2. Кардинальное - поставить IncrediBuild. Будешь собирать "очень параллельно", используя ресурсы ещё и других машин (до 20 штук)

Автор: Alek86 21.10.2009, 11:01
Lazin, в первом варианте у меня написано, что если Lib2 юзает Lib1 и не ставить между ними зависимость, то обе либы собираются параллельно на ура

Добавлено @ 11:02
Цитата(MTWizard @  21.10.2009,  10:49 Найти цитируемый пост)
Кардинальное - поставить IncrediBuild. Будешь собирать "очень параллельно"

для 1 машины он работает? в смысле, параллелит? насколько я помню его диаграммы, то для одной машины он в 1 момент времени 1 файл рисовал

Автор: andrew_121 6.11.2009, 00:03
Цитата(MTWizard @  21.10.2009,  10:49 Найти цитируемый пост)
Ключ компилятора /MP позволяет внутри одного проекта собирать файлы параллельно.

Точно! smile На все ядра, вчетверо быстрей проект собирается smile 
Держи плюсик.

Автор: just_geek 6.11.2009, 00:23
Добавлю, что /MP поддерживается с 2005 студии, хоть в документации для нее этого и нет.
MSBuild поддерживает параллельную сборку, можно собирать паралельно несколько проектов. 2010 студия умеет работать с  ним.
Вместо nmake можно воспользоватся Trolltech'овским (уже Nokia) клоном nmake'a http://qt.gitorious.org/qt-labs/jom. Который поддерживает параметр -j как и GNU Make

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)