/MP (Построить с несколькими процессами)
Обновлен: Ноябрь 2007
Параметр /MP позволяет уменьшить общее время, требуемое для компиляции файлов исходного кода посредством командной строки. При использовании параметра /MP компилятор создает одну или несколько собственных копий, каждая из которых выполняется в отдельном процессе. После этого эти копии одновременно выполняют компиляцию файлов исходного кода. Таким образом, можно добиться существенного сокращения временных затрат на построение файлов исходного кода.
/MP[processMax]
Аргументы
processMax
Необязательно. Максимальное количество процессов, которое может создать компилятор.Аргумент processMax должен находиться в диапазоне от 1 до 65536. В противном случае компилятор выведет предупреждение D9014, проигнорирует аргумент processMax и примет максимальное число процессов равным 1.
Если опустить аргумент processMax, компилятор получит данные о количестве эффективных процессоров на компьютере от операционной системы и создаст процесс для каждого процессора.
Заметки
Параметр компилятора /MP может значительно сократить время, требуемое для построения при компиляции большого числа файлов. Для сокращения времени построения компилятор создает до processMax собственных копий, после чего использует эти копии для одновременной компиляции файлов исходного кода. Параметр /MP применим только к компиляции, но не применим к компоновке или созданию кода во время компоновки. По умолчанию параметр /MP отключен.
Сокращение времени построения зависит от количества процессоров на компьютере, количества компилируемых файлов и доступности системных ресурсов, например пропускной способности подсистемы ввода-вывода. Чтобы определить оптимальные настройки для построения конкретного проекта, следует экспериментировать с параметром /MP. Советы по принятию этого решения см. в разделе Рекомендации.
Несовместимые параметры и языковые компоненты
Параметр /MP несовместим с некоторыми параметрами компилятора и языковыми компонентами. При использовании с параметром /MP несовместимого параметра компилятора компилятор выдает предупреждение D9030 и игнорирует параметр /MP. При использовании несовместимого языкового компонента компилятор выдает сообщение об ошибке C2813, после чего завершает или продолжает работу в зависимости от текущего уровня предупреждений компилятора.
Примечание. |
---|
Большинство параметров являются несовместимыми, поскольку если бы они были разрешены, параллельно выполняющиеся компиляторы производили бы вывод выходных данных на консоль или в определенный файл одновременно. В результате происходило бы смешивание искажение выходных данных. В некоторых случаях сочетание параметров может снизить производительность. |
В следующей таблице перечислены параметры компилятора и языковые компоненты, несовместимые с параметром /MP.
Параметр или языковой компонент |
Описание |
---|---|
Директива препроцессора #import |
Преобразует типы библиотеки типов в классы C++, после чего записывает эти классы в заголовочный файл. |
Копирует выходные данные препроцессора в стандартный выходной поток (stdout). |
|
Включение инкрементной перестройки. |
|
Запись списка файлов включения в стандартную ошибку (stderr). |
|
Запись файла предкомпилированных заголовков. |
Диагностические сообщения
При задании параметра или языкового компонента, несовместимого с параметром /MP, будет получено диагностическое сообщение. В следующей таблице приведено описание сообщений и поведения компилятора.
Диагностическое сообщение |
Описание |
Поведение компилятора |
---|---|---|
Директива #import несовместима с параметром /MP. |
Компиляция завершается, если иное не определено с помощью параметра уровня предупреждений компилятора. |
|
Для аргумента processMax задано недопустимое значение. |
Компилятор игнорирует недопустимое значение и принимает значение, равное 1. |
|
Указанный параметр несовместим с /MP. |
Компилятор игнорирует параметр /MP. |
Правила
Измерение производительности
Для измерения производительности используется общее время построения. Время построения можно измерять с помощью физических часов или воспользоваться для этого программным обеспечением, измеряющим временной промежуток между моментом начала и завершения построения. В случае многопроцессорных систем физические часы могут дать более точные результаты, чем измерение с помощью программного обеспечения.
Эффективные процессоры
Каждому физическому процессору на компьютере может соответствовать один или несколько виртуальных процессоров, известных также как эффективные процессоры. Каждый физический процессор может иметь одно или несколько ядер, а если для ядра включен режим Hyper-Threading, то ему соответствует два виртуальных процессора.
Например, компьютер имеет один эффективный процессор, если на нем установлен один одноядерный физический процессор, а режим Hyper-Threading отключен. Для сравнения, компьютер с двумя двухъядерными процессорами и включенным режимом Hyper-Threading имеет восемь эффективных процессоров.. То есть (8 эффективных процессоров) = (2 физических процессора) x (2 ядра на процессор) x (2 эффективных процессора на ядро вследствие использования технологии Hyper-Threading).
Если аргумент processMax в параметре /MP пропущен, компилятор получает число эффективных процессоров от операционной системы и создает по одному процессу на каждый эффективный процессор. Однако компилятор не определяет, на каком процессоре должен выполняться тот или иной процесс; это решение принимается операционной системой.
Число процессов
Компилятор вычисляет число процессов, которые он будет использовать для компиляции файлов исходного кода. Это значение принимается меньшим из числа исходных файлов, указанных в командной строке, и числа процессов, явно или косвенно задаваемых с помощью параметра /MP. Максимальное число процессов можно задать явным образом, указав аргумент processMax параметра /MP. Либо можно использовать значение по умолчанию, равное числу эффективных процессоров на компьютере, если аргумент processMax пропущен.
Например, предположим, что задана следующая командная строка:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
В этом случае компилятор использует пять процессов, поскольку это меньшее значение из пяти исходных файлов и семи максимально возможных процессов. Теперь предположим, что компьютер имеет два эффективных процессора и задана следующая командная строка:
cl /MP a.cpp b.cpp c.cpp
В этом случае операционная система сообщит о наличии двух процессоров; поэтому компилятор для вычислений будет использовать два процесса. В результате компилятор произведет построение с использованием двух процессов, поскольку это меньшее значение из двух процессов и трех исходных файлов.
Исходные файлы и порядок построения
Исходные файлы могут компилироваться в порядке, отличающемся от порядка их следования в командной строке. Хотя компилятор создает набор процессов, содержащих копии компилятора, планирование выполнения каждого процесса осуществляется операционной системой. Вследствие этого, нельзя гарантировать, что исходные файлы будут компилироваться в определенном порядке.
Исходный файл компилируется тогда, когда для его компиляции имеется свободный процесс. Если число файлов превышает число процессов, первый набор файлов компилируется свободными процессами. Оставшиеся файлы обрабатываются по мере того, как процессы завершают обработку предыдущих файлов и готовы приступить к обработке следующих.
Не следует указывать в командной строке один и тот же файл исходного кода несколько раз. Это может произойти, например, если инструмент автоматически создает файл makefile на основе сведений о зависимостях в проекте. Если не указать параметр /MP, компилятор будет обрабатывать список файл последовательно и производить повторную компиляцию каждого вхождения файла. Однако если указать параметр /MP, разные компиляторы могут одновременно компилировать один и тот же файл. Как следствие, разные компиляторы будут одновременно пытаться произвести запись в один и тот же исходный файл. Один из компиляторов получит исключительное право на запись в исходный файл, в то время как другим будет отказано в доступе, что приведет к возникновению ошибки доступа к файлу.
Использование библиотек типов (#import)
Компилятор не поддерживает использование директивы #import с ключом /MP. Чтобы решить эту проблему, по возможности следуйте приведенным инструкциям.
Переместите все директивы #import, встречающиеся в разных файлах исходного кода, в один или несколько файлов, после чего скомпилируйте эти файлы без параметра /MP. В результате будет создан набор заголовочных файлов.
В оставшихся файлах исходного кода вставьте директивы #include, определяющие созданные заголовки, и скомпилируйте эти файлы с использованием параметра /MP.
Параметры проекта Visual Studio
Инструмент VCBUILD.exe
В Visual Studio для построения решений и проектов используется инструмент VCBUILD.exe. Инструмент VCBUILD.exe позволяет производить одновременное построение проектов, а параметр компилятора /MP позволяет производить одновременное построение блоков компиляции. При необходимости можно ускорить построение решения путем использования обоих параметров /MP и VCBuild или одного из них.
Время, требуемое на построение решения, частично зависит от количества процессов, посредством которых выполняется построение. Параметр /M инструмента VCBUILD.exe определяет максимальное число проектов, которые могут строиться одновременно. Аналогичным образом, аргумент processMax параметра /MP определяет максимальное число блоков компиляции, которые могут строиться одновременно. Если параметр /M задает P проектов, а параметр /MP — C процессов, то одновременно выполняется максимум PxC процессов.
При принятии решения об использовании технологии VCBuild или /MP следует руководствоваться следующим.
При наличии множества проектов, каждый из которых содержит небольшое число файлов, используйте инструмент VCBuild.
При наличии небольшого числа проектов, каждый из которых содержит множество файлов, используйте параметр /MP.
Если число проектов и файлов в каждом проекте соразмерно, используйте как VCBuild, так и /MP. Сперва присвойте параметру /M число проектов, которые необходимо построить, а параметру /MP — число процессоров, установленных на компьютере. Измерьте производительность и произведите настройку, чтобы добиться наилучших результатов. Повторяйте цикл, пока не добьетесь удовлетворительного общего времени построения.
Параметр компилятора /Gm
По умолчанию система построения проекта включает параметр компилятора /Gm (инкрементное построение) для отладочных построений и отключает его для построения выпуска. Поэтому при выполнении отладочных построений параметр компилятора /MP автоматически отключается, так как он конфликтует с параметром компилятора /Gm по умолчанию.