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++ tarjoaa graafisia käyttöliittymiä (GUIs) ja on helppo debugata, mutta se ei sovellu Linux-alustoille. Siksi tässä asiakirjassa verrataan pääasiassa GCC: tä clang/LLVM: ään.

GCC on GNU: n kehittämä ohjelmakielen kääntäjä. Se on joukko vapaita ohjelmistoja, jotka on julkaistu GNU General Public License (GPL) – ja GNU Lesser General Public License (LGPL) – lisensseillä. Se on virallinen kääntäjä GNU-ja Linux-järjestelmille sekä pääasiallinen kääntäjä muiden UNIX-käyttöjärjestelmien kokoamiseen ja luomiseen.

LLVM sisältää sarjan modularisoituja kääntäjän komponentteja ja työkaluketjuja. Se voi optimoida ohjelmakieliä ja linkkejä kokoamisen, ajonaikaisen ja käyttämättömän ajan aikana ja tuottaa koodia. LLVM voi toimia taustana kääntäjille useilla kielillä. Clang on C -, C++ -, Objective-C-tai Objective-C++ – kääntäjä, joka on käännetty C++ – kielellä LLVM: n pohjalta ja julkaistu Apache 2.0-lisenssillä. Clangia käytetään pääasiassa GCC: tä paremman suorituskyvyn tarjoamiseen.

pitkäjänteisen kehityksen ja iteroinnin kautta GCC: stä, Clangista ja LLVM: stä on tullut alalle kypsiä kääntäjiä. Kumpi Kääntäjä on sitten parempi? Kumpaa meidän pitäisi käyttää ohjelmien ja järjestelmien kokoamiseen ja rakentamiseen?

hyvän kääntäjän merkitys

nykyaikaisissa suorittimissa on kaikissa superscalar ja pitkät putkistot sekä monimutkaiset sisäiset rakenteet, ja ne tukevat Vektorilaajennusyksiköitä Complex Instruction Set Computer (CISC) – tai Reduced Instruction Set Computer (RISC) – arkkitehtuurissa. Monille ohjelmille, jotka sisältävät yleisiä laskentaintensiivisiä ytimiä, ohjelmoijat voivat käyttää vektorilaajennuskomentoja parantaakseen huomattavasti ohjelman suoritustasoa. Esimerkiksi matriisi-ja vektorioperaatioissa käytetään yhdistettyjä kerto-ja yhteenlaskukäskyjä suorituskyvyn ja tarkkuuden parantamiseksi. Bit mask-komentoja käytetään haaran käsittelyyn vektorioperaatioissa. Kuitenkin, saavuttaa korkeimman suorituskyvyn, ohjelmoijat ja kääntäjät vielä kuluttaa paljon vaivaa käsitellä tehtäviä monimutkaisia muistin käyttötilat ja epätyypilliset ytimet.

lisäksi nykyaikaisten kehittyneiden kielten standardit abstrahoivat jatkuvasti taustalla olevien laitteistojen ja tietorakenteiden yksityiskohdat luodakseen yleisen, loogisemman ja matemaattisemman koodin erityisten toimintaohjeiden ja muistinkäyttöpolkujen sijaan. C++ – standardit ovat yhä ekspressiivisempiä ja abstraktimpia. Python on suosittu, koska se on luettavampi ja ilmaisuvoimaisempi, jopa alhaisemman juoksun nopeuden kustannuksella. Suurempi ekspressiivisyys lisää kääntäjän taakkaa tuottaa hyvää kokoonpanokoodia ohjelmoijien kokoamista monimutkaisista rakenteista. Kääntäjän on oltava älykkäämpi ja työskenneltävä kovemmin maksimoidakseen suorituskyvyn koodin avulla. Kaikki kääntäjät eivät pysty tähän. Kääntäjää valitessa on ensin mietittävä, voiko sama koodisegmentti tuottaa tehokkaampia assembly-komentoja.

tehokkaiden suoritettavien ohjelmien tuottamisen lisäksi nykyaikaisilla kääntäjillä täytyy olla myös itse korkea suorituskyky. Suurikokoinen C++ – kielinen ohjelmistoprojekti voi sisältää satoja tai tuhansia yksittäisiä käännösyksiköitä. Kukin käännösyksikkö voi sisältää tuhansia rivejä koodia. C++ – koodissa voidaan käyttää myös suurta määrää mallipohjaisia ohjelmointitekniikoita. Nämä tekniikat edellyttävät kääntäjän siirtävän merkityksellisiä tietoja useita kertoja luodakseen kohdetiedoston. Suurikokoisten C++ – projektien kokoaminen voi kestää useita tunteja, ja useita toisistaan riippuvia muutoksia on toimitettava samanaikaisesti kehitystyön aikana. Jokainen lähetys vaatii kehittäjiä kääntämään uudelleen suurimman osan koodikirjastoista. Siksi nopeammat kääntäjät (build tools) ovat kriittisiä suurten joukkueiden korkean tuottavuuden saavuttamiseksi.

kielen laajentamisen osalta nykyaikaiset moniytimiset tietojenkäsittelyjärjestelmät, vektorinkäsittelykyvyt ja kiihdyttimet tarjoavat valmiuksia, jotka ovat parempia kuin yhteisten ohjelmointikielten luonnolliset kyvyt. Siksi erityiset korkean suorituskyvyn laskentajärjestelmät (HPC), kuten OpenMP ja OpenACC, voivat täyttää tämän aukon. Nämä puitteet tarjoavat sovellusrajapintoja (API), joita ohjelmoijat voivat käyttää ilmaisemaan rinnakkaisuutta koodissa. Kääntäjän ja vastaavan runtime-kirjaston on kartoitettava rinnakkaiskoodi suoritinarkkitehtuuriin. Monet HPC-projektit ovat riippuvaisia OpenMP-ja OpenACC-standardeista, joita kehittäjät ja laitevalmistajat laajentavat. Siksi kääntäjien on pysyttävä mukana kielen laajennusstandardien kehityksessä.

yhteenvetona voidaan todeta, että hyvä kääntäjä antaa meille mahdollisuuden keskittyä ohjelmointiprosessiin sen puutteiden torjumisen sijaan. Se voi tukea uusimpia kielistandardeja, tuottaa optimoituja komentoja abstraktimmasta koodista ja kääntää lähdekoodin lyhyemmässä ajassa.

GCC: n kehityshistoria

ennen GCC: n oppimista on ensin ymmärrettävä GNU-projekti. Richard Stallman käynnisti GNU-projektin vuonna 1984 Unixin kaltaisen avoimen lähdekoodin ohjelmistojärjestelmän rakentamiseksi. GNU-käyttöjärjestelmä ei ole kehittynyt laajasti aikojen saatossa. Se on kuitenkin hautonut monia erinomaisia ja hyödyllisiä avoimen lähdekoodin ohjelmistotyökaluja, kuten Make, Sed, Emacs, Glibc, GDB ja GCC. Nämä GNU: n avoimen lähdekoodin ohjelmistot ja Linux-ytimet muodostavat yhdessä GNU / Linux-järjestelmän. Alussa GCC tarjosi vakaita ja luotettavia kääntäjiä, jotka perustuivat C-ohjelmointikieleen, GNU-järjestelmälle. Sen koko nimi on GNU C kääntäjä. Myöhemmin tuettiin useampia kieliä (kuten Fortran, Obj-C ja Ada), ja GCC: n koko nimi muuttui GNU Compiler Collectioniksi.

GCC-1.0: n julkaisi Richard Stallman vuonna 1987, yli kolmekymmentä vuotta sitten. Ohjelmiston näkökulmasta se on hyvin vanha. Joku keräsi GCC: n kehitystiedot vuosilta 1989-2012 ja tuotti kolmenkymmenen minuutin animaatiovideon (GNU Compiler Collection dev history 1989-2012), joka intuitiivisesti havainnollisti GCC: n kehitysprosessin. GCC: n kehityshistoriaan voi tutustua sen versioista:

  • GCC-1.0: Richard Stallmanin vuonna 1987 julkaisema.
  • gcc-2.0: julkaistiin vuonna 1992 ja tuettiin C++: aa. Myöhemmin GCC-yhteisö jakautui, koska Richard Stallman määritteli GCC: n luotettavaksi GNU-järjestelmän C-kääntäjäksi ja katsoi GCC: n tuolloin riittävän GNU-järjestelmälle ja kehityksen painopiste tulisi siirtää GCC: stä itse GNU-järjestelmään. Muut suuret kehittäjät toivoivat jatkavansa GCC: n parantamista ja tekevänsä radikaalimpaa kehitystä ja parannuksia eri osa-alueilla. Nämä aktiiviset Kehittäjät jättivät GCC-yhteisön vuonna 1997 ja kehittivät EGCS-haarukan.
  • GCC-3.0: ilmeisesti kehittäjillä oli yleensä kova halu hyviin kääntäjiin. EGCS-haarukka kehittyi sujuvasti ja tuli yhä useamman kehittäjän tunnustamaksi. Lopulta EGCS: ää käytettiin uutena GCC: n selkärankana ja GCC-3.0 julkaistiin vuonna 2001. Hajonnut yhteisö yhdistettiin uudelleen, mutta Richard Stallmanin vaikutusvalta oli jossain määrin heikentynyt. Lisäksi GCC: n Teollisuuskomitea oli alkanut päättää GCC: n kehityssuunnasta.
  • gcc-4.0: julkaistiin vuonna 2005. Tämä versio oli integroitu Tree Serial Storage Architecture (SSA), ja GCC kehittynyt moderni kääntäjä.
  • gcc-5.0: julkaistiin vuonna 2015. Myöhemmin GCC: n versiokäytäntöä muutettiin ja siitä julkaistiin joka vuosi merkittävä versio. Odottamaton etu on, että versionumero vastaa vuotta. Esimerkiksi gcc-7 julkaistiin vuonna 2017 ja GCC-9 vuonna 2019.

nyt GCC: n kehitys on tullut ”moderniin kronikkaan”. LLVM: n kilpailupaineen vuoksi GCC-yhteisö on aktiivisesti tehnyt monia muutoksia, kuten nopeuttanut tietojen keruuta ja parantanut tietojen keruuta koskevia varoituksia. Viimeisten 30 vuoden aikana GCC on kehittynyt kääntäjäteollisuuden haastajasta Linux-järjestelmien valtavirran kääntäjäksi ja kohtaa nyt LLVM: n haasteen. Onneksi GCC-yhteisö tekee muutoksia nopeuttaakseen GCC: n kehitystä. Voimme odottaa, että kahden käännöstekniikan välinen kilpailu tarjoaa ohjelmistokehittäjille jatkossakin parempia kääntäjiä.

Clangin ja LLVM: n kehityshistoria

LLVM sai alkunsa Chris Lattnerin UUIC-sivustolla vuonna 2000 tekemästä tutkimuksesta. Chris Lattner halusi luoda dynaamisen kokoomatekniikan kaikille staattisille ja dynaamisille kielille. LLVM on avoimen lähdekoodin ohjelmisto, joka on kehitetty BSD-lisenssillä. Alkuperäinen versio 1.0 julkaistiin vuonna 2003. Vuonna 2005 Apple Inc. palkkasi Chris Lattnerin tiimeineen kehittämään ohjelmointikieliä ja kääntäjiä Applen tietokoneille, minkä jälkeen LLVM: n kehitys siirtyi pikakaistalle. LLVM 2.5: stä alkaen julkaistiin joka vuosi kaksi pienempää LLVM-versiota (yleensä maalis-syyskuussa). Marraskuussa 2011 LLVM 3.0 julkaistiin Xcode-kääntäjän oletukseksi. Xcode 5 alkoi käyttää oletuksena Clangia ja LLVM 5.0: aa. Versiokäytäntö muutettiin LLVM 5.0: n ja sitä uudempien versioiden mukaiseksi, ja joka vuosi julkaistaan kaksi pääversiota. Nykyinen vakaa versio on 8.0.

LLVM: n nimi lyhennettiin aluksi Low Level Virtual Machinesta. Koska hanke ei rajoitu virtuaalikoneen luomiseen, lyhenne LLVM kyseenalaistetaan usein. LLVM: n kehittämisen jälkeen siitä tuli yhteisnimitys monille käännöstyökaluille ja matalan tason työkalutekniikoille, jolloin nimi ei ollut yhtä sopiva. Kehittäjät päättivät luopua tämän lyhenteen takana olevasta merkityksestä. Nyt LLVM: stä on tullut virallinen tuotenimi, jota sovelletaan kaikkiin LLVM: n alaisiin projekteihin, mukaan lukien LLVM Intermediate Representation (LLVM IR), LLVM-virheenkorjaustyökalut ja LLVM C++ – standardikirjastot. LLVM: ää voidaan käyttää perinteisenä kääntäjänä, JIT-kääntäjänä, assemblerina, debuggerina, staattisena analyysityökaluna ja muissa ohjelmointikieliin liittyvissä toiminnoissa.

vuonna 2012 LLVM voitti Association for Computing Machineryn (ACM) software system award-palkinnon yhdessä perinteisten järjestelmien, kuten Unixin, WWW: n, TCP / IP: n, Texin ja Javan kanssa. LLVM yksinkertaistaa huomattavasti uusien ohjelmointikielen työkaluketjujen toteuttamista. Viime vuosina monet uudet ohjelmointikielet, kuten Swift, Rust ja Julia, ovat käyttäneet LLVM: ää käännöskehyksenään. Lisäksi LLVM: stä on tullut Mac OS X -, iOS -, FreeBSD-ja Android-järjestelmien oletuskääntäjä.

Clang

Clang on suunniteltu tarjoamaan frontend-kääntäjä, joka voi korvata GCC: n. Apple Inc. (myös seuraava myöhemmin) on käyttänyt GCC virallisena kääntäjänä. GCC on aina menestynyt hyvin standardikääntäjänä avoimen lähdekoodin yhteisössä. Kuitenkin Apple Inc. on omat vaatimukset kokoelma työkaluja. Yhtäältä Apple Inc. lisätty monia uusia ominaisuuksia Objective-C kieli (tai jopa myöhemmin, C kieli). GCC: n kehittäjät eivät kuitenkaan hyväksyneet näitä ominaisuuksia ja antoivat näille ominaisuuksille alhaisen prioriteetin tuen. Myöhemmin ne jaettiin vain kahteen haaraan erillistä kehitystä varten, ja näin ollen Apple Inc: n julkaisema GCC-versio. on paljon aikaisempi kuin virallinen versio. Toisaalta GCC-koodi on hyvin kytketty ja vaikea kehittää erikseen. Lisäksi myöhemmissä versioissa koodin laatu heikkenee edelleen. Kuitenkin monia toimintoja tarvitaan Apple Inc. (kuten IDE (improved Integrated Development Environment) support) on kutsuttava GCC moduulina, mutta GCC ei koskaan tarjoa tällaista tukea. Lisäksi GCC Runtime Library-poikkeus rajoittaa olennaisesti LLVM GCC: n kehitystä. Myös rajoitettu lisenssillä, Apple Inc. LLVM: ää ei voi käyttää GCC: hen perustuvan koodin laatimisen laadun parantamiseen. Siksi Apple Inc. päätti kirjoittaa C -, C++ – ja Objective-C-kielten frontend Clangin tyhjästä korvatakseen GCC: n kokonaan.

nimensä mukaisesti Clang tukee vain C: tä, C++: aa ja Objective-C: tä.kehitystyö aloitettiin vuonna 2007 ja C-kääntäjä valmistui ensin. Clang for Objective-C cloud otetaan käyttöön tuotantoympäristössä vuonna 2009. Myös C++: n tuki eteni nopeasti. Clang 3.3 täysin tuettu C++ 11, Clang 3.4 täysin tuettu c++ 14, ja Clang 5 täysin tuettu c++ 17, ja kaikki olivat merkittävästi edellä GCC tuolloin.

Clang/LLVM ja GCC-yhteisö

muiden avoimen lähdekoodin ohjelmistoyhteisöjen tapaan GCC-yhteisöä hallitsevat vapaiden ohjelmistojen harrastajat ja hakkerit. Kehitysprosessissa GCC: n yhteisöhallinto-ja osallistumismekanismit muodostetaan nykyään vähitellen. Tällä hetkellä GCC-yhteisö on suhteellisen vakaa ja hyvin määritelty tuttavuusyhteisö, jossa jokaisella on selkeät roolit ja velvollisuudet:

  • Richard Stallman ja Free Software Foundation (FSF): vaikka he ovat harvoin mukana GCC-yhteisön hallinnossa, Richard Stallman ja FSF ovat edelleen irrallisia lisenssi-ja lakiasioissa.
  • GCC: n Teollisuuskomitea: Se hoitaa GCC: n yhteisöasioita, teknologiasta riippumattomia GCC: n kehitysaiheita sekä arvostelijoiden ja ylläpitäjien nimittämistä ja julkistamista. Sillä on tällä hetkellä 13 jäsentä.
  • globaalit ylläpitäjät: he hallitsevat GCC: n kehitystoimintaa. Ne määrittävät jossain määrin GCC: n kehityssuuntaa. Tällä hetkellä on 13 maailmanlaajuista ylläpitäjää, jotka eivät kaikki toimi GCC: n Teollisuuskomiteassa.
  • Frontend, middle-end ja backend ylläpitäjät: he ovat frontendin, backendin ja muiden moduulien ylläpitäjiä. He ovat vastuussa vastaavan GCC-moduulin koodista, ja monet heistä ovat moduulikoodin pääasiallisia antajia. On syytä huomata, että arvostelijat luokitellaan yleensä tähän ryhmään. Erona on se, että arvostelijat eivät voi hyväksyä omaa korjaustiedostoaan, kun taas ylläpitäjät voivat toimittaa omia muutoksiaan oman vastuualueensa puitteissa ilman arvostelijoiden hyväksyntää.
  • avustajat: he ovat GCC-yhteisön laajimpia kehittäjäryhmiä. Allekirjoittamisen jälkeen tekijänoikeussopimuksen, kuka tahansa kehittäjät voivat hakea kirjallisesti hyväksynnän jälkeen lupaa yhteisöltä, ja sitten lähettää koodin itse.

muiden avoimen lähdekoodin yhteisöjen tavoin kypsä GCC-yhteisö ei ole enää hakkereiden hallitsema. Kaupallisilla yrityksillä alkoi olla yhteisössä tärkeitä tehtäviä, kuten kehittäjien rekrytointi ja kehitystapaamisten sponsorointi. Tällä hetkellä GCC-yhteisöä hallitsevat seuraavantyyppiset kaupalliset yritykset:

  • järjestelmätoimittajat, pääasiassa RedHat ja SUSE.
  • Sirutoimittajia, lähinnä Intel, ARM, AMD ja IBM (PowerPC).
  • erikoistuneet myyjät, kuten CodeSourcery ja työkaluketjun palveluntarjoajat kuten Adacore, joka perustuu Ada-kieleen. Codesourceryllä oli loistava historia ja hän värväsi monia kuuluisia kehittäjiä, mutta kieltäytyi mentorin ostettua sen.

nykyisessä GCC-yhteisössä sirutoimittajat hallitsevat taustajärjestelmien kehitystä, kun taas järjestelmätoimittajat ohjaavat muita kehitysalueita. Yhteisökehityksen kannalta GCC-koodia isännöi tällä hetkellä oma SVN-palvelimensa. Git API tarjotaan helpottamaan kehitystä ja toimittamista. Patch review on samanlainen kuin Linux-ytimen yhteisössä ja käyttää Postituslistalomaketta. Kuten edellä mainittiin, GCC-yhteisö on suhteellisen vakaa (tai suljettu) tuttavayhteiskunta. Yhteisöllä on vuosittain 150-200 aktiivista avustajaa, ja se järjestää vuosittain syyskuussa kehittäjäkonferenssin. Syyskuussa 2019 developer conference järjestetään Montrealissa, Kanadassa.

LLVM-yhteisö

LLVM-yhteisö on noobiystävällinen kääntäjäyhteisö. Se vastaa nopeasti uusien käyttäjien ja korjaustiedostojen kysymyksiin. Tämä on myös perusta ja lähde myöhemmille LLVM-säätiön keskusteluille ja LLVM-yhteisön käytännesääntöjen hyväksymiselle ja aiheuttaa joukon poliittisesti korrekteja keskusteluja.

kaikista LLVM: n projekteista ja ongelmista keskustellaan DevExpress-sähköpostiluettelon kautta, ja koodin toimittamisesta ilmoitetaan Committee-sähköpostiluettelon kautta. Kaikki viat ja ominaisuusmuutokset seurataan vikaluettelon kautta. Lähetettyjä laastareita suositellaan päähaaroille. Tyyli noudattaa LLVM-koodausstandardeja ja koodin tarkistus suoritetaan Phabricatorilla. Tällä hetkellä LLVM-koodivarasto on siirretty GitHubiin.

toisin kuin GCC-yhteisöllä, LLVM-yhteisöllä on vain LLVM-säätiö. LLVM-säätiössä on kahdeksan jäsentä. LLVM-yhteisöasioiden hoitamisen lisäksi jokaisen LLVM-säätiön jäsenen on ohjattava teknologiaan liittyviä LLVM-kehitysasioita. Tällä hetkellä presidenttinä toimii Tanya Lattner, Chris Lattnerin Vaimo. Chris Lattner itse on myös säätiön jäsen ja hallitsee vahvasti LLVM-yhteisöä ja LLVM: n kehityslinjaa.

LLVM-yhteisön code review-politiikka on periaatteessa sama kuin GCC-yhteisössä. Erona on se, että LLVM: n nopean kehityksen vuoksi monilla maksajilla ei ole commit access-lupaa, vaan heidän on toimitettava koodinsa ylläpitäjien kautta. Tällä hetkellä Clang-ja LLVM-yhteisöillä on vuosittain yli 1 000 lahjoittajaa. Yleensä kehittäjäkonferensseja järjestetään vuosittain huhti-lokakuussa. Kehittäjäkonferenssi lokakuussa 2019 pidetään San Josessa, Yhdysvalloissa.

LLVM-lisenssi muuttuu UIUC-lisenssistä Apache 2.0-lisenssiksi LLVM-poikkeuksia lukuun ottamatta. Sitä käytetään lähinnä ongelman ratkaisemiseen, että LLVM runtime-kirjasto perustuu MIT-Lisenssiin ja projektiin vaadittava patenttilupa on liian laaja. Tämän Lisenssin nojalla LLVM sallii kenen tahansa johtaa kaupallisia tuotteita LLVM: stä ilman rajoituksia, eikä vaadi, että johdannaiset tarjoavat avointa lähdekoodia, mikä edistää LLVM: n laajaa käyttöä, mukaan lukien:

  1. LLVM: n lataaminen tai käyttö kokonaan tai osittain henkilökohtaisiin, sisäisiin tai kaupallisiin tarkoituksiin. Kyky muokata LLVM-koodia ilman, että se palautetaan projektiin.
  2. LLVM: ää sisältävän paketti-tai julkaisuversion luominen. LLVM: n yhdistäminen koodiin, jonka kaikki muut suuret avoimen lähdekoodin lisenssit (mukaan lukien BSD, MIT, GPLv2 ja GPLv3) ovat hyväksyneet.
  3. kun levität LLVM: ää uudelleen, sinun tulee säilyttää tekijänoikeusilmoitus. Et voi poistaa tai korvata tekijänoikeuksien otsikkoa. LLVM: n sisältävän binääritiedoston on sisällettävä tekijänoikeusilmoitus.

Suorituskykyvertailu GCC: n ja LLVM: n välillä

Arkkitehtuuri: x86_64
Suoritin: Intel (R) Xeon (R) Platinum 8163 suoritin @ 2,50 GHz
L1 datavälimuisti: 32 KB
L2 välimuisti: 1,024 KB
L3 välimuisti: 33,792 KB
muisti: 800 GB
käyttöjärjestelmä: Alibaba Group Enterprise Linux Server release 7,2 (Paladin)
kernel: 4.9.151–015.ali3000.alios7.x86_64
Compiler: Clang/LLVM 8.0 GCC8.3.1

Benchmark

SPEC CPU 2017 on joukko suorittimen alijärjestelmän testityökaluja suorittimen, välimuistin, muistin ja kääntäjän testaamiseen. Se sisältää 43 testiä neljästä luokasta, mukaan lukien SPECspeed 2017 INT ja FP, jotka testaavat kokonaislukunopeutta ja liukulukutoimintanopeutta, ja SPECrate 2017 INT ja FP, jotka testaavat kokonaisluvun ja liukulukujen samanaikaisuutta. Clang ei tue Fortranin kieltä. Siksi tässä esimerkissä SPEC-Nopeustestisarjan c/c ++ – ohjelmia käytetään testaamaan clangin ja GCC: n tuottamien binääriohjelmien yksiytimistä suorituskykyeroa. Seuraavassa taulukossa on lueteltu SPEC CPU2017 C-ja C++ – sarjat:

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

testimenetelmät

LLVM-lnt automaatiokehystä käytetään testin suorittamiseen ja suorituskyvyn vertailuun. Se toimii samalla tavalla kuin SPEC-suorittimen runcpu. Ennen LLVM-lnt-ajoa tyhjennetään välimuisti (echo 3 > /proc/sys/vm/drop_caches), jonka jälkeen testiaineisto suoritetaan. Seuraavaksi ref dataset toimii kolme kertaa. Lopputuloksena käytetään kolmen ref-testiajon tuloksen keskiarvoa. Suorittimen migraation tai kontekstikytkimen aiheuttaman suorituskyvyn vaihtelun vähentämiseksi testiaineistossa ja ref-aineistossa käynnissä olevat prosessit sidotaan suorittimen ytimeen suorittimen affiniteettityökalun avulla. Compile time-testiä varten tämä menetelmä käyttää säiettä 1 testiohjelman rakentamiseen ja pitkään koottujen testikohteiden vertailuun. Käännösaika ei sisällä linkerin suoritusaikaa. Se sisältää vain ajan, jolloin kaikkien testiohjelmien kaikki lähdetiedostot on luotu.

Compilation Performance Comparison

GCC: n kokoamisprosessi on seuraava: Lue lähdetiedosto, esikäsitellä lähdetiedosto, muuntaa sen IR, optimoida ja luoda kokoonpanotiedosto. Sitten assembler luo objektitiedosto. Clang ja LLVM eivät tukeudu itsenäisiin kääntäjiin, vaan integroivat itse toteutetut kääntäjät taustajärjestelmään. Assembly-tiedostojen generointiprosessi jätetään pois objektitiedostojen generointiprosessissa. Objektitiedosto luodaan suoraan IR. Sitä paitsi GCC IR: ään verrattuna LLVM IR: n tietorakenne on suppeampi. Se vie vähemmän muistia kokoamisen aikana ja tukee nopeampaa läpikulkua. Tämän vuoksi Clang ja LLVM ovat hyödyllisiä keräysajan suhteen, minkä todistavat SPEC-keräyksestä saadut tiedot, kuten alla olevasta kuvasta näkyy. Clang vähentää yhden kierteen kokoamisaikaa 5-10% verrattuna GCC: hen. Siksi Clang tarjoaa enemmän etuja rakentamiseen suurten hankkeiden.

Specin kokoamisajan vertailu

suoritustehon vertailu

useimmat pilvityökuormat edellyttävät, että sovellukset voivat toimia eri klustereissa. Kun luot näitä sovelluksia, Älä määritä koneeseen liittyviä parametreja. Mukautuakseen kysynnän muutosten aiheuttamaan nopeaan iteraatioon myös muualla kuin toimitiloissa olevien työmäärien on oltava debuggattavissa. Siksi, lukuun ottamatta joitakin vakaita ja yhteisiä kirjastoja, jotka mahdollistavat suuren kokoamisen optimointitasot, työmäärä itsessään on alhainen kokoelma-ja optimointitaso (O2 tai alle). Tämän vaatimuksen täyttämiseksi tässä asiakirjassa verrataan eri kääntäjien suorituskykyä O2-ja O3-optimointitasoilla INT-Nopeusohjelmille, kuten seuraavassa kuvassa esitetään.:

suorituskykyvertailu Spec cpu2017 int nopeudesta

gcc: llä on 1-4% suorituskykyetu clangiin ja LLVM: ään verrattuna useimmissa O2-ja O3-tasoisissa ohjelmissa, ja keskimäärin sillä on noin 3% suorituskykyetu Spec cpu2017 int nopeuteen. 600.perlbench_s ja 602.gcc_s / O2, GCC: llä on suuri suorituskykyetu (yli 10%). Näillä kahdella testikappaleella ei ole erinomaisia hotspotteja, ja ne voivat heijastaa kääntäjän kattavaa optimointivaikutusta. Testitulokset osoittavat, että GCC on aina edullinen suorituskyvyn optimoinnissa. Kuitenkin kahteen tekoälyyn liittyvään ohjelmaan, mukaan lukien 631.deepsjeng_s ja 641.LEELA_S, jotka on juuri lisätty SPEC-testiin, Clang ja LLVM parantavat suorituskykyä yli 3% verrattuna GCC: hen. Tämä kertoo myös LLVM: n nopeasta edistymisestä optimoinnissa. 625: lle. x264_s O2 optimointi, LLVM parantaa suorituskykyä 40%, koska hotspot tapauksessa noudattaa vectorized sääntöjä. Mutta Clang ja LLVM optimoivat vektorit O2-tasolla, kun taas GCC optimoi vektorit O3-tasolla. Vektoroituja ohjelmia lukuun ottamatta GCC ei paranna merkittävästi suorituskykyä O3-tasolla verrattuna O2-tasoon. Toisin sanoen, ohjelmat eivät ole herkkiä GCC O3 optimointi. Sen sijaan Clang ja LLVM parantavat merkittävästi joidenkin ohjelmien (kuten 600. perlbench_s ja 602. gcc_s) O3-tasolla.

HPC-ohjelmat, kuten FP Speed, toimivat yleensä huippuluokan palvelimilla. Niissä on vakaat ydinalgoritmit, korkeat vaatimukset suorituskykyyn liittyvälle vektoroinnille ja parallelismille, ja ne mahdollistavat korkean optimoinnin (O3 tai yli). Siksi tässä asiakirjassa verrataan suorituskykyä O3 + march = native (skylake-avx512) optimointitasolla, kuten alla on esitetty:

suorituskykyvertailu Spec cpu2017 FP nopeus

kahden FP-ohjelman osalta gcc voi myös parantaa suorituskykyä noin 3%. Clang ja LLVM ovat loop-optimoinniltaan konservatiivisia, eivätkä siten suorituskyvyltään edullisia. Clangin ja LLVM: n Polly-osaprojekti tarjoaa kuitenkin korkean tason loop-ja data-paikkaoptimaattorin, jota on sovellettu laajasti koneoppimisessa, korkean suorituskyvyn laskennassa ja heterogeenisessä tietojenkäsittelyn optimoinnissa. Uskon, että Polly voi merkittävästi parantaa suorituskykyä ohjelmia, jotka sisältävät hotspot silmukoita noudattaen vectorization ja parallelism sääntöjä. Analysoin myös Pollyn suorituskykyä vertailukohdissa ja työmäärissä.

Loppuhuomautukset

edellä esitetyistä benchmarking-testeistä voimme todeta, että Clang tarjoaa enemmän etuja suurten projektien rakentamiseen, kun taas GCC on aina edullinen suorituskyvyn optimoinnissa. Bla riippuu sovelluksestasi

suoritusvertailun lisäksi haluaisin kertoa GCC: n ja Clangin ja LLVM: n eduista ja haitoista:

GCC: n edut

  • GCC tukee Klangia ja LLVM: ää perinteisempiä kieliä, kuten Ada, Fortran ja Go.
  • GCC tukee enemmän vähemmän suosittuja arkkitehtuureja, ja tuki RISC-V: tä aikaisemmin kuin Clang ja LLVM.
  • GCC tukee enemmän kielilaajennuksia ja enemmän assembly-kielen ominaisuuksia kuin Clang ja LLVM. GCC on edelleen ainoa vaihtoehto Linux-ytimen kokoamiseen. Vaikka alalla raportoidaan myös ytimen kokoamista Clangin ja LLVM: n avulla koskevasta tutkimuksesta, ydintä ei voi koota muokkaamatta lähdekoodia ja kokoamisparametreja.

Clangin ja LLVM: n edut

  • kehittyvät kielet käyttävät LLVM: n kehyksiä, kuten Swift, Rust, Julia ja Ruby.
  • Clang ja LLVM noudattavat C-ja C ++ – standardeja tiukemmin kuin GCC. GNU Inline ja muita ongelmia GCC päivityksen aikana ei esiinny.
  • Clang tukee myös joitakin laajennuksia, kuten säikeiden turvatarkastuksen attribuutteja.
  • Clang tarjoaa muita hyödyllisiä työkaluja, kuten scan-build ja clang static analyzer staattiseen analyysiin, clang-format ja clang-tidy syntaksianalyysiin sekä editorin plug-in Clangd.
  • Clang tarjoaa tarkempia ja ystävällisempiä diagnostisia tietoja ja korostaa virheilmoituksia, virherivejä, virherivikehotteita ja korjausehdotuksia. Clang pitää diagnostisia tietoja ominaisuutena. Diagnostisia tietoja alettiin parantaa vasta GCC 5.0: sta, ja ne kypsyivät GCC 8: ssa.

(Ma Jun马骏in alkuperäinen artikkeli)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *