Поделиться через


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

Параметр /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++, после чего записывает эти классы в заголовочный файл.

/E, /EP

Копирует выходные данные препроцессора в стандартный выходной поток (stdout).

/Gm

Включение инкрементной перестройки.

/showIncludes

Запись списка файлов включения в стандартную ошибку (stderr).

/Yc

Запись файла предкомпилированных заголовков.

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

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

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

Описание

Поведение компилятора

C2813

Директива #import несовместима с параметром /MP.

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

D9014

Для аргумента processMax задано недопустимое значение.

Компилятор игнорирует недопустимое значение и принимает значение, равное 1.

D9030

Указанный параметр несовместим с /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

Средство MSBUILD.exe

В Visual Studio для построения решений и проектов используется средство MSBuild.exe. Параметр командной строки **/maxcpucount:**number (или **/m:**number) средства MSBuild.exe может выполнять одновременное построение нескольких проектов. Параметр компилятора /MP позволяет производить одновременное построение нескольких блоков компиляции. При необходимости можно ускорить построение решения путем использования обоих параметров /MP и /maxcpucount или одного из них.

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

При принятии решения об использовании технологии MSBuild или /MP следует руководствоваться следующим.

  • При наличии множества проектов, каждый из которых содержит небольшое число файлов, используйте инструмент MSBuild.

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

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

Параметр компилятора /Gm

По умолчанию система построения проекта включает параметр компилятора /Gm (инкрементное построение) для отладочных построений и отключает его для построения выпуска. Поэтому при выполнении отладочных построений параметр компилятора /MP автоматически отключается, так как он конфликтует с параметром компилятора /Gm по умолчанию.

См. также

Ссылки

Директива #import (C++)

Справочник по командной строке MSBuild