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++ gir grafiske brukergrensesnitt (Gui) og er lett å feilsøke, men det er ikke egnet For Linux-plattformer. Derfor sammenligner dette dokumentet hovedsakelig GCC med Clang/LLVM.

GCC ER et program språk kompilator utviklet AV GNU. Det er et sett med fri programvare utgitt under GNU General Public License (GPL) og GNU Lesser General Public License (LGPL). DET er en offisiell kompilator FOR GNU-og Linux-systemene, og en hovedkompiler for kompilering OG oppretting AV ANDRE unix-operativsystemer.LLVM inneholder en rekke modulariserte kompilatorkomponenter og verktøykjeder. Det kan optimalisere program språk og lenker under kompilering, runtime, og inaktiv tid og generere kode. LLVM kan tjene som bakgrunn for kompilatorer på flere språk. Clang er En C, C++, Objective-C eller Objective-C++ kompilator som er kompilert I C++ basert PÅ LLVM og utgitt Under Apache 2.0-lisensen. Clang brukes hovedsakelig til å gi ytelse som er bedre ENN GCC.GJENNOM langsiktig utvikling og iterasjon har GCC, Clang og LLVM blitt modne kompilatorer i bransjen. Så, hvilken kompilator er bedre? Hvilken skal vi bruke til å kompilere og bygge programmer og systemer?

Betydningen Av En God Kompilator

Moderne prosessorer har alle superscalar og lange rørledninger, og komplekse interne strukturer, og de støtter vektorutvidelsesenheter i Kompleks Instruksjonssett Datamaskin (CISC) eller REDUSERT Instruksjonssett Datamaskin (RISC) arkitektur. For mange programmer som inneholder generelle datakrevende kjerner, kan programmerere bruke vektorutvidelseskommandoer for å forbedre ytelsen til programutførelsen. For eksempel, i matrise-og vektoroperasjoner, brukes de kombinerte multiplikasjons-og addisjonskommandoene for å forbedre ytelsen og nøyaktigheten. Bitmaskekommandoer brukes til grenbehandling i vektoroperasjoner. For å oppnå høyeste ytelse må programmerere og kompilatorer imidlertid bruke mye arbeid på å håndtere oppgaver med komplekse minnetilgangsmoduser og ikke-standardkjerner.I Tillegg abstraherer standarder for moderne avanserte språk stadig detaljene i underliggende maskinvare og datastrukturer for å generere generell kode som er mer logisk og matematisk, i stedet for spesifikke driftsinstruksjoner og minnetilgangsbaner. C++ – standarder blir stadig mer uttrykksfulle og abstrakte. Python er populært fordi det er mer lesbart og uttrykksfulle, selv på bekostning av lavere kjørehastighet. Høyere uttrykksevne øker byrden av kompilatoren for å generere god monteringskode fra komplekse strukturer utarbeidet av programmerere. Kompilatoren må være smartere og jobbe hardere for å maksimere ytelsen ved å bruke koden. Ikke alle kompilatorer kan gjøre dette. Når du velger en kompilator, må vi først vurdere om det samme kodesegmentet kan generere mer effektive monteringskommandoer.

i tillegg til å generere kjørbare programmer med høy ytelse, må moderne kompilatorer også ha høy ytelse selv. Et stort programvareprosjekt I C++ kan inneholde hundrevis til tusenvis av individuelle oversettelsesenheter. Hver oversettelsesenhet kan inneholde tusenvis av kodelinjer. C++ – kode kan også bruke et stort antall malbaserte programmeringsteknologier. Disse teknologiene krever at kompilatoren overfører relevant informasjon flere ganger for å generere en målfil. Samlingen av Store C++ – prosjekter kan ta flere timer, og flere gjensidig avhengige endringer må sendes samtidig under utvikling. Hver innsending krever at utviklere kompilerer de fleste kodebibliotekene på nytt. Derfor er raskere kompilatorer (byggverktøy) avgjørende for å oppnå høy produktivitet for store lag.når det gjelder språkutvidelse, gir moderne datasystemer med flere kjerner, vektorbehandlingsfunksjoner og akseleratorer evner som er overlegne de naturlige egenskapene til vanlige programmeringsspråk. Derfor kan bestemte hpc-rammer (high performance computing), For Eksempel OpenMP og OpenACC, fylle dette gapet. Disse rammene gir applikasjonsgrensesnitt (Apier) som programmerere kan bruke til å uttrykke parallellitet i kode. Kompilatoren og det tilhørende kjøretidsbiblioteket må tilordne parallellkoden til prosessorarkitekturen. MANGE hpc-prosjekter er avhengige Av openmp-og OpenACC-standarder, som utvides av utviklere og maskinvareprodusenter. Derfor må kompilatørene holde tritt med utviklingen av språkutvidelsesstandarder.

til slutt gir en god kompilator oss mulighet til å fokusere på programmeringsprosessen, i stedet for å kjempe mot sine mangler. Den kan støtte de nyeste språkstandardene, generere optimaliserte kommandoer fra den mest abstrakte koden, og kompilere kildekoden på kortere tid.

Gcc Utviklingshistorie

FØR du lærer GCC, må du først forstå GNU-Prosjektet. Richard Stallman lanserte GNU-Prosjektet i 1984 for å bygge ET UNIX-lignende åpen kildekode-system. GNU-operativsystemet har ikke utviklet seg mye over tid. Det har imidlertid inkubert mange gode og nyttige open source-programvareverktøy, som Make, Sed, Emacs, Glibc, GDB og GCC også. DISSE GNU open source programvare og Linux kjerner sammen utgjør GNU / Linux-systemet. I begynnelsen ga GCC stabile og pålitelige kompilatorer, basert På programmeringsspråket c, FOR GNU-systemet. Dens fulle navn ER GNU C Compiler. Senere ble flere språk (Som Fortran, Obj-C, Og Ada) støttet, og det fulle navnet på GCC endret TIL GNU Compiler Collection.GCC-1.0 ble utgitt Av Richard Stallman i 1987, mer enn tretti år siden. Fra programvareperspektivet er det veldig gammelt. Noen samlet GCC development records fra mellom 1989 og 2012, og produserte en tretti minutters animert video (GNU Compiler Collection dev history 1989-2012), intuitivt demonstrerer utviklingsprosessen AV GCC. Vi kan lære OM utviklingen historie GCC fra sine versjoner:

  • GCC-1.0: utgitt Av Richard Stallman i 1987.
  • GCC-2.0: utgitt i 1992 og støttet C++. Senere ble gcc-samfunnet delt fordi Richard Stallman definerte GCC som en pålitelig c-kompilator AV GNU-systemet og trodde AT GCC på DEN tiden var tilstrekkelig FOR GNU-systemet, og utviklingsfokuset skulle flyttes FRA GCC til GNU-systemet selv. Andre store utviklere håpet å fortsette å forbedre GCC og gjøre mer radikale utviklinger og forbedringer i ulike aspekter. Disse aktive utviklerne forlot GCC-fellesskapet i 1997 og utviklet EGCS-gaffelen.GCC-3.0: åpenbart hadde utviklere generelt et sterkt ønske om gode kompilatorer. Egcs gaffel utviklet seg jevnt og ble anerkjent av flere og flere utviklere. TIL SLUTT BLE EGCS brukt som den nye gcc-ryggraden og GCC-3.0 ble utgitt i 2001. Det splittede samfunnet ble slått sammen igjen, Men Richard Stallmans innflytelse hadde blitt svekket til en viss grad. I tillegg Hadde Gcc Industrial Committee begynt å bestemme utviklingsretningen TIL GCC.
  • GCC-4.0: utgitt i 2005. Denne versjonen ble integrert I Tree Serial Storage Architecture (Ssa), OG GCC utviklet seg til å være en moderne kompilator.
  • GCC-5.0: utgitt i 2015. SENERE ble GCC-versjonspolicyen justert og en større versjon ble utgitt hvert år. En uventet fordel er at versjonsnummeret tilsvarer året. FOR EKSEMPEL BLE GCC-7 utgitt i 2017, OG GCC-9 ble utgitt i 2019.

NÅ har gcc-utviklingen kommet inn i «modern chronicle». Overfor konkurransepress AV LLVM, GCC samfunnet har aktivt gjort mange justeringer, slik som akselererende kompilering og forbedre kompilering advarsel informasjon. I løpet AV de siste 30 årene HAR GCC utviklet SEG fra en utfordrer i kompilatorindustrien til en vanlig kompilator For Linux-systemer, og står nå overfor UTFORDRINGEN MED LLVM. Heldigvis gjør gcc-samfunnet justeringer for å akselerere utviklingen AV GCC. Vi kan forvente at konkurransen mellom de to kompileringsteknologiene vil fortsette å gi programvareutviklere bedre kompilatorer.

Utvikling Historie Clang OG LLVM

LLVM ble stammer fra forskning Av Chris Lattner PÅ UUIC i 2000. Chris Lattner ønsket å skape en dynamisk kompileringsteknologi for alle statiske og dynamiske språk. LLVM ER en type åpen kildekode programvare utviklet UNDER Bsd-Lisensen. Den første versjonen 1.0 ble utgitt i 2003. I 2005 Ble Apple Inc. ansatt Chris Lattner og hans team for å utvikle programmeringsspråk og kompilatorer For Apple-datamaskiner, hvoretter UTVIKLINGEN AV LLVM kom inn i fast lane. FRA OG MED LLVM 2.5 ble to MINDRE LLVM-versjoner utgitt hvert år (vanligvis I Mars og September). I November 2011 BLE LLVM 3.0 utgitt for å bli Standard xcode kompilatoren. XCode 5 begynte å bruke Clang og LLVM 5.0 som standard. Versjonspolicyen ble justert FOR LLVM 5.0 og senere versjoner, og to hovedversjoner utgis hvert år. Den nåværende stabile versjonen er 8.0.

NAVNET PÅ LLVM ble først forkortet Fra Lavt Nivå Virtuell Maskin. Da dette prosjektet ikke er begrenset til opprettelsen av en virtuell maskin, blir forkortelsen LLVM ofte utspurt. ETTER LLVM ble utviklet, det ble en samlebetegnelse for mange kompilering verktøy og lavt nivå verktøy teknologier, noe som gjør navnet mindre passende. Utviklere bestemte seg for å forlate meningen bak denne forkortelsen. NÅ HAR LLVM blitt det offisielle merkenavnet, som gjelder for ALLE prosjekter under LLVM, inkludert LLVM Intermediate Representation (LLVM IR), LLVM debugging tools og LLVM C++ standard libraries. LLVM KAN brukes som en tradisjonell kompilator, jit kompilator, assembler, debugger, statisk analyseverktøy, og for andre funksjoner knyttet til programmeringsspråk.I 2012 vant LLVM software system award of Association For Computing Machinery (ACM), sammen med tradisjonelle systemer SOM UNIX, WWW, TCP/IP, TeX og Java. LLVM forenkler implementeringen av nye programmeringsspråk verktøykjeder. I de senere år har MANGE nye programmeringsspråk som Swift, Rust og Julia brukt LLVM som kompileringsramme. I TILLEGG HAR LLVM blitt standard kompilatoren For Mac OS X, iOS, FreeBSD og Android-systemer.

Clang

Clang er designet for å gi en frontend kompilator som kan erstatte GCC. Apple Inc. (Inkludert Neste senere) har brukt GCC som den offisielle kompilatoren. GCC har alltid utført godt som en standard kompilator i åpen kildekode-fellesskapet. Apple Inc. har sine egne krav til kompileringsverktøy. På Den ene Siden, Apple Inc. lagt til mange nye funksjoner For Objective-C-språket (eller til og med Senere C-språket). GCC-utviklere godtok imidlertid ikke disse funksjonene og ga lav prioritet til støtte for disse funksjonene. Senere ble de ganske enkelt delt inn i to grener for separat utvikling, og dermed gcc-versjonen utgitt Av Apple Inc. er langt tidligere enn den offisielle versjonen. PÅ DEN annen side ER gcc-koden svært koblet og vanskelig å bli utviklet separat. I senere versjoner fortsetter også kodekvaliteten å synke. Men mange funksjoner som Kreves Av Apple Inc. (for eksempel forbedret Integrert Utviklingsmiljø (IDE) støtte) må ringe GCC som en modul, MEN GCC gir aldri slik støtte. Videre begrenser Gcc Runtime Library Fritak fundamentalt utviklingen AV LLVM GCC. Også begrenset av lisensen, Apple Inc. KAN ikke bruke LLVM til å ytterligere forbedre kodegenereringskvaliteten basert PÅ GCC. Apple Inc. besluttet å skrive frontend Clang Av C, C++ og Objective-C språk fra bunnen av for å erstatte GCC helt.Som navnet antyder, Støtter Clang Bare C, C++ og Objective-C. Utviklingen startet i 2007 og c-kompilatoren ble først fullført. Clang For Objective-c cloud bli fullt brukt for produksjonsmiljøet i 2009. Støtte For c++ utviklet seg også raskt. Clang 3.3 fullt støttet C++ 11, Clang 3.4 fullt støttet C++ 14, Og Clang 5 fullt støttet C++ 17, og alle var betydelig foran GCC på den tiden.

Clang / LLVM og GCC Samfunnet

SOM andre åpen kildekode-samfunn, er GCC samfunnet dominert av fri programvare entusiaster og hackere. I utviklingsprosessen blir gcc-fellesskapsledelsen og deltakelsesmekanismer gradvis dannet i dag. For TIDEN ER GCC-samfunnet et relativt stabilt og veldefinert bekjennelsessamfunn der hver person har klare roller og plikter: Richard Stallman og Free Software Foundation (Fsf): Selv om De sjelden er involvert I gcc-fellesskapsledelse, Er Richard Stallman og FSF fortsatt løsrevet i lisens og juridiske saker.

  • Gcc Industrial Committee: Den håndterer GCC-fellesskapssaker, teknologiuavhengige gcc-utviklingsemner, og utnevnelse og kunngjøring av anmeldere og vedlikeholdere. I dag er det 13 medlemmer.
  • Globale vedlikeholdere: de dominerer GCC utviklingsaktiviteter. I noen grad bestemmer de utviklingen av GCC. For tiden er det 13 globale vedlikeholdere, som ikke alle har kontor I GCC Industrial Committee.
  • frontend, middle-end og backend vedlikeholdere: de er vedlikeholdere av frontend, backend og andre moduler. De er ansvarlige for koden til den tilsvarende gcc-modulen, og mange av dem er de viktigste bidragsyterne til modulkoden. Det er verdt å merke seg at anmeldere generelt er klassifisert i denne gruppen. Forskjellen er at korrekturlesere ikke kan godkjenne sin egen patch, mens vedlikeholdere kan sende inn egne modifikasjoner innenfor sitt ansvarsområde uten godkjenning fra korrekturlesere.
  • Bidragsytere: De er DE mest omfattende utviklergruppene I gcc-fellesskapet. Etter at du har signert opphavsrettsavtalen, kan alle utviklere søke Om Tillatelse Til Å Skrive etter Godkjenning fra fellesskapet, og deretter sende inn koden selv.
  • som andre åpen kildekode-samfunn, er det modne gcc-samfunnet ikke lenger dominert av hackere. Kommersielle selskaper begynte å spille viktige roller i samfunnet, som å rekruttere utviklere og sponse utviklingsmøter. FOR TIDEN domineres gcc-fellesskapet av følgende typer kommersielle selskaper:

    • Systemleverandører, hovedsakelig Inkludert RedHat og SUSE.
    • Chip leverandører, hovedsakelig Inkludert Intel, ARM, AMD og IBM (PowerPC).
    • Spesialiserte leverandører, For Eksempel CodeSourcery og verktøykjede tjenesteleverandører som AdaCore basert På ada-språket. CodeSourcery hadde en strålende historie og rekrutterte mange kjente utviklere, men avslo etter At Den ble kjøpt opp Av Mentor.

    i DAGENS gcc-fellesskap dominerer chip-leverandører backend-utvikling, mens systemleverandører styrer andre utviklingsområder. Når DET gjelder samfunnsutvikling, ER gcc-koden for tiden vert på SIN EGEN SVN-server. En Git API er gitt for å lette utvikling og innlevering. Patch gjennomgang er lik Som I Linux Kernel samfunnet og bruker Mailingliste skjema. SOM nevnt ovenfor er gcc-samfunnet et relativt stabilt (eller lukket) bekjent samfunn. Samfunnet har i utgangspunktet 150 til 200 aktive bidragsytere hvert år og holder en utviklerkonferanse i September hvert år. I September 2019 vil utviklerkonferansen bli avholdt I Montreal, Canada.

    LLVM Samfunnet

    LLVM samfunnet er en noob-vennlig kompilator samfunnet. Det reagerer raskt på spørsmålene til nye brukere og patch vurderinger. Dette er også grunnlag og kilde for påfølgende LLVM Foundation diskusjoner og vedtakelsen AV LLVM Community Code of Conduct, og fører til en rekke politisk korrekte diskusjoner.

    ALLE LLVM prosjekter og problemer er diskutert Gjennom DevExpress e-postliste, og kode innsending er varslet gjennom inger e-postlisten. Alle bugs og har modifikasjoner spores gjennom bugs liste. De innsendte patchene anbefales for hovedgrenene. Stilen er i samsvar MED LLVM Koding Standarder og kode gjennomgang utføres Gjennom Phabricator. FOR tiden HAR LLVM-kodelageret blitt migrert til GitHub.I Motsetning TIL gcc-fellesskapet har LLVM-fellesskapet BARE LLVM-Stiftelsen. LLVM Foundation har åtte medlemmer. I tillegg til å administrere LLVM samfunnssaker, har hvert medlem AV LLVM Foundation for å veilede LLVM utviklingsspørsmål knyttet til teknologi. For tiden er presidenten Tanya Lattner, kona Til Chris Lattner. Chris Lattner selv er også medlem av stiftelsen og har sterk kontroll over LLVM samfunnet og utvikling retning AV LLVM.

    retningslinjene for kodegjennomgang i LLVM-fellesskapet er stort sett de samme som I gcc-fellesskapet. Forskjellen er at, på grunn av den raske utviklingen AV LLVM, mange bidragsytere ikke har forplikte tilgang tillatelse, og må sende inn sin kode gjennom vedlikeholdere. For Tiden Har Clang og LLVM-samfunnene mer enn 1000 bidragsytere hvert år. Vanligvis arrangeres utviklerkonferanser i April og oktober årlig. Utviklerkonferansen i oktober 2019, vil bli avholdt I San Jose, USA.LLVM-lisensen er endret Fra Uiuc-Lisens Til Apache 2.0-Lisens med LLVM-unntak. DET brukes hovedsakelig til å løse problemet AT LLVM runtime library er basert PÅ Mit-Lisens og patentgodkjenningen som kreves for prosjektet, er for omfattende. UNDER denne lisensen tillater LLVM alle å utlede kommersielle produkter fra LLVM uten noen begrensninger, og krever ikke at noen derivater gir åpen kildekode, og dermed fremmer den omfattende bruken AV LLVM, inkludert:nedlasting ELLER bruk AV LLVM helt eller delvis for personlige, interne eller kommersielle formål. EVNEN til å endre LLVM kode uten å bidra det tilbake til prosjektet.

  • opprettelse av en pakke eller utgivelsesversjon som inneholder LLVM. Foreningen AV LLVM med kode godkjent av alle andre store open source-lisenser (inkludert BSD, MIT, GPLv2 og GPLv3).
  • når du distribuerer LLVM igjen, må du beholde opphavsrettsmerknaden. Du kan ikke slette eller erstatte opphavsrettsoverskriften. Den binære filen som inneholder LLVM må inneholde opphavsrettsmerknaden.
  • Ytelse Sammenligning MELLOM GCC OG LLVM

    Arkitektur: x86_64
    Prosessor: Intel (R) Xeon (R) Platinum 8163 CPU @ 2.50 GHz
    L1 data cache: 32 KB
    L2 cache: 1,024 KB
    L3 cache: 33,792 KB
    Minne: 800 GB
    Operativsystem: Alibaba Group Enterprise Linux Server utgivelse 7.2 (paladin)
    kjerne: 4.9.151–015.ali3000.alios7.x86_64
    Kompilator: Clang / LLVM 8.0 GCC8. 3. 1

    Benchmark

    SPEC CPU 2017 ER ET sett MED CPU delsystem testverktøy for testing AV CPU, cache, minne og kompilator. Den inneholder 43 tester av fire kategorier, inkludert SPECspeed 2017 INT og FP som tester heltall hastighet og flyttall operasjon hastighet og SPECrate 2017 INT og FP som tester heltall samtidighet rate og flyttall samtidighet rate. Clang støtter Ikke Fortran språk. Derfor, I dette eksemplet, brukes c/C ++ – programmene I Spec Speed test settet til å teste single-core ytelsesforskjellen mellom de binære programmene generert Av Clang og GCC. Følgende tabell viser SPEC CPU2017 C og C++ sett:

    CINT2017 SpeedCFP2017 Speed600.perlbench_s619.lbm_s602.gcc_s644.nab_s605.mcf_s620.omnetpp_s623.xalancbmk_s625.x264_s631.deepsjeng_s641.leela_s657.xz_s

    Testmetoder

    LLVM-lnt automation framework brukes til å utføre testen og sammenligne ytelsen. Den kjører på samme måte som runcpu AV SPEC CPU. FØR LLVM-lnt kjører, blir cache (echo 3 > /proc/sys/vm / drop_caches) slettet, og deretter kjører testdatasettet. Deretter kjører ref datasettet tre ganger. Gjennomsnittsverdien av de tre ref testkjøringsresultatene brukes som sluttresultat. Hvis du vil redusere ytelsesfluktuasjoner forårsaket AV CPU-overføring eller kontekstbryter, er prosesser som kjører på testdatasettet og ref-datasettet, bundet til EN CPU-kjerne ved hjelp AV CPU affinity-verktøyet. For kompileringstid-testen bruker denne metoden tråd 1 til å bygge testprogrammet og sammenligne testelementene som er kompilert i lang tid. Kompileringstiden inkluderer ikke koblingstiden. Det inkluderer bare den tiden da alle kildefilene i alle testprogrammer genereres.

    Kompilering Ytelse Sammenligning

    gcc kompileringsprosessen er som følger: les kildefilen, preprocess kildefilen, konvertere den TIL EN IR, optimalisere og generere en forsamling fil. Deretter genererer assembler en objektfil. Clang og LLVM stoler ikke på uavhengige kompilatorer, men integrerer selvimplementerte kompilatorer på backend. Prosessen med å generere monterings filer er utelatt i prosessen med å generere objektfiler. Objektet filen genereres direkte FRA IR. Dessuten, sammenlignet MED GCC IR, er datastrukturen TIL LLVM IR mer konsistent. Det opptar mindre minne under kompilering og støtter raskere traversering. Derfor Er Clang OG LLVM fordelaktige når Det gjelder kompileringstiden, som er bevist av dataene som er oppnådd fra SPEC-kompilering, som vist i figuren nedenfor. Clang reduserer single-thread kompilering tid med 5% til 10% sammenlignet MED GCC. Derfor Gir Clang flere fordeler for bygging av store prosjekter.

    sammenligning av spec kompileringstid

    sammenligning av utførelsesytelse

    de fleste skyarbeidsbelastninger krever at programmene kan kjøre i forskjellige klynger. Når du oppretter disse programmene, må du ikke angi maskinrelaterte parametere. For å tilpasse seg den raske iterasjonen forårsaket av etterspørselsendringer, må også arbeidsbelastninger utenfor lokalene være feilsøkbare. Bortsett fra noen stabile og vanlige biblioteker som muliggjør høye kompileringsoptimaliseringsnivåer, har arbeidsmengden i seg selv et lavt kompilerings-og optimaliseringsnivå (O2 eller lavere). For å oppfylle dette kravet sammenligner dette dokumentet ytelsen til forskjellige kompilatorer På o2-og O3-optimaliseringsnivåene FOR Int-Hastighetsprogrammer, som vist i følgende figur:

    ytelse sammenligning av spec cpu2017 int hastighet

    gcc har en 1% til 4% ytelsesfordel over clang og llvm for de fleste programmer på o2 og o3 nivåer, og i gjennomsnitt har en ca 3% ytelsesfordel for spec cpu2017 int hastighet. I forhold til 600.perlbench_s og 602.gcc_s / O2, GCC har en stor ytelsesfordel (mer enn 10%). Disse to testelementene har ingen utestående hotspots og kan gjenspeile den omfattende optimaliseringseffekten av kompilatoren. Testresultatene viser AT GCC alltid er fordelaktig i ytelsesoptimalisering. Men for to AI-relaterte programmer, inkludert 631.deepsjeng_s og 641.leela_s, som nylig er lagt TIL SPEC test, Clang OG LLVM forbedre ytelsen med mer enn 3% i forhold TIL GCC. DETTE gjenspeiler OGSÅ DEN raske utviklingen AV LLVM når det gjelder optimalisering. For den 625. x264_s O2 optimalisering, FORBEDRER LLVM ytelsen med 40% fordi hotspot av saken er i samsvar med vektoriserte regler. Men Clang og LLVM optimaliserer vektorene På O2-nivået, MENS GCC optimaliserer vektorene På O3-nivået. Bortsett fra vektoriserte programmer, forbedrer GCC ikke ytelsen på O3-nivået i stor grad sammenlignet med Det På O2-nivået. Med andre ord, programmene er ikke følsomme FOR gcc O3 optimalisering. I motsetning til Dette forbedrer Clang og LLVM betydelig ytelsen til enkelte programmer (for eksempel 600. perlbench_s og 602. gcc_s) På O3 nivå.

    HPC-programmer, som FP-Hastighet, kjører vanligvis på avanserte servere. De har stabile kjernealgoritmer, høye krav til ytelsesrelatert vektorisering og parallellisme, og muliggjør høye optimaliseringsnivåer (O3 eller høyere). Derfor sammenligner dette dokumentet ytelsen På o3 + march = native (skylake-avx512) optimaliseringsnivå, som vist nedenfor:

    ytelsessammenligning av spec cpu2017 fp-hastighet

    for de to fp-programmene kan gcc også forbedre ytelsen med ca 3%. Clang OG LLVM er konservative i loop optimalisering og dermed ikke fordelaktig i ytelse. Polly delprosjekt Av Clang OG LLVM gir imidlertid et høyt nivå loop og data lokalitet optimizer som har vært mye brukt i maskinlæring, høy ytelse databehandling, og heterogen databehandling optimalisering. Jeg tror At Polly kan forbedre ytelsen til programmer som inneholder hotspot loops i samsvar med vektorisering og parallellisme regler. Jeg vil også analysere Ytelsen Til Polly i en rekke referanser og arbeidsbelastninger.

    Avsluttende Bemerkninger

    fra benchmarking testene ovenfor, kan Vi se At Clang tilbyr flere fordeler for bygging av store prosjekter mens GCC er alltid fordelaktig i ytelsesoptimalisering. Bla avhenger av din spesifikke applikasjon I tillegg til ytelsessammenligning, vil jeg gjerne dele fordelene OG ulempene VED GCC og Clang OG LLVM:

    Fordeler MED GCC

    • GCC støtter mer tradisjonelle språk Enn Clang og LLVM, Som Ada, Fortran og Go.
    • GCC støtter mer mindre populære arkitekturer, og støttet RISC-V tidligere Enn Clang OG LLVM.GCC støtter flere språkutvidelser og flere monteringsspråkfunksjoner enn Clang og LLVM. GCC er fortsatt det eneste alternativet for å kompilere Linux-kjernen. Selv om forskning på kjernekompilering ved Hjelp Av Clang og LLVM også rapporteres i bransjen, kan kjernen ikke kompileres uten å endre kildekoden og kompileringsparametrene.

    Fordeler Med Clang og LLVM

    • Nye språk bruker LLVM-rammene, for eksempel Swift, Rust, Julia og Ruby.
    • Clang OG LLVM i samsvar Med c og C ++ standarder strengere ENN GCC. GNU Inline og andre problemer under gcc oppgradering oppstår ikke.
    • Clang støtter også noen utvidelser, for eksempel attributter for tråd sikkerhetskontroll.Clang gir flere nyttige verktøy, for eksempel scan-build og clang static analyzer for statisk analyse, clang-format og clang-tidy for syntaks analyse, samt editor plug-in Clangd.
    • Clang gir mer nøyaktig og vennlig diagnostisk informasjon, og fremhever feilmeldinger, feil linjer, feil linje ber, og reparasjon forslag. Clang anser diagnostisk informasjon som en funksjon. Den diagnostiske informasjonen begynte å bli forbedret bare FRA GCC 5.0, og ble moden I GCC 8.

    (Opprinnelig artikkel av Ma Jun马骏)

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *