다음을 통해 공유


/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 옵션을 무시합니다.

지침

성능 측정

총 빌드 시간을 사용하여 성능을 측정할 수 있습니다. 실제 시간으로 빌드 시간을 측정할 수도 있고 빌드가 시작하는 시간과 정지하는 시간 사이의 차이를 계산하는 소프트웨어를 사용할 수도 있습니다. 컴퓨터에 프로세서가 여러 개인 경우 실제 시간이 소프트웨어 시간 측정보다 더 정확한 결과를 생성할 수 있습니다.

유효 프로세서

컴퓨터에는 실제의 각 프로세서에 대해 하나 이상의 가상 프로세서(유효 프로세서라고도 함)가 있을 수 있습니다. 각 실제 프로세서에는 하나 이상의 코어가 있을 수 있으며 운영 체제에서 코어에 대해 하이퍼스레드를 사용하도록 설정하는 경우 각 코어가 두 개의 가상 프로세서로 표시됩니다.

예를 들어 컴퓨터에 한 개의 코어를 포함하는 한 개의 실제 프로세서가 있고 하이퍼스레딩을 사용할 수 없는 경우 컴퓨터에는 한 개의 유효 프로세서가 있습니다. 이와 달리 컴퓨터에 두 개의 실제 프로세서가 있고 각각에 두 개의 코어가 있으며 모든 코어에서 하이퍼스레딩을 사용할 수 있는 경우 컴퓨터에는 8개의 유효 프로세서가 있습니다. 즉, 2개의 실제 프로세서 x 실제 프로세서당 2개의 코어 x 하이퍼스레딩으로 인한 코어당 2개의 유효 프로세서에 따라 유효 프로세서가 8개가 됩니다.

/MP 옵션에서 processMax 인수를 생략하면 컴파일러가 운영 체제에서 유효 프로세서 수를 가져온 다음 유효 프로세서당 한 개의 프로세스를 만듭니다. 그러나 컴파일러는 특정 프로세서에서 실행되는 프로세스를 확인할 수 없으므로 운영 체제에서 이러한 결정을 내립니다.

프로세스 수

컴파일러에서는 소소 파일을 컴파일하는 데 사용할 프로세스의 수를 계산합니다. 이 값은 명령줄에서 지정하는 소스 파일 수와 /MP 옵션에서 명시적 또는 암시적으로 지정하는 프로세스 수 중 작은 값입니다. /MP 옵션의 processMax 인수를 지정하는 경우 최대 프로세스 수를 명시적으로 설정할 수 있습니다. 또는 processMax 인수를 생략하는 경우 기본값 즉, 컴퓨터의 유효 프로세서 수와 동일한 값을 사용할 수 있습니다.

예를 들어 다음과 같은 명령줄을 지정하는 경우를 가정합니다.

cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp

이 경우 5개의 소스 파일과 최대 7개의 프로세스 중 작은 값이 5개이므로 컴파일러에서 5개의 프로세스를 사용합니다. 또는 컴퓨터에 2개의 유효 프로세서가 있고 다음 명령줄을 지정하는 경우를 가정합니다.

cl /MP a.cpp b.cpp c.cpp

이 경우 운영 체제는 2개의 프로세서를 보고하므로 컴파일러는 해당 계산에서 2개의 프로세스를 사용합니다. 따라서 컴파일러에서는 2개의 프로세스와 3개의 소스 파일 중 작은 값인 2개의 프로세스로 빌드를 실행합니다.

소스 파일 및 빌드 순서

소스 파일은 명령줄에서 표시되는 것과 같은 순서로 컴파일되지 않을 수 있습니다. 컴파일러의 복사본을 포함하는 프로세스 집합은 컴파일러에서 만들지만 각 프로세스가 실행되는 때를 예약하는 것은 운영 체제입니다. 따라서 소스 파일이 특정 순서로 컴파일되는 것을 보장할 수 없습니다.

소스 파일은 컴파일하는 데 사용할 수 있는 프로세스가 있을 때 컴파일됩니다. 파일 수가 프로세스보다 많은 경우에는 사용 가능한 프로세스에서 첫 번째 파일 집합을 컴파일합니다. 프로세스에서 이전 파일의 처리를 마치고 나머지 파일 중 하나를 작업할 수 있게 되면 나머지 파일을 처리합니다.

명령줄에서 같은 소스 파일을 여러 번 지정하지 마십시오. 예를 들어 도구에서 프로젝트의 종속성 정보를 기반으로 하는 makefile을 자동으로 만드는 경우 이런 문제가 발생할 수 있습니다. /MP 옵션을 지정하지 않으면 컴파일러에서는 파일 목록을 순차적으로 처리하고 각 파일 항목을 다시 컴파일합니다. 그러나 /MP 옵션을 지정하면 여러 컴파일러에서 같은 파일을 동시에 컴파일할 수 있습니다. 따라서 여러 컴파일러에서 같은 출력 파일에 동시에 쓰려고 합니다. 그러면 한 컴파일러가 출력 파일에 대한 쓰기 액세스를 단독으로 얻고 다른 컴파일러는 파일 액세스 오류와 함께 실패합니다.

형식 라이브러리(#import) 사용

컴파일러에서는 /MP 스위치와 함께 #import를 전처리기 지시문을 사용할 수 없습니다. 가능하면 다음 단계에 따라 이 문제를 해결합니다.

  • 여러 소스 파일의 #import 지시문을 모두 하나 이상의 파일로 이동한 다음 이러한 파일을 /MP 옵션을 사용하지 않고 컴파일합니다. 결과는 생성된 헤더 파일의 집합입니다.

  • 나머지 소스 파일에서 생성된 헤더 파일을 지정하는 #include 지시문을 삽입한 다음 /MP 옵션을 사용하여 나머지 소스 파일을 컴파일합니다.

Visual Studio 프로젝트 설정

MSBUILD.exe 도구

Visual Studio에서는 MSBuild.exe 도구를 사용하여 솔루션과 프로젝트를 빌드합니다. MSBuild.exe 도구의 **/maxcpucount:**number(또는 **/m:**number) 명령줄 옵션은 여러 프로젝트를 동시에 빌드할 수 있습니다. /MP 컴파일러 옵션은 여러 컴파일 단위를 동시에 빌드할 수 있습니다. 응용 프로그램에 따라 /MP/maxcpucount 중 하나 또는 모두를 사용하여 솔루션의 빌드 시간을 줄일 수 있습니다.

솔루션 빌드 시간은 부분적으로 빌드를 수행하는 프로세스의 수에 영향을 받습니다. /maxcpucount MSBuild 옵션의 number 인수에서는 최대 프로젝트 수를 동시에 빌드하도록 지정합니다. 마찬가지로 /MP 컴파일러 옵션의 processMax 인수는 동시에 빌드할 최대 컴파일 단위 수를 지정합니다. /maxcpucount 옵션에서 PP개의 프로젝트를 지정하고 /MP 옵션에서 C개의 프로세스를 지정하는 경우 최대 CP P x C개의 프로세스가 동시에 실행됩니다.

MSBuild 또는 /MP 기술을 사용할지 여부를 결정하기 위한 지침은 다음과 같습니다.

  • 프로젝트는 많고 각 프로젝트의 파일은 적은 경우 MSBuild 도구를 사용합니다.

  • 프로젝트는 적고 각 프로젝트의 파일은 많은 경우 /MP 옵션을 사용합니다.

  • 프로젝트 수와 프로젝트당 파일 수가 짝이 맞는 경우 MSBuild/MP를 모두 사용합니다. 처음에는 /maxcpucount 옵션을 빌드할 프로젝트 수로 설정하고 /MP 옵션을 컴퓨터의 프로세서 수로 설정합니다. 성능을 측정한 다음 최상의 결과 얻기 위해 설정을 조정합니다. 총 빌드 시간에 만족할 때까지 이 주기를 반복합니다.

/Gm 컴파일러 옵션

기본적으로 프로젝트 빌드에서는 /Gm 컴파일러 옵션(증분 빌드)을 디버그 빌드에는 사용하고 릴리스 빌드에는 사용하지 않습니다. 따라서 디버그 빌드에서는 /MP 컴파일러 옵션이 기본 /Gm 컴파일러 옵션과 충돌하므로 자동으로 해제됩니다.

참고 항목

참조

#import 지시문 (C++)

MSBuild 명령줄 참조