GCC vs. Clang/LLVM: An In-Depth Comparison of C/C++ Compilers

Visual C++, GNU Compiler Collection (GCC), and Clang/Low Level Virtual Machine (LLVM) are three mainstream C/C++ compilers in the industry. Visual c++는 Gui(그래픽 사용자 인터페이스)를 제공하며 디버깅하기 쉽지만 Linux 플랫폼에는 적합하지 않습니다. 따라서이 문서는 주로 Gcc 와 Clang/LLVM 을 비교합니다.

GCC 는 GNU 에서 개발 한 프로그램 언어 컴파일러입니다. GNU 일반 공중 사용권(GPL)및 GNU Lesser 일반 공중 사용권(LGPL)에 따라 출시 된 자유 소프트웨어 세트입니다. GNU 및 Linux 시스템의 공식 컴파일러이며 다른 UNIX 운영 체제를 컴파일하고 작성하기위한 주요 컴파일러입니다.

LLVM 에는 일련의 모듈화 된 컴파일러 구성 요소와 도구 체인이 포함되어 있습니다. 컴파일,런타임 및 유휴 시간 동안 프로그램 언어 및 링크를 최적화하고 코드를 생성 할 수 있습니다. LLVM 은 여러 언어로 된 컴파일러의 배경 역할을 할 수 있습니다. Clang 은 C,C++,Objective-C 또는 Objective-C++컴파일러로 LLVM 을 기반으로 C++로 컴파일되고 Apache2.0 라이센스하에 릴리스됩니다. Clang 은 주로 GCC 보다 우수한 성능을 제공하는 데 사용됩니다.

장기적인 개발과 반복을 통해 gcc,Clang 및 LLVM 은 업계에서 성숙한 컴파일러가되었습니다. 그렇다면 어떤 컴파일러가 더 낫습니까? 프로그램과 시스템을 컴파일하고 빌드하기 위해 어느 것을 사용해야합니까?

의 의미는 좋은 컴파일러

현대적인 프로세서는 모든 superscalar 과 긴 파이프라인,그리고 복잡한 내부 구조,그리고 그들은 지원 벡터장 단위에서 복잡한 명령어 집합을 컴퓨터(CISC)또는 감소 명령어 집합을 컴퓨터(RISC)아키텍처를 기반으로 합니다. 을 위해 많은 프로그램을 포함하는 일반적인 계산 집약적인 커널,프로그래머로 사용할 수 있는 벡터장의 명령을 크게 개선 프로그램 실행을 성과입니다. 예를 들어,행렬 및 벡터 연산에서 결합 된 곱셈 및 덧셈 명령은 성능 및 정확도를 향상시키는 데 사용됩니다. 비트 마스크 명령은 벡터 연산에서 분기 처리에 사용됩니다. 그러나를 달성하기 위해,최고의 성능,프로그래머와 컴파일러는 여전히 필요가 많이 소비하는 노력의 작업을 처리하기 위해 복잡한 모드 메모리 액세스와 표준이 아닌 커널입니다.

또한 표준의 현대적인 고급 언어로 지속적으로 추상적인 정보의 기본적인 하드웨어 및 데이터 구조체를 생성하는 일반적인 코드는 것은 논리적인 수학적 대신 특정 작업 지침과 메모리 액세스 경로. C++표준은 점점 더 표현적이고 추상적입니다. 파이썬은 더 낮은 실행 속도의 비용으로도 더 읽기 쉽고 표현력이 뛰어나기 때문에 인기가 있습니다. 표현력이 높을수록 프로그래머가 컴파일 한 복잡한 구조에서 좋은 어셈블리 코드를 생성하는 컴파일러의 부담이 커집니다. 컴파일러는 더 똑똑해야하며 코드를 사용하여 성능을 극대화하기 위해 더 열심히 노력해야합니다. 모든 컴파일러가이를 수행 할 수있는 것은 아닙니다. 컴파일러를 선택할 때 먼저 동일한 코드 세그먼트가보다 효율적인 어셈블리 명령을 생성 할 수 있는지 여부를 고려해야합니다.고성능 실행 프로그램을 생성하는 것 외에도 최신 컴파일러도 높은 성능을 가져야합니다. C++의 대형 소프트웨어 프로젝트에는 수백에서 수천 개의 개별 번역 단위가 포함될 수 있습니다. 각 번역 단위에는 수천 줄의 코드가 포함될 수 있습니다. C++코드는 많은 수의 템플릿 기반 프로그래밍 기술을 사용할 수도 있습니다. 이러한 기술은 컴파일러가 대상 파일을 생성하기 위해 관련 정보를 여러 번 전송해야합니다. 컴파일 큰 크기의 C++프로젝트는 몇 시간이 걸릴 수 있습니다,그리고 여러 상호 의존한 변경을 제출해야합니다 동시에 개발. 각 제출에는 개발자가 대부분의 코드 라이브러리를 다시 컴파일해야합니다. 따라서 더 빠른 컴파일러(빌드 도구)는 대규모 팀의 높은 생산성을 달성하는 데 중요합니다.

측면에서의 언어 확장자,현대 컴퓨팅 시스템으로 여러 알갱이,벡터 처리 기능,그리고 가속기 기능을 제공하수한 자연의 기능 일반적인 프로그래밍 언어입니다. 따라서 OpenMP 및 OpenACC 와 같은 특정 고성능 컴퓨팅(hpc)프레임 워크는 이러한 격차를 메울 수 있습니다. 이러한 프레임워크를 제공 응용 프로그램 인터페이스(Api)를 프로그래머가 사용할 수 있는 표현하는 병렬 처리 코드입니다. 컴파일러와 해당 런타임 라이브러리는 병렬 코드를 프로세서 아키텍처에 매핑해야합니다. 많은 HPC 프로젝트는 개발자와 하드웨어 제조업체가 확장하고있는 OpenMP 및 OpenACC 표준에 따라 다릅니다. 따라서 컴파일러는 언어 확장 표준의 개발을 따라 잡아야합니다.결론적으로 좋은 컴파일러를 사용하면 단점에 맞서 싸우기보다는 프로그래밍 과정에 집중할 수 있습니다. 그것은 지원할 수 있는 최신의 언어 표준 생성,최적화된 명령에서 가장 추상적인 코드의 소스 코드를 컴파일 짧은 시간에.

GCC 개발 역사

gcc 를 배우기 전에 먼저 GNU 프로젝트를 이해해야합니다. Richard Stallman 은 UNIX 와 같은 오픈 소스 소프트웨어 시스템을 구축하기 위해 1984 년 GNU 프로젝트를 시작했습니다. GNU 운영 체제는 시간이 지남에 따라 광범위하게 발전하지 않았습니다. 그러나 Make,Sed,Emacs,Glibc,GDB 및 GCC 와 같은 많은 우수하고 유용한 오픈 소스 소프트웨어 도구를 배양했습니다. 이러한 gnu 오픈 소스 소프트웨어와 리눅스 커널은 함께 GNU/리눅스 시스템을 구성한다. 처음에 GCC 는 gnu 시스템에 c 프로그래밍 언어를 기반으로 안정적이고 신뢰할 수있는 컴파일러를 제공했습니다. 전체 이름은 GNU C 컴파일러입니다. 나중에 더 많은 언어(예:Fortran,Obj-C 및 Ada)가 지원되었으며 gcc 의 전체 이름이 GNU 컴파일러 컬렉션으로 변경되었습니다.

GCC-1.0 은 30 년 전인 1987 년 Richard Stallman 에 의해 발표되었습니다. 소프트웨어 관점에서 볼 때 매우 오래되었습니다. 누군가가 수집 GCC 개발 레코드에서 사 1989 년과 2012 년,그리고 생산 삼십 분 거리에 애니메이션 영상(GNU Compiler Collection dev 역사 1989-2012),직관적으로 보여주는 개발 프로세스하는 프로그램입니다. 우리는 그 버전에서 GCC 의 개발 역사에 대해 배울 수 있습니다:

  • gcc-1.0:1987 년 Richard Stallman 이 발표했습니다.
  • GCC-2.0:1992 년에 출시되었으며 c++을 지원했습니다. 나중에,GCC 커뮤니티에 분할되었기 때문에 리처드 스톨만이 정의 GCC 으로 신뢰할 수 있는 C 컴파일러의 GNU 시스템 및 생각하는 GCC 에서는 시간이기에 충분했 GNU 시스템 및 개발에 초점을 이동해야에서 GCC GNU 시스템 자체. 다른 주요 개발자들은 GCC 를 계속 개선하고 다양한 측면에서보다 급진적 인 발전과 개선을하기를 희망했습니다. 이 활동적인 개발자들은 1997 년 GCC 커뮤니티를 떠나 EGCS 포크를 개발했습니다.
  • GCC-3.0:분명히,개발자는 일반적으로 강한 욕망에 대한 좋은 컴파일러입니다. EGCS 포크는 원활하게 개발되어 점점 더 많은 개발자들에 의해 인정되었습니다. 결국 EGCS 는 새로운 GCC 백본으로 사용되었고 gcc-3.0 은 2001 년에 출시되었습니다. 분할 공동체는 다시 합병되었지만 리차드 스톨만의 영향력은 어느 정도 약화되었다. 또한 GCC 산업위원회는 GCC 의 발전 방향을 결정하기 시작했다.
  • GCC-4.0:2005 년 출시. 이 버전은 Ssa(Tree Serial Storage Architecture)에 통합되었으며 gcc 는 최신 컴파일러로 발전했습니다.
  • GCC-5.0:2015 년 출시. 나중에 GCC 버전 정책이 조정되어 매년 주요 버전이 출시되었습니다. 예기치 않은 이점은 버전 번호가 연도와 일치한다는 것입니다. 예를 들어,GCC-7 은 2017 년에 출시되었으며 gcc-9 는 2019 년에 출시되었습니다.

이제 GCC 개발은”현대 크로니클”에 들어갔다. LLVM 의 경쟁 압력에 직면하여 GCC 커뮤니티는 컴파일을 가속화하고 컴파일 경고 정보를 개선하는 등 많은 조정을 적극적으로 수행했습니다. 지난 30 년 동안,GCC 는 에서 진화에 도전자 컴파일러 기업을 주요 컴파일러를 위한 리눅스 시스템,지금의 도전에 직면 명령행 도구가 들어 있습니다. 다행히도 GCC 커뮤니티는 gcc 개발을 가속화하기 위해 조정을하고 있습니다. 우리가 기대할 수 있는 경쟁을 두 컴파일 기술을 제공하는 것을 계속하는 소프트웨어 개발자에게 더 나은 컴파일러입니다.

Clang 및 LLVM 의 개발 이력

LLVM 은 2000 년 Uuic 에 대한 Chris Lattner 의 연구에서 유래되었습니다. Chris Lattner 는 모든 정적 및 동적 언어에 대한 동적 컴파일 기술을 만들고 싶었습니다. LLVM 은 bsd 라이센스에 따라 개발 된 오픈 소스 소프트웨어 유형입니다. 초기 버전 1.0 은 2003 년에 출시되었습니다. 2005 년,애플 Inc. 고 Chris Lattner 와 그의 팀은 개발 프로그래밍 언어와 컴파일러를 위한 애플 컴퓨터,그 후의 개발 LLVM 빠른 차선에 들어갔다. LLVM2.5 부터 매년 2 개의 마이너 LLVM 버전이 출시되었습니다(일반적으로 3 월과 9 월). 2011 년 11 월 llvm3.0 이 릴리스되어 기본 XCode 컴파일러가되었습니다. XCode5 는 기본적으로 Clang 및 LLVM5.0 을 사용하기 시작했습니다. 버전 정책은 LLVM5.0 이상 버전에 맞게 조정되었으며 매년 두 가지 주요 버전이 출시됩니다. 현재 안정 버전은 8.0.

Llvm 의 이름은 먼저 저수준 가상 머신에서 축약되었습니다. 이 프로젝트는 가상 머신의 생성에만 국한되지 않으므로 llvm 이라는 약어는 종종 의문을 제기합니다. LLVM 이 개발 된 후에는 많은 컴파일 도구와 저수준 도구 기술에 대한 집합적인 용어가되어 이름이 덜 적절 해졌습니다. 개발자는이 약어 뒤에 의미를 포기하기로 결정했습니다. 지금 LLVM 가 공식적인 브랜드 이름,적용 가능한 모든 프로젝트에서 LLVM 포함하여,LLVM 중간 표시(LLVM IR),이 도구는 디버깅,그리고 LLVM C++표준 라이브러리입니다. LLVM 로 사용할 수 있는 전통적인 컴파일러,JIT 컴파일러,어셈블러,디버거,정적 분석 도구,그리고 다른 기능을 위해 관련된 프로그래밍 언어입니다.

2012 년 LLVM 은 UNIX,WWW,TCP/IP,TeX 및 Java 와 같은 기존 시스템과 함께 acm(Computing Machinery Association for Computing Machinery)의 소프트웨어 시스템 상을 수상했습니다. LLVM 은 새로운 프로그래밍 언어 도구 체인의 구현을 크게 단순화합니다. 최근 몇 년 동안 Swift,Rust 및 Julia 와 같은 많은 새로운 프로그래밍 언어가 llvm 을 컴파일 프레임 워크로 사용했습니다. 또한 LLVM 은 Mac OS X,iOS,FreeBSD 및 Android 시스템의 기본 컴파일러가되었습니다.

Clang

Clang 은 gcc 를 대체 할 수있는 프론트 엔드 컴파일러를 제공하도록 설계되었습니다. 애플 주식 회사 (나중에 다음을 포함하여)gcc 를 공식 컴파일러로 사용하고 있습니다. Gcc 는 항상 오픈 소스 커뮤니티에서 표준 컴파일러로 잘 수행되었습니다. 그러나 Apple Inc. 컴파일 도구에 대한 자체 요구 사항이 있습니다. 한편으로,애플 주식 회사. Objective-C 언어(또는 나중에 C 언어)에 대한 많은 새로운 기능이 추가되었습니다. 그러나 GCC 개발자는 이러한 기능을 허용하지 않았으며 이러한 기능을 지원하기 위해 낮은 우선 순위를 할당했습니다. 나중에,그들은 단순히 별도의 개발을 위해 두 개의 지점으로 나뉘었고 결과적으로 Apple Inc.가 발표 한 GCC 버전이었습니다. 공식 버전보다 훨씬 이전입니다. 반면에 GCC 코드는 고도로 결합되어 있으며 별도로 개발하기가 어렵습니다. 또한 이후 버전에서는 코드 품질이 계속 감소합니다. 그러나 Apple Inc.에서 요구하는 많은 기능이 있습니다. (예:IDE(integrated Development Environment)지원 개선)모듈로 GCC 를 호출해야하지만 GCC 는 그러한 지원을 제공하지 않습니다. 또한 GCC 런타임 라이브러리 면제는 근본적으로 LLVM GCC 의 개발을 제한합니다. 또한 라이센스에 의해 제한,애플 Inc 의. LLVM 을 사용하여 gcc 를 기반으로 코드 생성 품질을 더욱 향상시킬 수 없습니다. 따라서 Apple Inc. gcc 를 완전히 대체하기 위해 처음부터 c,C++및 Objective-C 언어의 프론트 엔드 클랑을 작성하기로 결정했습니다.

이름에서 알 수 있듯이 Clang 은 c,C++만 지원하며 Objective-C. 개발은 2007 년에 시작되었으며 C 컴파일러가 처음 완료되었습니다. Objective-C cloud 용 Clang 은 2009 년 프로덕션 환경에 완벽하게 사용됩니다. C++에 대한 지원도 빠르게 진행되었습니다. Clang3.3 은 c++11 을 완벽하게 지원했으며 Clang3.4 는 C++14 를 완벽하게 지원했으며 Clang5 는 c++17 을 완벽하게 지원했으며 그 당시 모두 GCC 보다 훨씬 앞서있었습니다.

Clang/LLVM 및 GCC 커뮤니티

다른 오픈 소스 소프트웨어 커뮤니티와 마찬가지로 gcc 커뮤니티는 자유 소프트웨어 애호가와 해커가 지배합니다. 개발 과정에서 오늘날 gcc 커뮤니티 관리 및 참여 메커니즘이 점차 형성되고 있습니다. 현재 GCC 지역은 상대적으로 안정적이고 잘 정의된 아는 사람 사회에서는 각 사람은 명확한 역할과 의무

  • 리처드 스톨만이고 Free Software Foundation(FSF):지만 거의에 관여하는 GCC 커뮤니티 관리,리처드 스톨만이고 재단은 여전히 분리된 라이센스 및 법률 자문을 맡고 있습니다.
  • GCC 산업위원회: GCC 커뮤니티 업무,기술 독립적 인 GCC 개발 주제 및 검토 자 및 유지 관리자의 임명 및 발표를 관리합니다. 현재 13 명의 회원이 있습니다.
  • Global maintainers:그들은 gcc 개발 활동을 지배합니다. 어느 정도까지,그들은 GCC 의 발전 추세를 결정합니다. 현재 gcc 산업위원회(Gcc Industrial Committee)에 모두 사무실을 두지 않는 13 명의 글로벌 메인테이너가있다.
  • 프론트 엔드 중 최종,관리자들과 백엔드:그들은 관리자의 프론트 엔드 백엔드,그리고 다른 모듈을 사용합니다. 그들은 해당 GCC 모듈의 코드를 담당하며 그 중 많은 부분이 모듈 코드의 주요 기여자입니다. 리뷰어는 일반적으로이 그룹으로 분류된다는 점에 유의해야합니다. 차이는 것을 검토할 수 없는 승인 자신의 패치하는 동안,관리자들이 제출할 수 있습니다 자신의 수정이 이내에 그 책임의 범위의 승인 없이 검토합니다.
  • 기여자:GCC 커뮤니티에서 가장 광범위한 개발자 그룹입니다. 저작권 계약서에 서명 한 후 모든 개발자는 커뮤니티의 승인 허가 후 쓰기를 신청 한 다음 스스로 코드를 제출할 수 있습니다.

다른 오픈 소스 커뮤니티와 마찬가지로 성숙한 GCC 커뮤니티는 더 이상 해커에 의해 지배되지 않습니다. 상업 회사는 개발자 모집 및 개발 회의 후원과 같은 커뮤니티에서 중요한 역할을하기 시작했습니다. 현재 GCC 커뮤니티는 다음과 같은 유형의 상업 회사에 의해 지배됩니다:

  • 주로 RedHat 및 SUSE 를 포함한 시스템 공급 업체.
  • 주로 Intel,ARM,AMD 및 IBM(PowerPC)을 포함한 칩 공급 업체.
  • Ada 언어를 기반으로하는 CodeSourcery 및 adacore 와 같은 도구 체인 서비스 제공 업체와 같은 전문 공급 업체. CodeSourcery 는 화려한 역사를 가지고 있었고 많은 유명한 개발자를 모집했지만 멘토가 인수 한 후에는 거절했습니다.

현재 GCC 커뮤니티에서는 칩 공급 업체가 백엔드 개발을 지배하고 시스템 공급 업체는 다른 개발 영역을 안내합니다. 커뮤니티 개발 측면에서 GCC 코드는 현재 자체 SVN 서버에서 호스팅됩니다. Git API 는 개발 및 제출을 용이하게하기 위해 제공됩니다. 패치 검토는 리눅스 커널 커뮤니티에서와 유사하며 메일 링리스트 양식을 사용합니다. 위에서 언급했듯이 GCC 커뮤니티는 비교적 안정적인(또는 폐쇄 된)지인 사회입니다. 커뮤니티는 기본적으로 매년 150~200 명의 적극적인 참여자를 보유하고 있으며 매년 9 월에 개발자 컨퍼런스를 개최합니다. 2019 년 9 월 캐나다 몬트리올에서 개발자 컨퍼런스가 개최됩니다.

LLVM 커뮤니티

LLVM 커뮤니티는 멍청한 놈 친화적 인 컴파일러 커뮤니티입니다. 새로운 사용자 및 패치 리뷰의 질문에 신속하게 응답합니다. 이것은 또한 기준과 원본에 대한 후속 LLVM Foundation 토론하고의 채택 여 커뮤니티의 행동 강령 및 원인 일련의 정치적으로 올바른 토론합니다.

모든 LLVM 프로젝트 및 문제는 DevExpress 전자 메일 목록을 통해 논의되며 코드 제출은 commits 전자 메일 목록을 통해 통보됩니다. 모든 버그 및 기능 수정은 버그 목록을 통해 추적됩니다. 제출 된 패치는 마스터 브랜치에 권장됩니다. 스타일은 Llvm 코딩 표준을 준수하며 코드 검토는 Phabricator 를 통해 수행됩니다. 현재 LLVM 코드 저장소는 GitHub 로 마이그레이션되었습니다.

GCC 커뮤니티와 달리 LLVM 커뮤니티에는 LLVM 재단 만 있습니다. LLVM 재단에는 8 명의 회원이 있습니다. LLVM 커뮤니티 업무를 관리하는 것 외에도 llvm 재단의 각 구성원은 기술과 관련된 LLVM 개발 문제를 안내해야합니다. 현재 대통령은 Chris Lattner 의 아내 인 Tanya Lattner 입니다. Chris Lattner 자신도 재단의 일원이며 LLVM 커뮤니티와 llvm 의 개발 방향에 대한 강력한 통제권을 가지고 있습니다.

LLVM 커뮤니티의 코드 검토 정책은 기본적으로 GCC 커뮤니티와 동일합니다. 차이로 인해 빠르게 개발의 분석에,많은 참여자가 있지 않 commit 액세스 권한을 제출해야 자신의 코드를 통해 관리자들. 현재 Clang 및 LLVM 커뮤니티에는 매년 1,000 명 이상의 기여자가 있습니다. 일반적으로 개발자 컨퍼런스는 매년 4 월과 10 월에 개최됩니다. 2019 년 10 월 개발자 컨퍼런스는 미국 산호세에서 개최됩니다.

Llvm 라이센스는 UIUC 라이센스에서 Llvm 예외가있는 Apache2.0 라이센스로 변경됩니다. LLVM 런타임 라이브러리가 MIT 라이센스를 기반으로하고 프로젝트에 필요한 특허 허가가 너무 광범위하다는 문제를 해결하는 데 주로 사용됩니다. 본 라이센스에 따라,LLVM 할 수 있는 사람을 도출하 상업적인 제품에서 LLVM 어떠한 제한 없이,필요로하지 않는 모든 파생상품을 제공하는 오픈 소스 코드,따라서 홍보하는 광범위한 사용의 것을 포함:

  1. 개인,내부 또는 상업적 목적으로 llvm 을 전체 또는 부분적으로 다운로드하거나 사용하는 행위. 프로젝트에 다시 기여하지 않고 llvm 코드를 수정할 수있는 기능.
  2. llvm 을 포함하는 패키지 또는 릴리스 버전을 만듭니다. 다른 모든 주요 오픈 소스 라이센스(BSD,MIT,GPLv2 및 GPLv3 포함)가 승인 한 코드와 LLVM 의 연관성.
  3. llvm 을 다시 배포 할 때 저작권 고지를 유지해야합니다. 저작권 헤더를 삭제하거나 바꿀 수 없습니다. Llvm 이 포함된 이진 파일에는 저작권 공지가 포함되어야 합니다.

성능 비교 between GCC and LLVM

아키텍처:x86_64
프로세서:Intel(R)Xeon(R)플래티넘 [email protected]
L1 데이터 캐시:32KB
L2 캐시:1,024KB
L3 캐시:33,792KB
메모리:800GB
운영 체제:알리바바 그룹 Enterprise Linux Server 릴리스 7.2(Paladin)
Kernel: 4.9.151–015.알리 3000.알리오스 7.x86_64
컴파일러:그램/LLVM8.0GCC8.3.1

벤치마크

사양 CPU2017 년의 CPU 하위 시스템 테스트를 위한 도구 테스트는 CPU,캐시,메모리,컴파일러입니다. 그것은 포함 43 의 테스트는 네 가지 범주가 포함 SPECspeed2017INT 및 FP 을 테스트하는 정수 속도와 부동 소수점 연산 속도와 SPECrate2017INT 및 FP 을 테스트하는 정수한 동시성 평가 및 부동 소수점 동시성 평가. Clang 은 Fortran 언어를 지원하지 않습니다. 따라서이 예에서 SPEC 속도 테스트 세트의 C/C++프로그램은 Clang 과 GCC 에 의해 생성 된 이진 프로그램 간의 단일 코어 성능 차이를 테스트하는 데 사용됩니다. 다음 표에는 사양 CPU2017C 및 C++세트가 나와 있습니다.

CINT2017SpeedCFP2017Speed600.perlbench_s619.lbm_s602.gcc_s644.nab_s605.mcf_s620.omnetpp_s623.xalancbmk_s625.x264_s631.deepsjeng_s641.릴라 _s657.xz_s

테스트 방법

LLVM-lnt 자동화 프레임워크를 이용하 테스트를 수행하고 성능을 비교합니다. SPEC CPU 의 runcpu 와 동일한 방식으로 실행됩니다. LLVM-lnt 가 실행되기 전에 캐시(echo3>/proc/sys/vm/drop_caches)가 지워지고 테스트 데이터 세트가 실행됩니다. 다음으로 ref 데이터 세트가 세 번 실행됩니다. 세 가지 ref 테스트 실행 결과의 평균값이 최종 결과로 사용됩니다. 을 줄이기 성능 변화에 의해 발생 CPU 마이그레이션 또는 컨텍스트 스위치에서 실행되는 프로세스에 대한 테스트 데이터 집합 및 ref 데이터베이스에 바인딩하여 CPU 코어를 사용하여 CPU 를 선호도가 도구입니다. 컴파일을 위해 시간 시험,이 방법을 사용하는 스레드가 1 을 구축하는 테스트 프로그램과 비교한 테스트 항목을 컴파일되었습니다. 컴파일 시간에는 링커 실행 시간이 포함되지 않습니다. 모든 테스트 프로그램의 모든 소스 파일이 생성되는 시간 만 포함합니다.

컴파일 성능 비교

GCC 컴파일 프로세스는 다음과 같습니다: 소스 파일을 읽고,소스 파일을 전처리하고,IR 로 변환하고,최적화 및 어셈블리 파일을 생성합니다. 그런 다음 어셈블러는 객체 파일을 생성합니다. Clang 과 LLVM 은 독립적 인 컴파일러에 의존하지 않지만 백엔드에서 자체 구현 된 컴파일러를 통합합니다. 어셈블리 파일을 생성하는 프로세스는 오브젝트 파일을 생성하는 프로세스에서 생략된다. 객체 파일은 IR 에서 직접 생성됩니다. 게다가 GCC IR 과 비교하여 LLVM IR 의 데이터 구조는보다 간결합니다. 컴파일하는 동안 메모리를 적게 차지하고 더 빠른 순회를 지원합니다. 따라서 Clang 및 LLVM 은 컴파일 시간 측면에서 유리하며,이는 아래 그림과 같이 사양 컴파일에서 얻은 데이터에 의해 입증됩니다. Clang 은 gcc 와 비교하여 단일 스레드 컴파일 시간을 5%~10%줄입니다. 따라서 Clang 은 대규모 프로젝트 건설에 더 많은 이점을 제공합니다.

의 비교 SPEC 컴파일 시간

의 비교를 실행 성능

대부분의 클라우드 작업을 필요로 하는 응용 프로그램을 실행할 수 있습에서는 서로 다른 클러스터입니다. 이러한 응용 프로그램을 만들 때 기계 관련 매개 변수를 지정하지 마십시오. 수요 변화로 인한 빠른 반복에 적응하려면 오프 프레미스 워크로드도 디버깅할 수 있어야 합니다. 따라서,따로부터 안정적이고 공통 라이브러리를 높일 수 있도록 컴파일을 최적화 수준,작업체는 낮은 컴파일하고 최적화 수준(O2 또는 아래). 이 요구 사항을 충족하려면 이 문서 비교한 성능의 서로 다른 컴파일러에는 O2 및 O3 최적화 수준에 대한 INT 속도 프로그램으로,다음 그림에 표시된:

의 성능 비교 SPEC CPU2017INT 속도

GCC 는 1%4%의 성능을 통해 이점그램 및 이에 대한 대부분의 프로그램에는 O2 및 O3 레벨,그리고 평균은 약 3%성과 장점에 대한 SPEC CPU2017INT 속도입니다. 600 의 관점에서.perlbench_s 및 602.gcc_s/O2,GCC 는 큰 성능 이점(10%이상)을 가지고 있습니다. 이 두 테스트 항목에는 뛰어난 핫스팟이 없으며 컴파일러의 포괄적 인 최적화 효과를 반영 할 수 있습니다. 테스트 결과는 gcc 가 성능 최적화에 항상 유리하다는 것을 보여줍니다. 그러나 631 을 포함한 두 가지 AI 관련 프로그램의 경우.deepsjeng_s 및 641.사양 테스트에 새로 추가 된 leela_s,Clang 및 LLVM 은 gcc 와 비교하여 성능을 3%이상 향상시킵니다. 이것은 또한 최적화 측면에서 LLVM 의 급속한 진전을 반영합니다. 625 를 위해. x264_s O2 최적화,llvm 은 케이스의 핫스팟이 벡터화 된 규칙을 준수하기 때문에 성능을 40%향상시킵니다. 그러나 Clang 과 LLVM 은 o2 수준에서 벡터를 최적화하는 반면 GCC 는 o3 수준에서 벡터를 최적화합니다. 벡터화 된 프로그램을 제외하고 GCC 는 O2 레벨에서의 성능과 비교하여 O3 레벨에서의 성능을 크게 향상시키지 않습니다. 즉,프로그램은 GCC O3 최적화에 민감하지 않습니다. 반면 Clang 및 LLVM 은 일부 프로그램의 성능을 크게 향상시킵니다(예:600. perlbench_s 및 602. gcc_s)O3 수준에서.

FP 속도와 같은 HPC 프로그램은 일반적으로 하이 엔드 서버에서 실행됩니다. 그들은 안정적인 핵심 알고리즘,높은 요구사항에 대한 성과-관련 벡터화 및 병렬 처리,그리고 높은 수준의 최적화(O3 또는 그 이상). 따라서이 문서는 아래와 같이 O3+march=native(skylake-avx512)최적화 수준에서의 성능을 비교합니다:

의 성능 비교 SPEC CPU2017FP 속도

두 FP 프로그램,GCC 도 성능을 향상시킬 수 있습으로 약 3%. Clang 및 LLVM 은 루프 최적화에서 보수적이므로 성능면에서 유리하지 않습니다. 그러나 하위 폴리-프로젝트의 동 그리고 이 제공하는 높은 수준의 루프 및 데이터 지역의 최적화 프로그램에서 널리 적용되어 왔 기계 학습,고성능 컴퓨팅,및 다른 유형의 컴퓨팅을 최적화입니다. 내가 믿는 폴리 성능을 크게 향상시킬 수 있습의 프로그램 핫스팟을 포함하는 루프 준수 벡터화 및 병렬 처리 규칙이 있습니다. 또한 일련의 벤치 마크 및 워크로드에서 폴리의 성능을 분석 할 것입니다.

발언을 체결

에서 벤치마킹하는 테스트를 위,우리가 볼 수 있는 소 많은 장점을 제공합한 대형 프로젝트의 건설안 GCC 은 항상 유리 성능의 최적화. 즐에 따라 달라는 귀하의 특정 응용 프로그램

외에도 성능 비교,을 공유하고 싶의 장점과 단점 GCC 와 그 소리하고 LLVM:

의 장점 GCC

  • GCC 를 지원하는 전통적인 언어보다 그 소리와 이와 같은 Ada,Fortran,이동합니다.
  • GCC 는 덜 인기있는 아키텍처를 지원하며 Clang 및 LLVM 보다 일찍 risc-V 를 지원합니다.
  • GCC 는 Clang 및 LLVM 보다 더 많은 언어 확장 및 더 많은 어셈블리 언어 기능을 지원합니다. Gcc 는 여전히 Linux 커널을 컴파일하는 유일한 옵션입니다. 지 연구에서 커널을 컴파일을 사용하여 그 소리 들은 또한 보고에서 산업,커널 컴파일할 수 없을 수정하지 않고 소스코드와 컴파일을 매개 변수입니다.

Clang 및 LLVM 의 장점

  • 신흥 언어는 Swift,Rust,Julia 및 Ruby 와 같은 LLVM 프레임 워크를 사용하고 있습니다.
  • Clang 및 LLVM 은 GCC 보다 엄격하게 C 및 C++표준을 준수합니다. Gcc 업그레이드 중 Gnu 인라인 및 기타 문제가 발생하지 않습니다.
  • Clang 은 스레드 보안 검사에 대한 속성과 같은 일부 확장 기능도 지원합니다.
  • Clang 은 정적 분석을위한 scan-build 및 clang static analyzer,구문 분석을위한 clang-format 및 clang-tidy 뿐만 아니라 편집기 플러그인 Clangd 와 같은 유용한 도구를 추가로 제공합니다.
  • 그램을 제공합 더 정확한 진단 정보 및 하이라이트는 오류 메시지 오류 라인,오류 라는 메시지를,및 수리 제안입니다. Clang 은 진단 정보를 기능으로 간주합니다. 진단 정보는 GCC5.0 에서만 개선되기 시작했으며 GCC8 에서 성숙 해졌다.

(Ma Jun马骏 의 원본 기사)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다