/MP
(여러 프로세스를 사용하여 빌드)
이 /MP
옵션은 명령줄에서 원본 파일을 컴파일하는 총 시간을 줄일 수 있습니다. 이 /MP
옵션을 사용하면 컴파일러가 각각 별도의 프로세스에서 하나 이상의 복사본을 만듭니다. 그런 다음 이러한 인스턴스는 소스 파일을 동시에 컴파일합니다. 경우에 따라 원본 파일을 빌드하는 총 시간을 크게 줄일 수 있습니다.
구문
/MP
[processMax
]
인수
processMax
(선택 사항) 컴파일러에서 만들 수 있는 프로세스의 최대 수입니다.
processMax
인수의 범위는 1~65536이어야 합니다. 그렇지 않으면 컴파일러에서 경고 메시지 D9014를 실행하고, 인수를 processMax
무시하고, 최대 프로세스 수가 1이라고 가정합니다.
processMax
인수를 생략하면 컴파일러는 운영 체제에서 컴퓨터에 있는 유효 프로세서 의 수를 검색하고, 각 프로세서에 대한 프로세스를 만듭니다.
설명
/MP
컴파일러 옵션은 많은 파일을 컴파일할 때 빌드 시간을 크게 줄일 수 있습니다. 빌드 시간을 줄이기 위해 컴파일러는 최대 processMax
개의 복사본을 만들고 이러한 복사본을 사용해서 소스 파일을 동시에 컴파일합니다. 이 /MP
옵션은 컴파일에 적용되지만 연결 또는 링크 시간 코드 생성에는 적용되지 않습니다. 기본적으로 옵션은 /MP
꺼져 있습니다.
빌드 시간의 향상 정도는 컴퓨터에 있는 프로세서의 수, 컴파일할 파일의 수, 시스템 리소스(예: I/O 용량)의 가용성에 따라 달라집니다. /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 . |
지침
성능 측정
총 빌드 시간을 사용하여 성능을 측정합니다. 실제 시계로 빌드 시간을 측정할 수도 있고, 빌드의 시작과 중지 간 차이를 계산하는 소프트웨어를 사용할 수도 있습니다. 컴퓨터에 여러 프로세서가 있는 경우 실제 시계가 소프트웨어 시간 측정보다 더 정확한 결과를 보여줄 수 있습니다.
유효 프로세서
컴퓨터에는 각 물리적 프로세서에 대해 효과적인 프로세서라고 도 하는 하나 이상의 가상 프로세서가 있을 수 있습니다. 각각의 실제 프로세서에는 하나 이상의 코어가 있을 수 있으며, 운영 체제가 코어에 대한 하이퍼스레딩을 사용하도록 설정한 경우 각 코어는 두 개의 가상 프로세서로 나타납니다.
예를 들어 컴퓨터에 1개의 코어를 포함하는 실제 프로세서가 하나 있고 하이퍼스레딩이 사용되지 않으면 유효 프로세서는 하나입니다. 반면, 컴퓨터에 각각 2개의 코어를 포함하는 실제 프로세서가 2개 있고 모든 코어에서 하이퍼스레딩이 사용되면 유효 프로세서는 8개입니다. 즉, (8개의 유효 프로세서) = (2개의 물리적 프로세서) x(물리적 프로세서당 2코어) x(하이퍼스레딩으로 인해 코어당 2개의 유효 프로세서).
옵션에서 /MP
인수를 processMax
생략하면 컴파일러는 운영 체제에서 유효 프로세서 수를 가져온 다음 유효 프로세서당 하나의 프로세스를 만듭니다. 그러나 컴파일러는 특정 프로세서에서 실행되는 프로세스를 보장할 수 없습니다. 운영 체제에서 해당 결정을 내립니다.
프로세스 수
컴파일러는 소스 파일을 컴파일할 때 사용 할 프로세스의 수를 계산합니다. 이 값은 명령줄에서 지정한 원본 파일 수와 옵션을 사용하여 명시적으로 또는 암시적으로 지정하는 프로세스 수보다 작습니다 /MP
. 옵션의 인수 /MP
를 제공하는 processMax
경우 최대 프로세스 수를 명시적으로 설정할 수 있습니다. 또는 기본값을 사용할 수 있습니다. 기본값은 processMax
인수를 생략하는 경우 컴퓨터에 있는 유효 프로세서의 수와 같습니다.
예를 들어, 다음 명령줄을 지정한다고 가정해 보겠습니다.
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
이 경우 컴파일러는 원본 파일 5개 중 더 작은 프로세스와 최대 7개의 프로세스이므로 5개의 프로세스를 사용합니다. 또는 컴퓨터에 유효 프로세서가 2개 있으며 다음 명령줄을 지정한다고 가정해 보겠습니다.
cl /MP a.cpp b.cpp c.cpp
이 경우 운영 체제는 두 개의 프로세서를 보고하므로 컴파일러는 계산에 두 개의 프로세스를 사용합니다. 결과적으로 컴파일러는 두 개의 프로세스와 세 개의 소스 파일 중 더 적은 수이므로 두 개의 프로세스를 사용하여 빌드를 실행합니다.
원본 파일 및 빌드 순서
명령줄에 표시된 것과 동일한 순서로 소스 파일이 컴파일되지 않을 수 있습니다. 컴파일러는 컴파일러의 복사본을 포함하는 프로세스의 집합을 만들지만, 운영 체제는 각 프로세스의 실행 시기를 예약합니다. 이 /MP
옵션은 원본 파일이 특정 순서로 컴파일되도록 보장할 수 없습니다.
프로세스를 컴파일에 사용할 수 있을 때 소스 파일이 컴파일됩니다. 프로세스보다 파일이 더 많은 경우 첫 번째 파일 집합이 사용 가능한 프로세스에 의해 컴파일됩니다. 프로세스가 이전 파일의 처리를 완료하고 나머지 파일 중 하나에 대해 작업할 준비가 될 때 나머지 파일이 처리됩니다.
명령줄에서 동일한 원본 파일을 여러 번 지정하지 마세요. 예를 들어 도구가 프로젝트의 종속성 정보를 기반으로 하는 메이크파일을 자동으로 만드는 경우 여러 사양이 발생할 수 있습니다. 옵션을 지정 /MP
하지 않으면 컴파일러는 파일 목록을 순차적으로 처리하고 파일의 각 항목을 다시 컴파일합니다. 그러나 옵션을 지정 /MP
하면 다른 컴파일러 인스턴스가 동일한 파일을 동시에 컴파일할 수 있습니다. 다른 인스턴스가 동시에 동일한 출력 파일에 쓰려고 할 수 있습니다. 한 컴파일러 인스턴스는 출력 파일에 대한 단독 쓰기 액세스 권한을 획득하고 성공하며 다른 컴파일러 인스턴스는 파일 액세스 오류로 실패합니다.
형식 라이브러리 사용(#import
)
컴파일러는 스위치와 함께 /MP
지시문의 #import
사용을 지원하지 않습니다. 이 문제를 해결하려면 가능한 경우 다음 단계를 수행하세요.
다양한 소스 파일의
#import
모든 지시문을 하나 이상의 파일로 이동한 다음 옵션 없이/MP
해당 파일을 컴파일합니다. 그 결과 헤더 파일의 집합이 생성됩니다.나머지 원본 파일에서 생성된 헤더를 지정하는 지시문을 삽입
#include
한 다음, 옵션을 사용하여/MP
나머지 원본 파일을 컴파일합니다.
Visual Studio 프로젝트 설정
MSBuild 도구
Visual Studio는 MSBuild
도구(msbuild.exe
)를 사용하여 솔루션 및 프로젝트를 빌드합니다. /maxcpucount:number
MSBuild 도구의 (또는/m:number
) 명령줄 옵션은 동시에 여러 프로젝트를 빌드할 수 있습니다. /MP
또한 컴파일러 옵션은 동시에 여러 컴파일 단위를 빌드할 수 있습니다. 애플리케이션에 적합한 경우 둘 중 하나 또는 둘 다를 /MP
/maxcpucount
사용하여 솔루션의 빌드 시간을 개선합니다.
솔루션의 빌드 시간은 부분적으로 빌드를 수행 하는 프로세스의 수에 따라 다릅니다. MSBuild 옵션의 /maxcpucount
인수는 number
동시에 빌드할 최대 프로젝트 수를 지정합니다. 마찬가지로 컴파일 processMax
러 옵션의 /MP
인수는 동시에 빌드할 최대 컴파일 단위 수를 지정합니다. /maxcpucount
옵션이 P 프로젝트를 지정하고 /MP
옵션이 C 프로세스를 지정하는 경우 최대 P x C 프로세스가 동시에 실행됩니다.
MSBuild 또는 /MP
기술을 사용할지 여부를 결정하는 지침은 다음과 같습니다.
각 프로젝트에 파일이 거의 없는 프로젝트가 많은 경우 옵션과 함께
/maxcpucount
MSBuild 도구를 사용합니다.각 프로젝트에 파일이 많은 프로젝트가 거의 없는 경우 이
/MP
옵션을 사용합니다.프로젝트당 프로젝트 및 파일 수가 분산된 경우 MSBuild와
/MP
. 처음에는 이 옵션을 빌드할 프로젝트 수와/MP
컴퓨터의 프로세서 수로 설정합니다/maxcpucount
. 성능을 측정하고 최상의 결과를 얻을 수 있도록 설정을 조정합니다. 총 빌드 시간에 만족할 때까지 이 주기를 반복합니다.