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++ giver grafiske brugergrænseflader (GUI ‘ er) og er let at debugge, men det er ikke egnet til platforme. Derfor sammenligner dette dokument hovedsageligt GCC med Clang/LLVM.

GCC er et program sprog compiler udviklet af GNU. Det er et sæt gratis programmer udgivet under GNU General Public License (GPL) og GNU Lesser General Public License (LGPL). Det er en officiel compiler til GNU og systemer, og en vigtigste compiler til at kompilere og skabe andre operativsystemer.

LLVM indeholder en række modulariserede compiler komponenter og værktøjskæder. Det kan optimere programsprog og links under kompilering, runtime og inaktiv tid og generere kode. LLVM kan tjene som baggrund for kompilatorer på flere sprog. Clang er en C, C++, Objective-C eller Objective-C++ compiler, der er kompileret i C++ baseret på LLVM og frigivet under Apache 2.0-licensen. Clang bruges hovedsageligt til at give ydeevne, der er bedre end GCC.

gennem langsigtet udvikling og iteration er GCC, Clang og LLVM blevet modne kompilatorer i branchen. Så hvilken compiler er bedre? Hvilken skal vi bruge til at kompilere og opbygge programmer og systemer?

betydningen af en god Compiler

moderne processorer har alle superscalar og lange rørledninger og komplekse interne strukturer, og de understøtter vektorforlængelsesenheder i kompleks instruktionssæt Computer (CISC) eller reduceret instruktionssæt Computer (RISC) arkitektur. For mange programmer, der indeholder generelle computerintensive kerner, kan programmører bruge vektorudvidelseskommandoer til i høj grad at forbedre programudførelsesydelsen. For eksempel i matricer og vektoroperationer bruges de kombinerede multiplikations-og tilføjelseskommandoer til at forbedre ydeevne og nøjagtighed. Bit maskekommandoer bruges til grenbehandling i vektoroperationer. For at opnå den højeste ydeevne skal programmører og kompilatorer dog stadig bruge en stor indsats for at håndtere opgaver med komplekse hukommelsesadgangstilstande og ikke-standardkerner.derudover abstrakte standarder for moderne avancerede sprog konstant detaljerne i underliggende udstyr og datastrukturer for at generere generel kode, der er mere logisk og matematisk, i stedet for specifikke betjeningsinstruktioner og hukommelsesadgangsstier. C++ standarder bliver mere og mere udtryksfulde og abstrakte. Python er populær, fordi den er mere læsbar og udtryksfuld, selv på bekostning af en lavere kørehastighed. Højere udtryksevne øger kompilatorens byrde for at generere god monteringskode fra de komplekse strukturer, der er udarbejdet af programmører. Kompilatoren skal være smartere og arbejde hårdere for at maksimere ydeevnen ved hjælp af koden. Ikke alle kompilatorer kan gøre dette. Når vi vælger en kompilator, skal vi først overveje, om det samme kodesegment kan generere mere effektive samlingskommandoer.

ud over at generere højtydende eksekverbare programmer skal Moderne kompilatorer også selv have høj ydeevne. Et stort programprojekt i C++ kan indeholde hundreder til tusinder af individuelle oversættelsesenheder. Hver oversættelsesenhed kan indeholde tusindvis af kodelinjer. C++ – kode kan også bruge et stort antal skabelonbaserede programmeringsteknologier. Disse teknologier kræver, at kompilatoren overfører relevant information flere gange for at generere en målfil. Udarbejdelsen af store C++ – projekter kan tage flere timer, og flere gensidigt afhængige ændringer skal indsendes samtidigt under udviklingen. Hver indsendelse kræver, at udviklere kompilerer de fleste af kodebibliotekerne igen. Derfor er hurtigere kompilatorer (byggeværktøjer) kritiske for at opnå høj produktivitet for store teams.

med hensyn til sprogudvidelse giver moderne computersystemer med flere kerner, vektorbehandlingsfunktioner og acceleratorer kapaciteter, der er bedre end de naturlige evner i almindelige programmeringssprog. Derfor kan specifikke HPC-rammer (high performance computing), såsom OpenMP og OpenACC, udfylde dette hul. Disse rammer giver Applikationsprogramgrænseflader (API ‘ er), som programmører kan bruge til at udtrykke parallelisme i kode. Kompilatoren og det tilsvarende runtime-bibliotek skal kortlægge den parallelle kode til processorarkitekturen. Mange HPC-projekter er afhængige af OpenMP-og OpenACC-standarder, som udvides af udviklere og udstyrsproducenter. Derfor skal kompilatorerne følge med udviklingen af sprogudvidelsesstandarder.

afslutningsvis giver en god kompilator os mulighed for at fokusere på programmeringsprocessen, snarere end at bekæmpe sine mangler. Det kan understøtte de nyeste sprogstandarder, generere optimerede kommandoer fra den mest abstrakte kode og kompilere kildekoden på kortere tid.

GCC udviklingshistorie

før du lærer GCC, skal du først forstå GNU-projektet. Richard Stallman lancerede GNU-projektet i 1984 for at opbygge et unikt open source-system. GNU-operativsystemet har ikke udviklet sig meget over tid. Det har dog inkuberet mange fremragende og nyttige open source-værktøjer, såsom Make, sed, Emacs, Glibc, GDB og GCC. Disse GNU open source-programmer og linukerner udgør tilsammen GNU / Linuk-systemet. I begyndelsen leverede GCC stabile og pålidelige kompilatorer baseret på C programmeringssprog til GNU-systemet. Dens fulde navn er GNU C Compiler. Senere blev flere sprog (såsom Fortran, Obj-C og Ada) understøttet, og det fulde navn på GCC blev ændret til GNU Compiler Collection.

GCC-1.0 blev udgivet af Richard Stallman i 1987 for mere end tredive år siden. Fra programmernes perspektiv er det meget gammelt. Nogen indsamlede GCC-udviklingsoptegnelserne fra mellem 1989 og 2012 og producerede en tredive minutters animeret video (GNU Compiler Collection dev history 1989-2012), der intuitivt demonstrerede udviklingsprocessen for GCC. Vi kan lære om GCC ‘ s udviklingshistorie fra dens versioner:

  • GCC-1.0: udgivet af Richard Stallman i 1987.
  • GCC-2.0: udgivet i 1992 og understøttet C++. Senere blev GCC-samfundet delt, fordi Richard Stallman definerede GCC som en pålidelig C-kompilator af GNU-systemet og mente, at GCC på det tidspunkt var tilstrækkelig til GNU-systemet, og udviklingsfokuset skulle flyttes fra GCC til selve GNU-systemet. Andre store udviklere håbede at fortsætte med at forbedre GCC og gøre mere radikale udviklinger og forbedringer i forskellige aspekter. Disse aktive udviklere forlod GCC-samfundet i 1997 og udviklede EGCS fork.
  • GCC-3.0: selvfølgelig havde udviklere generelt et stærkt ønske om gode kompilatorer. EGCS fork udviklede sig glat og blev anerkendt af flere og flere udviklere. Til sidst blev EGCS brugt som den nye GCC-rygrad, og GCC-3.0 blev frigivet i 2001. Det splittede samfund blev fusioneret igen, men Richard Stallmans indflydelse var til en vis grad svækket. Derudover var GCC Industrial Committee begyndt at beslutte GCC ‘ s udviklingsretning.
  • GCC-4.0: udgivet i 2005. Denne version blev integreret i Tree Serial Storage Architecture (SSA), og GCC udviklede sig til at være en moderne compiler.
  • GCC-5.0: udgivet i 2015. Senere blev GCC-versionspolitikken justeret, og en større version blev frigivet hvert år. En uventet fordel er, at versionsnummeret svarer til året. For eksempel blev GCC-7 udgivet i 2017, og GCC-9 blev udgivet i 2019.

nu er GCC-udviklingen kommet ind i “modern chronicle”. Over for LLVM ‘ s konkurrencepres har GCC-samfundet aktivt foretaget mange justeringer, såsom at fremskynde kompilering og forbedre kompileringsadvarselsoplysningerne. I løbet af de sidste 30 år har GCC udviklet sig fra en udfordrer i compilerindustrien til en mainstream compiler til LLVM-systemer, og står nu over for LLVM ‘ s udfordring. Heldigvis foretager GCC-samfundet justeringer for at fremskynde udviklingen af GCC. Vi kan forvente, at konkurrencen mellem de to kompilationsteknologier fortsat vil give programmeludviklere bedre kompilatorer.

udviklingshistorie for Clang og LLVM

LLVM stammer fra Chris Lattner ‘ s forskning på UUIC i 2000. Chris Lattner ønskede at skabe en dynamisk kompileringsteknologi til alle statiske og dynamiske sprog. LLVM er en type open source-program udviklet under BSD-licensen. Den oprindelige version 1.0 blev udgivet i 2003. I 2005, Apple Inc. hyret Chris Lattner og hans team til at udvikle programmeringssprog og kompilatorer til Apple-computere, hvorefter udviklingen af LLVM kom ind i overhalingsbanen. Fra LLVM 2.5 blev der udgivet to mindre LLVM-versioner hvert år (Generelt i Marts og September). I November 2011 blev LLVM 3.0 frigivet til at blive standardkode compiler. 5 begyndte at bruge Clang og LLVM 5.0 som standard. Versionspolitikken blev justeret for LLVM 5.0 og nyere versioner, og to større versioner frigives hvert år. Den nuværende stabile version er 8.0.

navnet på LLVM blev først forkortet fra lavt niveau virtuel maskine. Da dette projekt ikke er begrænset til oprettelsen af en virtuel maskine, bliver forkortelsen LLVM ofte stillet spørgsmålstegn ved. Efter at LLVM blev udviklet, blev det en samlebetegnelse for mange kompilationsværktøjer og værktøjsteknologier på lavt niveau, hvilket gjorde navnet mindre passende. Udviklere besluttede at opgive betydningen bag denne forkortelse. Nu er LLVM blevet det officielle mærkenavn, der gælder for alle projekter under LLVM, herunder LLVM Intermediate Representation (LLVM ir), LLVM debugging tools og LLVM C++ standardbiblioteker. LLVM kan bruges som en traditionel compiler, JIT compiler, assembler, debugger, statisk analyseværktøj og til andre funktioner relateret til programmeringssprog.

i 2012 vandt LLVM prisen for Association for Computing Machinery (ACM) sammen med traditionelle systemer som f.eks. LLVM forenkler i høj grad implementeringen af nye programmeringssprogværktøjskæder. I de senere år har mange nye programmeringssprog som hurtig, Rust og Julia brugt LLVM som deres kompileringsramme. Derudover er LLVM blevet standard compiler til Mac OS, iOS, FreeBSD og Android-systemer.

Clang

Clang er designet til at give en frontend compiler, der kan erstatte GCC. Apple Inc. (herunder næste senere) har brugt GCC som den officielle compiler. GCC har altid fungeret godt som en standard compiler i open source-samfundet. Apple Inc. har sine egne krav til kompileringsværktøjer. På den ene side Apple Inc. tilføjet mange nye funktioner til Objective – C-sproget (eller endda senere C-sproget). GCC-udviklere accepterede imidlertid ikke disse funktioner og tildelte lav prioritet til understøttelse af disse funktioner. Senere blev de simpelthen opdelt i to grene til separat udvikling, og dermed GCC-versionen udgivet af Apple Inc. er langt tidligere end den officielle version. På den anden side er GCC-koden stærkt koblet og svær at udvikle separat. Derudover fortsætter kodekvaliteten i senere versioner med at falde. Men mange funktioner, der kræves af Apple Inc. (såsom forbedret integreret udviklingsmiljø (IDE) support) skal kalde GCC som et modul, men GCC giver aldrig sådan support. Desuden begrænser GCC Runtime Library-undtagelsen grundlæggende udviklingen af LLVM GCC. Også begrænset af licensen, Apple Inc. kan ikke bruge LLVM til yderligere at forbedre kodegenereringskvaliteten baseret på GCC. Derfor Apple Inc. besluttet at skrive frontend Clang af C, C++ og Objective-C sprog fra bunden til helt at erstatte GCC.som navnet antyder, understøtter Clang kun C, C++ og Objective-C. udviklingen startede i 2007, og C-kompilatoren blev først afsluttet. Clang til Objective-C cloud anvendes fuldt ud til produktionsmiljøet i 2009. Understøttelse af C++ udviklede sig også hurtigt. Clang 3.3 fuldt understøttet C++ 11, Clang 3.4 fuldt understøttet C++ 14 og Clang 5 fuldt understøttet C++ 17, og alle var markant foran GCC på det tidspunkt.

Clang/LLVM og GCC Community

ligesom andre open source-programmer er GCC-samfundet domineret af gratis programmelentusiaster og hackere. I udviklingsprocessen dannes GCC-samfundsstyrings-og deltagelsesmekanismerne gradvist i dag. I øjeblikket er GCC-samfundet et relativt stabilt og veldefineret bekendtskabssamfund, hvor hver person har klare roller og pligter: Richard Stallman og Free programmel Foundation (FSF): selvom Richard Stallman og FSF sjældent er involveret i GCC community management, er Richard Stallman og FSF stadig løsrevet i licens og juridiske anliggender.

  • GCC Industrial Committee: Det administrerer GCC-samfundsanliggender, teknologiuafhængige GCC-udviklingsemner, og udnævnelse og meddelelse af korrekturlæsere og vedligeholdere. Det har i øjeblikket 13 medlemmer.
  • globale vedligeholdere: de dominerer GCC-udviklingsaktiviteter. Til en vis grad bestemmer de udviklingstendensen for GCC. I øjeblikket er der 13 globale vedligeholdere, som ikke alle har kontor i GCC Industrial Committee.
  • frontend, middle-end og backend vedligeholdere: de er vedligeholdere af frontend, backend og andre moduler. De er ansvarlige for koden for det tilsvarende GCC-modul, og mange af dem er de vigtigste bidragydere til modulkoden. Det er værd at bemærke, at korrekturlæsere generelt klassificeres i denne gruppe. Forskellen er, at korrekturlæsere ikke kan godkende deres egen patch, mens vedligeholdere kan indsende deres egne ændringer inden for deres ansvarsområde uden godkendelse fra korrekturlæsere.
  • bidragydere: de er de mest omfattende udviklergrupper i GCC-samfundet. Efter underskrivelsen af ophavsretsaftalen kan alle udviklere ansøge om skrivningen efter Godkendelsestilladelse fra samfundet og derefter indsende koden alene.
  • ligesom andre open source-samfund er det modne GCC-samfund ikke længere domineret af hackere. Kommercielle virksomheder begyndte at spille vigtige roller i samfundet, såsom rekruttering af udviklere og sponsorering af udviklingsmøder. I øjeblikket domineres GCC-samfundet af følgende typer kommercielle virksomheder:

    • systemleverandører, hovedsageligt inklusive RedHat og SUSE.Chip-leverandører, hovedsageligt inklusive Intel, ARM, AMD og IBM.
    • specialiserede leverandører, såsom CodeSourcery og værktøjskædetjenesteudbydere som AdaCore baseret på Ada-sproget. CodeSourcery havde en strålende historie og rekrutterede mange berømte udviklere, men faldt, efter at den blev erhvervet af Mentor.

    i det nuværende GCC-samfund dominerer chipleverandører backend-udvikling, mens systemleverandører styrer andre udviklingsområder. Med hensyn til samfundsudvikling er GCC-koden i øjeblikket hostet på sin egen SVN-server. En Git API leveres for at lette udvikling og indsendelse. Patchanmeldelsen svarer til den i kernefællesskabet og bruger formularen mailingliste. Som nævnt ovenfor er GCC-samfundet et relativt stabilt (eller lukket) bekendtskabssamfund. Samfundet har stort set 150 til 200 aktive bidragydere hvert år og afholder en udviklerkonference i September hvert år. I September 2019 afholdes udviklerkonferencen i Montreal, Canada.

    LLVM Community

    LLVM-samfundet er et noob-venligt kompilatorfællesskab. Det reagerer hurtigt på spørgsmålene fra nye brugere og patch anmeldelser. Dette er også grundlaget og kilden til efterfølgende LLVM Foundation diskussioner og vedtagelsen af LLVM Community Code of Conduct, og forårsager en række politisk korrekte diskussioner.

    alle LLVM-projekter og-problemer diskuteres via Devekspress-e-mail-listen, og kodeindsendelse meddeles via commits-e-mail-listen. Alle fejl og funktionsændringer spores gennem bugs listen. De indsendte patches anbefales til mastergrene. Stilen er i overensstemmelse med LLVM kodning standarder og kode gennemgang udføres gennem Phabricator. I øjeblikket er LLVM-kodelageret migreret til GitHub.

    I modsætning til GCC-samfundet har LLVM-samfundet kun LLVM-fundamentet. LLVM Foundation har otte medlemmer. Ud over at styre LLVM-samfundsanliggender skal hvert medlem af LLVM Foundation guide LLVM-udviklingsspørgsmål relateret til teknologi. I øjeblikket er præsidenten Tanya Lattner, hustru til Chris Lattner. Chris Lattner selv er også medlem af fonden og har stærk kontrol over LLVM-samfundet og udviklingsretningen for LLVM.

    kodevurderingspolitikken i LLVM-samfundet er stort set den samme som i GCC-samfundet. Forskellen er, at mange bidragydere på grund af den hurtige udvikling af LLVM ikke har tilladelse til at forpligte sig og skal indsende deres kode gennem vedligeholderne. I øjeblikket har Clang-og LLVM-samfundene mere end 1.000 bidragydere hvert år. Generelt afholdes udviklerkonferencer i April og oktober årligt. Udviklerkonferencen i oktober 2019 afholdes i San Jose, USA.

    LLVM-licensen ændres fra UIUC-licens til Apache 2.0-licens med LLVM-undtagelser. Det bruges hovedsageligt til at løse problemet, at LLVM runtime-biblioteket er baseret på MIT-licens, og den patenttilladelse, der kræves til projektet, er for omfattende. Under denne licens tillader LLVM enhver at udlede kommercielle produkter fra LLVM uden nogen begrænsninger og kræver ikke, at derivater leverer open source-kode, hvilket fremmer den omfattende brug af LLVM, herunder:

    1. hentning eller brug af LLVM helt eller delvist til personlige, interne eller kommercielle formål. Evnen til at ændre LLVM kode uden at bidrage det tilbage til projektet.
    2. oprettelse af en pakke-eller udgivelsesversion, der indeholder LLVM. Foreningen af LLVM med kode godkendt af alle andre store open source-licenser (herunder BSD, MIT, GPLv2 og GPLv3).
    3. når du distribuerer LLVM igen, skal du bevare meddelelsen om ophavsret. Du kan ikke slette eller erstatte copyright-overskriften. Den binære fil, der indeholder LLVM, skal indeholde meddelelsen om ophavsret.

    Performance sammenligning mellem GCC og LLVM

    arkitektur: 86_64
    Processor: Intel (R) Platinum 8163 CPU @ 2.50 CPU
    L1 data cache: 32 KB
    L2 cache: 1.024 KB
    L3 cache: 33.792 KB
    Hukommelse: 800 GB
    operativsystem: Alibaba Group Enterprise Linieserver release 7.2 (paladin)
    kerne: 4.9.151–015.ali3000.alios7.86_64
    Compiler: Clang/LLVM 8.0 GCC8.3.1

    Benchmark

    SPEC CPU 2017 er et sæt af CPU delsystem testværktøjer til test af CPU, cache, hukommelse og compiler. Den indeholder 43 tests af fire kategorier, herunder SPECspeed 2017 INT og FP, der tester heltal hastighed og flydende punkt driftshastighed og SPECrate 2017 INT og FP, der tester heltal samtidighed sats og flydende punkt samtidighed Sats. Clang understøtter ikke Fortran-sproget. Derfor bruges C/C ++ -programmerne i SPEC-Hastighedstestsættet i dette eksempel til at teste enkeltkernens ydelsesforskel mellem de binære programmer, der genereres af Clang og GCC. Følgende tabel viser SPEC CPU2017 C og C++ sæt:

    CINT2017 SpeedCFP2017 Speed600.perlbench_s619.lbm_s602.gcc_s644.nab_s605.mcf_s620.omnetpp_s623.- salancbmk_s625.264_s631.deepsjeng_s641.leela_s657.

    testmetoder

    LLVM-LNT-automatiseringsrammen bruges til at udføre testen og sammenligne ydeevnen. Det kører på samme måde som runcpu af SPEC CPU. Før LLVM-lnt kører, ryddes cache (echo 3 > /proc/sys/vm/drop_caches), og derefter kører testdatasættet. Derefter kører ref-datasættet tre gange. Den gennemsnitlige værdi af de tre ref testkørselsresultater bruges som det endelige resultat. For at reducere ydelsesudsving forårsaget af CPU-migration eller kontekstkontakt, er processer, der kører på testdatasættet og ref-datasættet, bundet til en CPU-kerne ved hjælp af CPU-affinitetsværktøjet. Til kompileringstidstesten bruger denne metode tråd 1 til at opbygge testprogrammet og sammenligne de testelementer, der er blevet samlet i lang tid. Kompileringstiden inkluderer ikke linker-udførelsestiden. Det inkluderer kun det tidspunkt, hvor alle kildefiler i alle testprogrammer genereres.

    sammenligning af Kompilationsydelse

    GCC-kompileringsprocessen er som følger: Læs kildefilen, forbehandle kildefilen, konvertere det til en IR, optimere og generere en samling fil. Derefter genererer assembler en objektfil. Clang og LLVM er ikke afhængige af uafhængige kompilatorer, men integrerer selvimplementerede kompilatorer i backend. Processen med at generere samlingsfiler udelades i processen med at generere objektfiler. Objektfilen genereres direkte fra IR. Udover, sammenlignet med GCC IR, datastrukturen for LLVM ir er mere kortfattet. Det optager mindre hukommelse under kompilering og understøtter hurtigere traversal. Derfor er Clang og LLVM fordelagtige med hensyn til kompileringstiden, hvilket er bevist ved de data, der er opnået fra SPEC-kompilering, som vist i nedenstående figur. Clang reducerer kompileringstiden med en tråd med 5% til 10% sammenlignet med GCC. Derfor tilbyder Clang flere fordele ved opførelsen af store projekter.

    Sammenligning af SPEC udarbejdelse tid

    Sammenligning af Udførelse Resultater

    de Fleste cloud arbejdsopgaver kræver, at applikationer kan køre i forskellige klynger. Når du opretter disse applikationer, skal du ikke angive maskinrelaterede parametre. For at tilpasse sig den hurtige iteration forårsaget af efterspørgselsændringer skal arbejdsbelastninger uden for lokalerne også kunne debugges. Bortset fra nogle stabile og almindelige biblioteker, der muliggør høje kompileringsoptimeringsniveauer, har arbejdsbyrden i sig selv et lavt kompilerings-og optimeringsniveau (O2 eller derunder). For at opfylde dette krav sammenligner dette dokument ydeevnen for forskellige kompilatorer på O2-og O3-optimeringsniveauerne for Int-Hastighedsprogrammer, som vist i den følgende figur:

    ydelsessammenligning af spec cpu2017 int-hastighed

    GCC har en 1% til 4% ydelsesfordel i forhold til clang og LLVM for de fleste programmer på O2-og O3-niveauerne og har i gennemsnit en cirka 3% ydelsesfordel for spec cpu2017 int-hastighed. I forhold til 600.perlbench_s og 602.gcc_s / O2, GCC har en stor ydelsesfordel (mere end 10%). Disse to testelementer har ingen fremragende hotspots og kan afspejle compilerens omfattende optimeringseffekt. Testresultaterne viser, at GCC altid er fordelagtigt i præstationsoptimering. Men for to AI-relaterede programmer, herunder 631.deepsjeng_s og 641.leela_s, som for nylig er tilføjet til SPEC-testen, forbedrer Clang og LLVM ydeevnen med mere end 3% sammenlignet med GCC. Dette afspejler også den hurtige udvikling af LLVM med hensyn til optimering. Til 625. 264_s O2 optimering, LLVM forbedrer ydeevnen med 40%, fordi sagens hotspot overholder de vektoriserede regler. Men Clang og LLVM optimerer vektorerne på O2-niveauet, mens GCC optimerer vektorerne på O3-niveauet. Bortset fra vektoriserede programmer forbedrer GCC ikke ydeevnen på O3-niveauet i høj grad sammenlignet med det på O2-niveauet. Med andre ord er programmerne ikke følsomme over for GCC O3-optimering. I modsætning hertil forbedrer Clang og LLVM betydeligt ydeevnen for nogle programmer (såsom 600. perlbench_s og 602. gcc_s) på O3-niveau.

    HPC-programmer, såsom FP-hastighed, kører generelt på avancerede servere. De har stabile kernealgoritmer, høje krav til præstationsrelateret vektorisering og parallelisme og muliggør høje niveauer af optimering (O3 eller derover). Derfor sammenligner dette dokument ydeevnen på O3 + march = native (skylake-avh512) optimeringsniveau, som vist nedenfor:

    Performance sammenligning af SPEC CPU2017 FP Hastighed

    For de to FP programmer, GCC også kan forbedre ydelsen med omkring 3%. Clang og LLVM er konservative i loop optimering og dermed ikke fordelagtige i ydeevne. Polly-delprojektet af Clang og LLVM giver imidlertid en loop-og datalokalitetsoptimering på højt niveau, der er blevet anvendt i vid udstrækning inden for maskinindlæring, højtydende computing og heterogen computeroptimering. Jeg tror, at Polly i høj grad kan forbedre ydeevnen for programmer, der indeholder hotspot-sløjfer, der overholder vektoriserings-og parallelitetsregler. Jeg vil også analysere Pollys ydeevne i en række benchmarks og arbejdsbyrder.

    afsluttende bemærkninger

    fra benchmarkingstestene ovenfor kan vi se, at Clang giver flere fordele ved opførelsen af store projekter, mens GCC altid er fordelagtig i præstationsoptimering. Bla afhænger af din specifikke applikation

    ud over præstationssammenligning vil jeg gerne dele fordele og ulemper ved GCC og Clang og LLVM:

    fordele ved GCC

    • GCC understøtter mere traditionelle sprog end Clang og LLVM, såsom Ada, Fortran og Go.
    • GCC understøtter mere mindre populære arkitekturer og understøttede RISC-V tidligere end Clang og LLVM.
    • GCC understøtter flere sprog udvidelser og flere samling sprog funktioner end Clang og LLVM. GCC er stadig den eneste mulighed for at kompilere Linuk-kernen. Selvom forskning i kernekompilering ved hjælp af Clang og LLVM også rapporteres i branchen, kan kernen ikke kompileres uden at ændre kildekoden og kompileringsparametrene.

    fordele ved Clang og LLVM

    • nye sprog bruger LLVM-rammerne, såsom hurtig, Rust, Julia og Ruby.
    • Clang og LLVM overholder C-og C ++ – standarderne mere strengt end GCC. GNU Inline og andre problemer under GCC opgradering forekommer ikke.
    • Clang understøtter også nogle udvidelser, såsom attributter til trådsikkerhedskontrol.
    • Clang giver yderligere nyttige værktøjer, såsom scan-build og clang statisk analysator til statisk analyse, clang-format og clang-tidy for syntaks analyse, samt editor plug-in Clangd.
    • Clang giver mere præcise og venlige diagnostiske oplysninger, og fremhæver fejlmeddelelser, fejl linjer, fejl linje prompter, og reparation forslag. Clang betragter de diagnostiske oplysninger som en funktion. Den diagnostiske information begyndte kun at blive forbedret fra GCC 5.0 og blev moden i GCC 8.

    (originalartikel af Ma Jun Lart)

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *