2010-01-06 5 views
20

가능한 한 빨리 큰 프로젝트 (GCC 또는 Linux 커널)를 컴파일하려고한다고 가정 해보십시오. 하이퍼 스레딩 기능을 갖춘 CPU (예 : 인텔 코어 i7)가 하이퍼 스레딩을 사용하거나 사용하지 않도록 설정하면 더 빨리 컴파일러를 실행합니까? 이 문제를 테스트하기 위해 게시 된 벤치 마크가 있습니까?하이퍼 스레딩이 컴파일러 성능에 미치는 영향?

하이퍼 스레딩에 대한 나의 이해는 각 코어가 2 개 이상의 프로세스에서 명령어를 선택할 수 있다는 것입니다. 기능 단위가 유휴 상태에 빠질 확률이 적기 때문에 일반적으로 코어가 더 효율적입니다. 그러나 동일한 코어에서 실행되는 프로세스가 캐시와 같은 리소스를 공유하고 서로 간섭 할 수 있으므로 성능상의 불이익이 발생할 수 있습니다. 성능이 실제로 증가하는지 여부는 작업 부하에 따라 다릅니다.

따라서 컴파일러 작업 부하의 경우 성능이 향상됩니까? 그렇다면 얼마만큼?

+0

최근 경험이 없지만 컴파일이 I/O 바인딩되는 경향이 있습니까? – Ken

+0

"make -j N"으로 실행하고 다른 N? –

+0

@Nikolai, 나는 하이퍼 스레드 된 CPU를 가지고 놀았을 것입니다. 나는 이것을 묻는 중입니다. 그래서 구매하는 것이 가치가 있는지 알 수 있습니다. –

답변

26

컴파일로 coreutils-8.4 우분투 8.04 86

인텔 아톰 HT 1.6 GHz의 활성화 :

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.375s 
user 2m22.873s 
sys  0m10.541s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.707s 
user 3m26.121s 
sys  0m13.821s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.372s 
user 2m22.753s 
sys  0m10.657s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.851s 
user 3m26.145s 
sys  0m13.685s 
~/coreutils-8.4$ 

그래서 하이퍼 스레딩이 33 %에 해당하는 75 %에 실행 시간을 줄일 수 더 많은 처리 능력. 제어 실험 혼자 make -j2 우분투 8.04 x86에서로 coreutils-8.4을 컴파일 속도를 향상하지 않는 것을 보여주기 위해 여기에

을 (나는. 모든 메모리 캐시에 있는지 확인하기 위해 그들을 두 번 실행) 그리고

싱글 코어 2 쿼드 2.5 GHz VM (HT 없음) :

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.453s 
user 0m38.870s 
sys  0m5.500s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.131s 
user 0m40.450s 
sys  0m4.580s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.621s 
user 0m39.090s 
sys  0m5.340s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.165s 
user 0m40.390s 
sys  0m4.610s 
~/coreutils-8.4$ 
+0

이것은 위대하다. 제어 실험은 이것이 실제로 변화를 일으킨다는 것을 보여줍니다. 고맙습니다. –

+2

HT를 사용하지 않는 Atom에서 반복되는 측정 결과를 볼 수 있었으면 좋았을 것입니다. 또한 메모리 사용에 대한 메모는 Atom이 특히 -j2의 경우 캐시를 스왑 또는 삭제하기 시작할 수 있으므로 좋을 것입니다. – Eroen

+0

Atom은 Nehalem 또는 Sandybridge 계열 CPU 또는 AMD Ryzen보다 명령 수준 병렬성을 악용하는 경우 악성 코드입니다. HT는 주류 CPU보다 Atom에 더 많은 도움이 될 수 있습니다.또는 주류 CPU가 더 많은 캐시와 더 많은 실행 리소스 (그리고 더 높은 분기 예측 불이익을 가지며, HT를 사용하면 다른 스레드가 잘못 추측 한 상태에서 복구하는 동안 CPU를 사용하게되므로). 따라서 HT는 주류 CPU에서도 상당한 도움을 줄 수 있지만 그 비율은 상당히 다를 수 있습니다. –

0

모두 컴파일러가 멀티 스레드로 작성되었는지 여부에 달려 있습니다. 그렇다면 OS가 컴파일러의 스레드의 다른 부분을 다른 코어에 스케쥴 할 수 있기 때문에 하이퍼 스레딩이 약간 속도가 빠르다. 나는 컴파일이 일반적으로 집중적 인 처리보다 I/O 바인딩이 더 많다는 것을 Ken과 동의한다. 따라서 빠른 하드 드라이브는 100 개의 코어를 가진 신속한 프로세서보다 더 필요하다.

+0

컴파일러가 make -j N (N은 논리 프로세서의 수임)을 사용하여 호출하는 방법은 어떻습니까? 나는 별개의 컴파일러 프로세스가 어떤 데이터도 공유하지 않기 때문에 실제로 성능이 많이 저하된다는 점을 염려합니다. –

+2

1) 충분한 물리적 메모리가 제공된다면 언제든지 컴파일 (Linux의 경우 어쨌든)을 비 -O 바인딩으로 만들 수 있습니다. 2) 대중적인 빌드 시스템은 많은 컴파일러 프로세스를 병렬로 호출 할 수 있기 때문에 멀티 스레드 컴파일러를 문제없이 만들 수 있습니다. (링커는 적다.) – Eroen

관련 문제