2009-10-07 5 views
15

Windows에서 GNU make parallel 작업 (-j)의 설정은 무엇입니까?Windows에서 만들기 (병렬 작업)

MinGW make 3.81을 사용하여 cmd.exe로 셸을 설정하려고했지만이 작업은 여러 프로세스를 만드는 데 사용되지만 "작업 대기 중"메시지와 함께 실패합니다.

이 기능과 최상의 설정은 무엇입니까? (MinGW/Cygwin/???) 누군가가 저에게 테스트 할 실제 예제를 가르쳐 주시겠습니까?

답변

2

나는 Cygwin에서 make -jn을 사용하여 아무런 단서를 보지 못했습니다. 그것은 오히려 잘 작동합니다. 나는 정기적으로 마이크로 소프트의 cl.exe 컴파일러와 함께 사용한다. 그것은 단지 나를 위해 상자에서 작동합니다. 매우 유닉스처럼, 좋은 것 ™입니다. Linux 및 Mac에 스크립트를 잘 작성하십시오. 철저히 권장합니다.

5 개의 백 슬래시가 너무 적지 만 여섯 개가 너무 많아서 MinGW make가 마음에 들지 않았습니다. 한숨! (AFAIK을 만들 때 MinGW 해킹과 백 슬래시로 구분 된 경로 이름을 함께 사용하면됩니다.)

+0

귀하의 권리. 당신이 설명하는대로 작동하도록했습니다 - 나는 단지 -j (전화 걸기를 make make ...) 할 적절한 지점을 찾기 위해 끔찍한 makefile을 풀어야했습니다. – Oliver

+0

cygwin/MinGW 쉘을 사용하는 경우 :'shell' 시스템 변수를'cmd'로 설정하는 것을 잊지 마십시오 (그렇지 않으면 sh 또는 sh.exe가 기본적으로 cygwin에서 사용됩니다 ...) 다중 프로세스 실행을 지원할 수 있어야합니다.) 'SHELL = CMD' 만 내보내십시오. 쉬운. –

+0

@Karako Noooo, 제발 그만해. 'sh'가 작동합니다. 그것은 크로스 플랫폼입니다. 병렬 처리 문제가 없습니다. (_cygwin_ 어쨌든 _mingw_을 보증 할 수 없습니다.)'cmd'는 끔찍합니다. – bobbogo

3

필자가 이해할 수있는 것처럼, GNU Make의 병렬 작업은 기본 플랫폼에 CPU로드 정보를 제공합니다. 불행히도 Windows와 호환되지 않는 방식으로 이루어지며 "make -j"명령 만이 스케일링 방식으로 수행됩니다. 그 명령 (최대 작업 수없이)은 치명적인 굶주리는 개 같은 기억을 먹을 수 있으므로 잠재적으로 꽤 위험합니다 (Qt에서 시도해 보았습니다. Qt에서 가장 큰 프로젝트 인 QtWebkit에서 충돌했습니다, 4GB RAM, Win7).

두 번째 생각에서 make -j3이 make보다 빠르게 실행된다는 느낌을 갖지만 웹 (포럼, 매뉴얼 ...)에서 찾을 수있는 것에 비추어 매우 POSIX/Linux의 특정 기능처럼 보입니다.

나는 당신의 질문에 대해 투표 결과에 놀랐습니다.

3

Windows에서 병렬 make 빌드의 문제점을 설명하는 this Danny Thorpe's blog entry이 발견되었습니다. 기본적으로 무엇을 제안하는 것이 먼저 다음과 같은 환경 변수를 설정하는 것입니다 : 그와

set SHELL=cmd.exe 

, 나는 make -j 스타일 명령을 실행 할 수 있었다,하지만 불행히도 제어 make -jN 스타일의 명령.

3

이 문제를 해결하여 모든 사람에게 해결책을 제공합니다.

MinGW-TDM (홈 페이지 : http://tdm-gcc.tdragon.net/) 또는 MinGW-Equation (다운로드 페이지 : http://www.equation.com/servlet/equation.cmd?fa=fortran)을 사용해보십시오.

(D에 64 비트 버전 :는 MinGW \ MinGW64 \ 64 비트 컴파일 된 바이너리를 사용하고자하는 경우) 예를 들어 D:\MinGW\MinGW32 32 비트 버전을 설치

이 빌드에서 실행 한 후 다음과 같은 배치 파일을 만듭니다 디렉토리 :

Set MinGW_bin=D:\MinGW\MinGW32\bin 
Set MSys_bin=D:\MinGW\msys\bin 
Set Path=%MSys_bin%;%MinGW_bin% 
mingw32-make SHELL=CMD.exe -j6 -f makefile 

http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS에서 MSYS를 다운로드 할 수 있습니다. 많은 오픈 소스 라이브러리, 응용 프로그램을 구축해야하는 유틸리티와 같은 많은 UNIX가 있습니다.

여기서 -j6은 6 개의 병렬 컴파일 작업을 실행하는 옵션입니다.

팁 : N = CPU 코어 수 (스레드)를 1.5 배 늘린 옵션 -jN을 설정할 수 있습니다. 내 경우에는 CPU에 4 개의 스레드가 있으므로이 값을 6으로 설정합니다.

참고 : 실행할 수

make.exe -jN -f 메이크

SHELL=CMD.exe 옵션없이 귀하의 컴파일 (여기서 make.exe를 병렬로 실행되지만, 경우에 호환되지 않습니다 MSYS 디렉토리에서 왔습니다).

감사합니다,

+0

정상적으로 나타납니다. MinGW는 TDM뿐 아니라 TDM도 함께 제공됩니다. 마침내 100 % CPU를 사용하여 멈추지 않는 병렬 병렬 작업을 수행합니다. LOL – rogerdpack

3

cmake-메이크는 일반적으로처럼 메이크 호출 재귀 할 때 CMake 사용자가

-jN 옵션이 작동하지 않습니다 도움이 될 팁. 그러나 생성 된 makefile에서 CMake가 이러한 구문을 통해 호출하기 때문에 다시 작동하는 구제 방법이 있습니다.

$(MAKE) -f CMakeFiles\Makefile2 <subproject> 

이것은 당신이 변수 MAKE을 수정할 수 있습니다 의미 :

mingw32-make "MAKE=mingw32-make -j3" 

지금 하위 프로젝트-make가 시작될 때마다, 그것은 다시 "-j3"옵션을 가져옵니다. 그러나 이것은 실제로 병렬 컴파일 수를 3으로 제한하지 않는다는 점에 유의하십시오. 동일한 계층 구조에서 서로 의존하지 않는 프로젝트가 3 개 이상있는 경우 3 개의 프로젝트가 모두 병렬로 작성되고 각각 3 개의 컴파일 단계가 시작됩니다. 9 개의 병렬 컴파일 단계.

cmake가 생성 한 맨 위 Makefile을 자세히 살펴보면 대상 "all"은 본질적으로 sub make 만 시작한다는 것을 알 수 있습니다.

$(MAKE) -f CMakeFiles\Makefile2 all 

그래서 우리는

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all 

를 호출하여 하위 프로젝트 병렬 처리의 한 층을 제거 할 수 있습니다하지만이보고 진행 상황을 희생.

그럼에도 불구하고 도움이되기를 바랍니다.

+0

해결 방법으로 매우 효과적입니다. 감사합니다. 나는 cmake 사용자들에게 유용 할뿐만 아니라, ---- 재귀 적 make가 그렇게 특이한 것은 아니라고 확신한다. –

+0

Urk! 이것은 큰 재귀 적 make 시스템에서해야 할 일처럼 들린다. _Every_ _make_ 호출은 3 개의 작업을 실행합니다 ('-j3'의 경우).총 수십 개의 동시 작업을 쉽게 실행할 수 있습니다! 적절한 병렬 make는 모든 인스턴스에서 최대 3 개의 작업 (이 경우)을 유지하기 위해 모든 _make_ 인스턴스가 서로 통신 할 것을 요구합니다. 영리한. – bobbogo

관련 문제