вторник, 23 февраля 2010 г.

Многопроцессорная компиляция проектов на VC++ 2008

Одной из отличительных особенностей процесса компиляции исходных кодов на языке программирования С++ (по сравнению с языками с «двухфазной» компиляцией) является относительно большое время компиляции. Так, если длительность процесса компиляции проекта на C#, состоящего из пары сотен файлов занимает не более пары десятков секунд (естественно, что этот показатель зависит от аппаратной конфигурации компьютера), то процесс компиляции (и линковки) аналогичного по размеру проекта на С++ может занимать в десять раз больше времени.

Второй особенностью компиляции в языках С и С++ является независимая компиляция каждого модуля трансляции (.cpp (или .c) файла) с последующей линковкой всех объектных файлов в единую библиотеку или исполняемый файл. Из-за этой особенности возникает естественный вопрос о возможности параллельной компиляции нескольких .cpp файлов параллельно на многопроцессорном или многоядерном компьютере.

Начиная с Visual C++ 2008, компилятор поддерживает дополнительный ключ компиляции (/MP и /MPn), с помощью которого можно указать использовать параллельную компиляцию нескольких .cpp файлов одновременно. Распараллеливание процесса компиляции осуществляется за счет запуска нескольких процессов cl.exe для нескольких .cpp файлов одновременно.

Количество процессов cl.exe, которые будут запущены одновременно для компиляции различных модулей трансляции можно указать явно, используя ключ /MPn (например, /MP4, для запуска 4-х процессов), либо ключ /MP (в этом случае будет запущено количество процессов, равное количеству логических процессоров).

По словам членов команды Visual C++ Team прирост производительности (точнее уменьшение времени компиляции) может составлять порядка 30%, но это очень сильно зависит от того, какой процент времени будет занят линковкой объектных файлов. Так, при полной перекомпиляции проекта этот выигрыш будет заметнее, а при перекомпиляции только нескольких файлов – менее заметен.

Я проверял влияние ключа /MP на 4-х ядерном процессоре, на проекте C++/CLI, состоящий приблизительно из 350 файлов. Результаты откровенно порадовали:

4 ядра (без ключа /MP): общее время компиляции 9:16, линковка – 1:37
4 ядра (ключ /MP): общее время компиляции 4:47, линковка – 1:40

Как видите, при полной перекомпиляции результаты весьма впечатляющие.

Помимо параллельной компиляции отдельных .cpp файлов, Visual Studio 2008 поддерживает также параллельную сборку С++ проектов (возможна параллельная сборка только независимых проектов). Хотя это также уменьшает время компиляции, существенной разницы на своих проектах я не почувствовал, поэтому и особого впечателения на меня эта возможность не произвела.

Дополнительные ссылки
1. Multi-processor builds in Orcas, Visual C++ Team Blog
2. Building projects in parallel, MSBuild Team Blog
3. /MP (Build with Multiple Processes), MSDN,
4. Using Multiple Processors to Build Projects, MSDN
5. Enabling multiprocessor support in an MSBuild host, MSBuild Team Blog
6. Did you know… Only VC supports parallel building within the IDE - #324 , Sara Ford’s Weblog,
7. MPCL Plugin

Комментариев нет:

Отправить комментарий