빠른 질문 : g ++이 큰 프로젝트를 더 빨리 컴파일하기 위해 g ++가 여러 인스턴스를 생성 할 수있게 해주는 컴파일러 플래그는 무엇입니까 (예 : 멀티 코어 CPU의 경우 한 번에 4 개의 소스 파일)?
make -j
거의 항상 신중하게 사용 하면 약간의 향상을 가져온다는 것입니다.
빠른 질문 : g ++이 큰 프로젝트를 더 빨리 컴파일하기 위해 g ++가 여러 인스턴스를 생성 할 수있게 해주는 컴파일러 플래그는 무엇입니까 (예 : 멀티 코어 CPU의 경우 한 번에 4 개의 소스 파일)?
make -j
거의 항상 신중하게 사용 하면 약간의 향상을 가져온다는 것입니다.
답변:
make-gnu make로 -j 플래그를 사용하여이를 수행 할 수 있습니다 (단일 프로세서 시스템에서도 도움이 됨).
예를 들어 make에서 4 개의 병렬 작업을 원할 경우 :
make -j 4
파이프를 사용하여 gcc를 실행할 수도 있습니다.
gcc -pipe
이것은 컴파일 단계를 파이프 라인으로 만들어 코어를 바쁘게 유지하는 데 도움이됩니다.
사용 가능한 추가 머신이있는 경우 distcc를 체크 아웃 할 수도 있습니다.
-j
논쟁을합니다
이러한 플래그는 없으며 각 도구가 하나의 기능 만 수행하고 잘 수행한다는 유닉스 철학에 맞서 실행됩니다. 컴파일러 프로세스 생성은 개념적으로 빌드 시스템의 역할입니다. 아마도 찾고있는 것은 GNU make에 대한 -j (jobs) 플래그입니다.
-j4를 만든다
또는 pmake 또는 유사한 병렬 make 시스템을 사용할 수 있습니다.
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.
가장 주목할 만하게, (사용 환경에 따라 사용 가능한 코어 수를 스크립팅하거나 식별하려면 많은 환경에서 실행하면 많이 변경 될 수 있음) 유비쿼터스 파이썬 함수를 사용할 수 있습니다 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
위의 주석에서 사용자 에게 무소음을 인용하는 이유를 묻는다면 :
1.5 숫자는 명시된 I / O 바운드 문제 때문입니다. 경험의 법칙입니다. 작업의 약 1/3이 I / O를 기다리고 있으므로 나머지 작업은 사용 가능한 코어를 사용합니다. 코어보다 큰 숫자가 더 좋으며 2 배까지 올라갈 수도 있습니다.
make -j`nproc`
와 nproc
GNU로 coreutils에.
make -j $(( $(nproc) + 1 ))
(공백이있는 곳에 공백을 두십시오).
nproc
사용할 수 없습니다가, 예를 들면에 manylinux1
용기, 그것은 실행 방지하여 추가 시간을 절약 yum update
/을 yum install
.
distcc는 현재 머신뿐만 아니라 distcc가 설치된 팜의 다른 머신에도 컴파일을 배포하는 데 사용할 수 있습니다.
g ++에 대해서는 잘 모르겠지만 GNU Make를 사용하는 경우 "make -j N"(여기서 N은 만들 수있는 스레드 수)은 여러 g ++ 작업을 동시에 실행할 수있게합니다 파일이 서로 의존하지 않기 때문에).
-j N
스레드가 아니라 한 번에 몇 개의 프로세스를 생성해야하는지 알려줍니다. 그것이 MS cl -MT
(실제로 멀티 스레드) 만큼 성능이 좋지 않은 이유 입니다.
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.