/MP (Сборка с несколькими процессами)

Этот /MP параметр может сократить общее время компиляции исходных файлов в командной строке. Параметр /MP приводит к созданию одной или нескольких копий компилятора в отдельном процессе. Затем эти экземпляры одновременно компилируют исходные файлы. В некоторых случаях общее время сборки исходных файлов может быть значительно сокращено.

Синтаксис

/MP[processMax]

Аргументы

processMax
Максимальное количество процессов, которые может создать компилятор (необязательно).

Аргумент processMax должен находиться в диапазоне от 1 до 65 536. В противном случае компилятор выдает предупреждающее сообщение D9014, игнорирует processMax аргумент и предполагает, что максимальное количество процессов равно 1.

Если опустить аргумент processMax , компилятор получает число эффективных процессоров от операционной системы на вашем компьютере и создает процесс для каждого процессора.

Замечания

Параметр /MP компилятора может значительно сократить время сборки при компиляции множества файлов. Для этого компилятор создает собственные копии (до processMax ), а затем использует их для одновременной компиляции исходных файлов. Этот /MP параметр применяется к компиляциям, но не к связыванию или созданию кода во время компоновки. По умолчанию /MP параметр отключен.

Улучшение в построении зависит от числа процессоров на компьютере, количества компилируемых файлов и доступности системных ресурсов, таких как емкость ввода-вывода. Поэкспериментируйте с параметром /MP , чтобы определить оптимальный параметр для создания конкретного проекта. Советы в разделе Рекомендациипомогут вам принять правильное решение.

Несовместимые параметры и языковые функции

Параметр /MP несовместим с некоторыми параметрами компилятора и функциями языка. При использовании несовместимого параметра компилятора с /MP параметром компилятор выдает предупреждение D9030 и игнорирует /MP этот параметр. Если вы используете несовместимый язык, компилятор выдает ошибку C2813 , затем заканчивается или продолжается в зависимости от текущего параметра уровня предупреждения компилятора.

Примечание.

Большинство параметров являются несовместимыми, так как если бы они были разрешены, параллельно выполняющиеся компиляторы одновременно записывали бы свои выходные данные в консоль или в конкретный файл. В результате произошло бы смешивание и искажение выходных данных. В некоторых случаях сочетание параметров может снизить производительность.

В следующей таблице перечислены параметры компилятора и языковые функции, несовместимые с параметром /MP :

Параметр или языковой компонент Description
#import Директива препроцессора Преобразует типы библиотеки типов в классы C++, а затем записывает эти классы в файл заголовка.
/E, /EP Копирует выходные данные препроцессора в стандартные выходные данные (stdout).
/Gm Устарело. Включает инкрементную перестройку.
/showIncludes Записывает список включаемых файлов в стандартную ошибку (stderr).
/Yc Создает файл предкомпилированного заголовка.

Диагностические сообщения

Если указать параметр или языковой компонент, несовместимый с /MP параметром, вы получите диагностическое сообщение. В следующей таблице перечислены возможные сообщения и поведение компилятора:

Диагностическое сообщение Description Поведение компилятора
C2813 Директива #import несовместима с параметром /MP . Компиляция заканчивается, если для параметра Порог предупреждений компилятора не указано иное.
D9014 Указано недопустимое значение для аргумента processMax . Компилятор игнорирует недопустимое значение и принимает значение равным 1.
D9030 Указанный параметр несовместим с /MP. Компилятор игнорирует /MP параметр.

Рекомендации

Измерение производительности

Для измерения производительности используется общее время построения. Его можно измерить с помощью обычных часов или программного обеспечения, которое вычисляет разницу между началом и завершением построения. Если компьютер оснащен несколькими процессорами, физические часы могут дать более точные результаты, чем измерение времени с помощью программного обеспечения.

Эффективные процессоры

Компьютер может иметь один или несколько виртуальных процессоров, которые также называются эффективными процессорами для каждого физического процессора. Каждый физический процессор может состоять из одного или нескольких ядер, а при использовании технологии Hyper-Threading каждое ядро определяется операционной системой как два отдельных виртуальных процессора.

Например, компьютер имеет один эффективный процессор, если он оснащен одним физическим процессором с одним ядром и отключенной технологией Hyper-Threading. Другой вариант: компьютер имеет восемь эффективных процессоров, если он оснащен двумя физическими процессорами, каждый из которых имеет два ядра, и для всех ядер включена технология Hyper-Threading. То есть (8 эффективных процессоров) = (2 физических процессора) x (2 ядра на физический процессор) x (2 эффективных процессора на ядро из-за гиперпотоков).

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

В этом случае операционная система сообщает о двух процессорах, поэтому компилятор использует два процесса в вычислении. В результате компилятор использует два процесса для выполнения сборки, так как это меньше из двух процессов и трех исходных файлов.

Исходные файлы и порядок сборки

Исходные файлы могут компилироваться не в том порядке, в котором они появляются в командной строке. Хотя компилятор создает набор процессов, содержащий копии компилятора, операционная система все равно планирует время выполнения каждого процесса. Параметр /MP не может гарантировать, что исходные файлы будут скомпилированы в определенном порядке.

Исходный файл компилируется, когда доступен процесс для его компиляции. Если число файлов превышает число процессов, первый набор файлов компилируется свободными процессами. Оставшиеся файлы обрабатываются тогда, когда процесс завершает обработку предыдущих файлов и доступен для работы на одном из остальных файлов.

Не указывайте один и тот же исходный файл несколько раз в командной строке. Может произойти несколько спецификаций, например, если средство автоматически создает файл makefile , основанный на зависимостях в проекте. Если параметр не указан /MP , компилятор обрабатывает список файлов последовательно и перекомпилирует каждый вхождения файла. Однако при указании /MP параметра разные экземпляры компилятора могут скомпилировать один и тот же файл одновременно. Разные экземпляры могут одновременно пытаться записать в один выходной файл. Один экземпляр компилятора получает эксклюзивный доступ на запись к выходному файлу и завершается успешно, а другие экземпляры компилятора завершаются ошибкой доступа к файлам.

Использование библиотек типов (#import)

Компилятор не поддерживает использование #import директивы с параметром /MP . Если возможно, выполните следующие действия, чтобы устранить проблему.

  • Переместите все #import директивы в различных исходных файлах в один или несколько файлов, а затем скомпилируйте эти файлы без /MP параметра. Результатом является набор файлов заголовка.

  • В оставшихся исходных файлах вставьте #include директивы, указывающие созданные заголовки, а затем компилируйте оставшиеся исходные файлы с помощью /MP параметра.

Параметры проекта Visual Studio

Средство MSBuild

Visual Studio использует MSBuild средство (msbuild.exe) для создания решений и проектов. /m:numberПараметр /maxcpucount:number командной строки средства MSBuild может одновременно создавать несколько проектов. /MP И параметр компилятора может одновременно создавать несколько единиц компиляции. Если оно подходит для приложения, улучшайте время сборки решения с помощью обоих или /maxcpucountобоих/MP.

Время построения решения отчасти зависит от числа процессов, выполняющих построение. Аргумент number/maxcpucount параметра MSBuild указывает максимальное количество проектов для сборки одновременно. Аналогичным образом аргумент processMax параметра компилятора /MP указывает максимальное количество единиц компиляции для сборки одновременно. Если параметр /maxcpucount задает проекты P и /MP параметр задает процессы C, то одновременно выполняются не более P x C.

Руководство по выбору того, следует ли использовать MSBuild или /MP технологию следующим образом:

  • Если в каждом проекте есть несколько проектов с несколькими файлами, используйте средство MSBuild с параметром /maxcpucount .

  • Если в каждом проекте есть несколько проектов с большим количеством файлов, используйте этот /MP параметр.

  • Если количество проектов и файлов для каждого проекта сбалансировано, используйте MSBuild и /MP. Изначально задайте /maxcpucount для параметра количество проектов для сборки и /MP количество процессоров на компьютере. Измерьте производительность и произведите настройку, чтобы добиться наилучших результатов. Повторите этот цикл, пока вы не будете удовлетворены общим временем сборки.

См. также

#import Директива
Справочник по командной строке MSBuild
/Zf (Быстрое создание PDB)