문제

빠른 질문 : 대형 프로젝트를 더 빨리 컴파일하기 위해 G ++가 여러 인스턴스를 스폰 할 수 있도록 컴파일러 플래그는 무엇입니까 (예 : 멀티 코어 CPU의 경우 한 번에 4 개의 소스 파일).

도움이 되었습니까?

해결책

GNU를 사용하면 -J 플래그입니다 (이것은 Uniprocessor 기계에도 도움이 될 것입니다).

예를 들어 Make에서 4 개의 병렬 작업을 원한다면 다음과 같습니다.

make -j 4

파이프에서 GCC를 실행할 수도 있습니다

gcc -pipe

이것은 컴파일 스테이지를 파이프 라인으로 만들며 코어를 바쁘게 유지하는 데 도움이됩니다.

추가 기계가 있으면 체크 아웃 할 수 있습니다. distcc, 이것은 그것들에게도 양을 팜질 할 것입니다.

다른 팁

그러한 깃발은 없으며, 각 도구가 하나의 기능 만 수행하고 잘 수행하는 UNIX 철학에 반대하는 사람이 있습니다. 산란 컴파일러 프로세스는 개념적으로 빌드 시스템의 작업입니다. 아마 당신이 찾고있는 것은 -J (Jobs) Gnu Make, LA입니다.

make -j4

또는 pmake 또는 유사한 병렬 메이크 시스템을 사용할 수 있습니다.

사람들이 언급했습니다 make 하지만 bjam 또한 비슷한 개념을 지원합니다. 사용 bjam -jx BJAM에게 구축하도록 지시합니다 x 동시 명령.

Windows 및 Linux에서 동일한 빌드 스크립트를 사용 하고이 옵션을 사용하면 두 플랫폼에서 빌드 시간을 절반으로 줄입니다. 멋진.

make 당신을 위해 이것을 할 것입니다. 조사 -j 그리고 -l 남자 페이지의 스위치. 나는 생각하지 않는다 g++ 병렬화 가능합니다.

DIRSCC는 또한 현재 기계뿐만 아니라 DIRSCC 설치가있는 농장의 다른 기계에도 컴파일을 배포하는 데 사용될 수 있습니다.

Make를 사용하는 경우 문제를 해결하십시오 -j. 에서 man make:

  -j [jobs], --jobs[=jobs]
       Specifies the number of jobs (commands) to run simultaneously.  
       If there is more than one -j option, the last one is effective.
       If the -j option is given without an argument, make will not limit the
       number of jobs that can run simultaneously.

그리고 가장 주목할만한 경우, 사용 가능한 코어 수를 스크립트하거나 식별하려면 (환경에 따라, 많은 환경에서 실행하는 경우 많은 변화가있을 수 있습니다) 유비쿼터스 Python 기능을 사용할 수 있습니다. cpu_count():

https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count

이와 같이:

make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')

왜 그런지 묻는다면 1.5 위의 의견에 사용자 Artless Noise를 인용하겠습니다.

1.5 숫자는 유명한 I/O 경계 문제 때문입니다. 그것은 경험의 규칙입니다. 작업의 약 1/3이 I/O를 기다리고 있으므로 나머지 작업은 사용 가능한 코어를 사용합니다. 코어보다 큰 숫자가 더 좋으며 2x만큼 높을 수도 있습니다.

G ++에 대해서는 잘 모르겠지만 GNU를 사용하는 경우 "Make -J N"(N MAKE -J N "(N MAKE -J NITS MATE MATE MAKE)는 Make Make G ++ 작업을 동시에 실행할 수 있습니다 (너무 길다. 파일은 서로 의존하지 않기 때문에).

GNU 평행

나는 만들고 있었다 합성 컴파일 벤치 마크 그리고 makefile을 쓰는 것을 귀찮게 할 수 없었기 때문에 다음을 사용했습니다.

sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"

설명:

  • {.} 입력 인수를 취하고 확장을 제거합니다
  • -t 진보에 대한 아이디어를 제공하기 위해 실행되는 명령을 인쇄합니다.
  • --will-cite 이를 사용하여 결과를 게시하면 소프트웨어를 인용하라는 요청을 제거합니다 ...

parallel 너무 편리하여 타임 스탬프를 직접 확인할 수 있습니다.

ls | grep -E '\.c$' | parallel -t --will-cite "\
  if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
    gcc -c -o '{.}.o' '{}'
  fi
"

xargs -P 작업을 병렬로 실행할 수 있지만 확장 조작을 수행하거나 여러 명령을 실행하는 것이 약간 편리합니다. Xargs를 통해 여러 명령을 호출합니다

병렬 연결은 다음과 같이 요청했습니다. 링크 할 때 GCC가 여러 코어를 사용할 수 있습니까?

TODO : 컴파일이 매트릭스 곱셈으로 줄일 수 있다는 것을 어딘가에서 읽었으므로 큰 파일의 단일 파일 컴파일 속도를 높일 수도 있습니다. 하지만 지금은 참조를 찾을 수 없습니다.

우분투에서 테스트 18.10.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top