최상단 광고

2012년 6월 11일 월요일

Visual C++ 2008 멀티프로세스 컴파일 옵션




Visual C++ 컴파일러 옵션
/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 옵션과 호환되지 않는 컴파일러 옵션 및 언어 기능이 나와 있습니다.
옵션 또는 언어 기능
Description
#import! 전처리기 지시문
형식 라이브러리의 형식을 C++ 클래스로 변환한 다음 이러한 클래스를 헤더 파일에 씁니다.
/E/EP
전처리기 출력을 표준 출력(stdout)에 복사합니다.
증분 재빌드를 사용하도록 설정합니다.
포함 파일의 목록을 표준 오류(stderr)에 씁니다.
미리 컴파일된 헤더 파일을 씁니다.

진단 메시지

/MP 옵션과 호환되지 않는 옵션이나 언어 기능을 지정하면 진단 메시지가 표시됩니다. 다음 표에는 이러한 메시지와 컴파일러 동작이 나와 있습니다.
진단 메시지
Description
컴파일러 동작
#import! 지시문은/MP 옵션과 호환되지 않습니다.
컴파일러 경고 수준 옵션이 달리 지정된 경우를 제외하고는 컴파일이 종료됩니다.
processMax 인수에 잘못된 값을 지정했습니다.
컴파일러에서 잘못된 값을 무시하고 값이 1인 것으로 간주합니다.
지정한 옵션이 /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 프로젝트 설정

VCBUILD.exe 도구

Visual Studio에서는 VCBUILD.exe 도구를 사용하여 솔루션과 프로젝트를 빌드합니다. VCBUILD.exe 도구는 여러 프로젝트를 동시에 빌드할 수 있고 /MP 컴파일러 옵션은 컴파일 단위를 동시에 빌드할 수 있습니다. 응용 프로그램에 따라 /MP 및 VCBuild 중 하나 또는 모두를 사용하여 솔루션의 빌드 시간을 줄일 수 있습니다.
솔루션 빌드 시간은 부분적으로 빌드를 수행하는 프로세스의 수에 영향을 받습니다. VCBUILD.exe 도구의 /M 옵션은 동시에 빌드할 최대 프로젝트 수를 지정합니다. 마찬가지로 /MP 옵션의 processMax 인수는 동시에 빌드할 최대 컴파일 단위 수를 지정합니다. /M 옵션에서 P개의 프로젝트를 지정하고 /MP 옵션에서 C개의 프로세스를 지정하는 경우 최대 P x C개의 프로세스가 동시에 실행됩니다.
VCBuild 또는 /MP 기술을 사용할지 여부를 결정하기 위한 지침은 다음과 같습니다.
  • 프로젝트는 많고 각 프로젝트의 파일은 적은 경우 VCBuild 도구를 사용합니다.
  • 프로젝트는 적고 각 프로젝트의 파일은 많은 경우 /MP 옵션을 사용합니다.
  • 프로젝트 수와 프로젝트당 파일 수가 짝이 맞는 경우 VCBuild 및 /MP를 모두 사용합니다. 처음에는 /M 옵션을 빌드할 프로젝트 수로 설정하고 /MP 옵션을 컴퓨터의 프로세서 수로 설정합니다. 성능을 측정한 다음 최상의 결과 얻기 위해 설정을 조정합니다. 총 빌드 시간에 만족할 때까지 이 주기를 반복합니다.

/Gm 컴파일러 옵션

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