2011-02-25 3 views
1

간단한 보고서를 위해 우리 클래스는 gcc -O0과 icc -O0을 모두 사용하는 클러스터에서 코드를 실행했습니다. 우리는 gcc가 최적화없이 icc보다 약 2.5 배 빠름을 발견했습니다. 왜 이런거야? gcc -O0는 실제로 약간의 최적화를 수행합니까? 아니면 단순히이 시스템에서 더 잘 작동합니까?왜 gcc -o0은 icc -o0보다 빠릅니까?

코드는 순진한 문자열 검색 알고리즘 here의 구현이며 c로 작성되었습니다.

감사합니다.

+4

최적화가없는 벤치마킹은 무의미한 makework처럼 보입니다. –

+4

어셈블리 덤프를 비교해보십시오. 원인은 분명해야합니다. – zwol

+1

대학 지정 번호. 무의미한 것은 요구 사항처럼 보입니다 – Kurru

답변

3

몇 가지 :

  • 각 컴파일러 설정 명령은 기본적으로 사용합니다. 예를 들어, GCC 빌드가 기본적으로 i686 코드를 생성하고 ICC가 i586 opcode로 자체를 제한하는 경우, 상당한 성능 차이를 볼 수 있습니다.

  • 클러스터의 실제 CPU. 인텔 CPU 대신 AMD 프로세서를 사용하는 경우 ICC는 인텔 프로세서만을 대상으로하기 때문에 단점이 있습니다.

  • 클러스터를 사용하여 언급했습니다. 이 속도 차이가 단일 프로세서에도 존재합니까? 컴파일러에서 제공하는 병렬 처리 기능을 사용했다면 상당한 차이가있을 수 있습니다.

  • 최적화가 비활성화되면 컴파일러는 각 코드 구문에 대해 미리 만들어진 "템플릿"을 사용합니다. 이러한 템플릿은 이후에 최적화되도록 설계 되었기 때문에 최적화 패스가보다 나은 코드를 생성 할 수 있도록 구성됩니다. -O0을 사용하면 속도가 느려지거나 빨라질 수도 있습니다. 예를 들어 더 명확한 초기 코드는 더 쉽게 최적화 할 수 있지만 실행 속도는 느립니다. 말했다

, 무슨 일이 일어나고 있는지 알 수있는 유일한 방법은 당신의 코드의 실행 및 필요한 경우, 프로파일의 주요 차이점은 거짓말 코드의 그 부분의 조립을 살펴하는 것입니다 .

+0

고대 CPU를 찾기가 쉽지 않을 때 누가 더 이상 i586을 사용하는지 모르겠습니다. –

+0

@ LưuVĩnhPhúc : 놀라실 것입니다. 하나는 오래된 CPU를 많이 사용하는 것입니다 - 일부는 깨질 때까지있을 것입니다. ATM, 산업용 컨트롤러, 회계 및 기록 유지에 사용되는 PC 같은 맥락에서 오래된 명령 집합을 가진 일부 CPU는 임베디드 용도로 아직 생산 중에 있습니다. 또한 성능이 중요하지 않고 응용 프로그램이 공급 업체와 상관없이 대부분의 CPU에서 작동하기를 원한다면 가장 자주 사용되는 CPU가 될 수있는 가장 낮은 공통 분모를 컴파일해야하는 경우가 많습니다. – thkala

6

성능은 -O0이 흥미롭지 않거나 아무 것도 표시하지 않습니다. 명시 적으로 "성능에 신경 쓰지 않습니다"라고 말하면 컴파일러가이를 사용합니다. 어떤 일이 생기더라도 가장 단순합니다. 무작위로, GCC의 가장 단순한 것은 특정 하드웨어 구성에서 매우 특정한 마이크로 벤치 마크에 대해 ICC가 가장 단순한 것보다 빠릅니다. 100 개의 다른 마이크로 벤치 마크를 실행했다면 ICC가 더 빠른 곳도있을 것입니다. 비록 당신이하지 않았다면, 그것은 여전히 ​​많은 것을 의미하지는 않을 것입니다. 컴파일러에서 성능을 비교하려면 최적화를 사용하십시오. 성능 최적화에 관심이 있으시면 최적화 작업을 수행하십시오.

이유가 더 빠른 이유를 알고 싶다면 실행 프로필을 만드십시오. 실행 시간은 어디에 사용됩니까? 포장 마차는 어디에 있습니까? 왜 그 포장 마차가 발생합니까? 고려해야 할

+0

우리는 강압적 인 컴파일러 벤더로부터 당신이 디버깅을위한 최적화를 꺼버릴 것이라고 배웠던 강사를 상대 할 수 있었고 따라서 최적화를하지 않고 성능에 신경을 쓰는 사람들은 ... –