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++ poskytuje grafická uživatelská rozhraní (GUI) a snadno se ladí, ale není vhodný pro platformy Linux. Proto tento dokument především porovnává GCC s Clang / LLVM.

GCC je překladač programového jazyka vyvinutý společností GNU. Jedná se o soubor svobodného softwaru vydaného pod GNU General Public License (GPL) a GNU Lesser General Public License (LGPL). Je to oficiální kompilátor pro systémy GNU a Linux a hlavní kompilátor pro kompilaci a vytváření dalších operačních systémů UNIX.

LLVM obsahuje řadu modularizovaných komponent kompilátoru a řetězců nástrojů. Může optimalizovat programové jazyky a odkazy během kompilace, běhu a nečinnosti a generovat kód. LLVM může sloužit jako pozadí pro kompilátory ve více jazycích. Clang je kompilátor C, C++, Objective-C nebo Objective-C++, který je kompilován v C++ na základě LLVM a vydán pod licencí Apache 2.0. Clang se používá hlavně k poskytování výkonu nadřazeného výkonu GCC.

díky dlouhodobému vývoji a iteraci se GCC, Clang a LLVM staly vyspělými kompilátory v oboru. Který kompilátor je tedy lepší? Který z nich bychom měli použít k kompilaci a vytváření programů a systémů?

Význam Dobrého Kompilátoru

Moderní procesory mají všechny superskalárních a dlouhé potrubí a složité vnitřní struktury, a oni support vector extension jednotek v Komplexní Instrukční Set Computer (CISC) nebo Sníženou Instruction Set Computer (RISC) architektura. Pro mnoho programů, které obsahují obecná jádra náročná na výpočetní techniku, mohou programátoři pomocí příkazů s rozšířením vektorů výrazně zlepšit výkon provádění programu. Například v maticových a vektorových operacích se kombinované příkazy násobení a přidávání používají ke zlepšení výkonu a přesnosti. Příkazy bitové masky se používají pro zpracování větví ve vektorových operacích. K dosažení nejvyššího výkonu však programátoři a kompilátoři stále potřebují vynaložit velké úsilí na zpracování úkolů se složitými režimy přístupu do paměti a nestandardními jádry.

Navíc, standardy moderní pokročilé jazyky neustále abstraktní detaily základní hardware a datové struktury generovat obecné kód, který je více logické a matematické, namísto konkrétní návod a paměť přístupové cesty. Standardy C++ jsou stále výraznější a abstraktní. Python je populární, protože je čitelnější a výraznější, a to i za cenu nižší rychlosti běhu. Vyšší expresivita zvyšuje zátěž kompilátoru pro generování dobrého kódu sestavy ze složitých struktur kompilovaných programátory. Kompilátor musí být chytřejší a pracovat tvrději, aby maximalizoval výkon pomocí kódu. Ne všichni kompilátoři to dokážou. Při výběru kompilátoru musíme nejprve zvážit, zda stejný segment kódu může generovat efektivnější příkazy sestavy.

kromě generování vysoce výkonných spustitelných programů musí mít moderní kompilátory také vysoký výkon. Rozsáhlý softwarový projekt v jazyce C++ může obsahovat stovky až tisíce jednotlivých překladatelských jednotek. Každá překladová jednotka může obsahovat tisíce řádků kódu. Kód C++ může také používat velké množství programovacích technologií založených na šablonách. Tyto technologie vyžadují, aby kompilátor několikrát přenesl relevantní informace, aby vygeneroval cílový soubor. Kompilace velkých projektů v C++ může trvat několik hodin a během vývoje musí být současně předloženy více vzájemně závislých změn. Každý příspěvek vyžaduje, aby vývojáři překompilovali většinu knihoven kódu. Proto jsou rychlejší kompilátory (nástroje pro vytváření) rozhodující pro dosažení vysoké produktivity velkých týmů.

pokud jde o jazyk rozšíření, moderní počítačové systémy s více jádry, vektor možnosti zpracování, a urychlovače poskytují vynikající schopnosti přirozené schopnosti běžných programovacích jazyků. Proto mohou tuto mezeru zaplnit specifické vysoce výkonné výpočetní rámce (HPC), jako jsou OpenMP a OpenACC. Tyto rámce poskytují rozhraní aplikačních programů (API), které mohou programátoři použít k vyjádření paralelismu v kódu. Kompilátor a odpovídající runtime knihovna musí mapovat paralelní kód s architekturou procesoru. Mnoho projektů HPC závisí na standardech OpenMP a OpenACC, které vývojáři a výrobci hardwaru rozšiřují. Překladatelé proto musí držet krok s vývojem standardů pro rozšíření jazyka.

Závěrem lze říci, že dobrý kompilátor nám umožňuje zaměřit se spíše na proces programování než na boj proti jeho nedostatkům. Může podporovat nejnovější jazykové standardy, generovat optimalizované příkazy z nejvíce abstraktního kódu a zkompilovat zdrojový kód za kratší dobu.

historie vývoje GCC

než se naučíte GCC, musíte nejprve porozumět projektu GNU. Richard Stallman zahájil projekt GNU v roce 1984 s cílem vybudovat unixový open source softwarový systém. Operační systém GNU se postupem času příliš nevyvíjel. Inkuboval však mnoho vynikajících a užitečných softwarových nástrojů s otevřeným zdrojovým kódem, jako jsou Make, sed, Emacs, Glibc, GDB a GCC. Tyto GNU open source software a Linux jádra dohromady tvoří systém GNU/Linux. Na začátku gcc poskytovala stabilní a spolehlivé kompilátory založené na programovacím jazyce C pro systém GNU. Jeho plné jméno je GNU C Compiler. Později byly podporovány další jazyky (například Fortran, Obj-C a Ada) a celý název GCC byl změněn na GNU Compiler Collection.

GCC-1.0 vydal Richard Stallman v roce 1987, před více než třiceti lety. Z pohledu softwaru je velmi starý. Někdo sbíral GCC vývoj záznamy z mezi lety 1989 a 2012, a produkoval třiceti-minutové animované video (GNU Compiler Collection dev historie 1989-2012), intuitivně demonstrovat proces vývoje GCC. O historii vývoje GCC se můžeme dozvědět z jeho verzí:

  • GCC-1.0: vydal Richard Stallman v roce 1987.
  • GCC-2.0: vydáno v roce 1992 a podporováno C++. Později, GCC společenství byla rozdělena, protože Richard Stallman definovanými GCC jako spolehlivý C kompilátor GNU systém a myslel, že GCC v té době byl dostačující pro GNU systém a vývoj by měl být kladen důraz posunul z GCC GNU systém sám. Další hlavní vývojáři doufali, že budou pokračovat ve zlepšování GCC a budou radikálnější vývoj a vylepšení v různých aspektech. Tito aktivní vývojáři opustili komunitu GCC v roce 1997 a vyvinuli vidličku EGCS.
  • GCC-3.0: je zřejmé, že vývojáři obecně měli silnou touhu po dobrých kompilátorech. Vidlice EGCS se vyvíjela hladce a stala se uznávanou stále více vývojáři. Nakonec byl EGCS použit jako nová páteř GCC a GCC-3.0 byl propuštěn v roce 2001. Rozdělená komunita byla znovu sloučena, ale vliv Richarda Stallmana byl do určité míry oslaben. Průmyslový Výbor GCC navíc začal rozhodovat o směru vývoje GCC.
  • GCC-4.0: vydáno v roce 2005. Tato verze byla integrována do Tree Serial Storage Architecture (SSA) a GCC se vyvinul jako moderní kompilátor.
  • GCC-5.0: vydáno v roce 2015. Později byly upraveny zásady verze GCC a každý rok byla vydána hlavní verze. Nečekanou výhodou je, že číslo verze odpovídá roku. Například GCC-7 byl propuštěn v roce 2017 a GCC-9 byl propuštěn v roce 2019.

vývoj GCC nyní vstoupil do „moderní kroniky“. Tváří v tvář konkurenčnímu tlaku LLVM komunita GCC aktivně provedla mnoho úprav,jako je zrychlení kompilace a zlepšení varovných informací o kompilaci. Za posledních 30 let, GCC se vyvinul z challenger v kompilátoru průmyslu na tradiční kompilátor pro Linux systémy, a nyní čelí výzvě LLVM. Naštěstí komunita GCC provádí úpravy, aby urychlila vývoj GCC. Můžeme očekávat, že konkurence mezi těmito dvěma kompilačními technologiemi bude i nadále poskytovat vývojářům softwaru lepší kompilátory.

historie vývoje Clang a LLVM

LLVM vznikla z výzkumu Chrise Lattnera na UUIC v roce 2000. Chris Lattner chtěl vytvořit dynamickou kompilační technologii pro všechny statické a dynamické jazyky. LLVM je typ open source softwaru vyvinutého pod licencí BSD. Původní verze 1.0 byla vydána v roce 2003. V Roce 2005 Společnost Apple Inc. najal Chris Lattner a jeho tým na vývoj programovacích jazyků a kompilátorů pro počítače Apple, po kterém vývoj LLVM vstoupil do rychlého pruhu. Počínaje LLVM 2.5 byly každý rok vydávány dvě menší verze LLVM (obvykle v březnu a září). V listopadu 2011 byl LLVM 3.0 propuštěn, aby se stal výchozím kompilátorem XCode. XCode 5 začal používat Clang a LLVM 5.0 ve výchozím nastavení. Zásady verze byly upraveny pro LLVM 5.0 a novější verze a každý rok jsou vydávány dvě hlavní verze. Aktuální stabilní verze je 8.0.

název LLVM byl nejprve zkrácen z nízkoúrovňového virtuálního stroje. Protože tento projekt není omezen na vytvoření virtuálního stroje, zkratka LLVM je často zpochybňována. Poté, co byl LLVM vyvinut, se stal kolektivním termínem pro mnoho kompilačních nástrojů a nízkoúrovňových nástrojových technologií, což činí název méně vhodným. Vývojáři se rozhodli opustit význam této zkratky. Teď LLVM má stát oficiální značkou, platné pro všechny projekty v rámci LLVM, včetně LLVM Intermediate (Reprezentace LLVM IR), LLVM ladění nástroje, a LLVM C++ standardní knihovny. LLVM lze použít jako tradiční kompilátor, JIT kompilátor, assembler, debugger, statický analytický nástroj a pro další funkce související s programovacími jazyky.

v roce 2012 získal LLVM cenu software system award Asociace pro výpočetní techniku (ACM) spolu s tradičními systémy jako UNIX, WWW, TCP/ IP, TeX a Java. LLVM výrazně zjednodušuje implementaci nových řetězců nástrojů programovacího jazyka. V posledních letech mnoho nových programovacích jazyků, jako jsou Swift, Rust a Julia, použilo LLVM jako svůj kompilační rámec. LLVM se navíc stal výchozím kompilátorem pro systémy Mac OS X, iOS, FreeBSD a Android.

Clang

Clang je navržen tak, aby frontend kompilátor, který může nahradit GCC. Apple Inc. (včetně dalšího později) používá GCC jako oficiální kompilátor. GCC vždy fungoval jako standardní kompilátor v komunitě s otevřeným zdrojovým kódem. Nicméně, Apple Inc. má své vlastní požadavky na kompilační nástroje. Na jedné straně Apple Inc. přidáno mnoho nových funkcí pro jazyk Objective-C (nebo dokonce později jazyk C). Vývojáři GCC však tyto funkce nepřijali a přidělili jim nízkou prioritu podpory těchto funkcí. Později byly jednoduše rozděleny do dvou větví pro samostatný vývoj a následně verze GCC vydaná společností Apple Inc. je mnohem dříve než oficiální verze. Na druhou stranu, kód GCC je vysoce spojený a těžko se vyvíjí samostatně. Navíc v novějších verzích kvalita kódu stále klesá. Mnoho funkcí však vyžaduje Apple Inc. (například Vylepšená podpora integrovaného vývojového prostředí (IDE)) musí volat GCC jako modul, ale GCC takovou podporu nikdy neposkytuje. Výjimka z Runtime knihovny GCC navíc zásadně omezuje vývoj LLVM GCC. Licence je také omezena společností Apple Inc. nelze použít LLVM k dalšímu zlepšení kvality generování kódu na základě GCC. Proto Apple Inc. rozhodl se napsat frontend Clang jazyků C, C++ a Objective-C od nuly, aby zcela nahradil GCC.

jak název napovídá, Clang podporuje pouze C, C++ a Objective-C. vývoj byl zahájen v roce 2007 a kompilátor C byl poprvé dokončen. Clang pro Objective-C cloud být plně využity pro výrobní prostředí v roce 2009. Podpora pro C++ také postupovala rychle. Clang 3.3 plně podporoval C++ 11, Clang 3.4 plně podporoval C++ 14 a Clang 5 plně podporoval C++ 17 a všichni byli v té době výrazně před GCC.

komunita Clang / LLVM a GCC

stejně jako ostatní komunity s otevřeným zdrojovým kódem je komunita GCC ovládána nadšenci svobodného softwaru a hackery. V procesu vývoje se dnes postupně formují mechanismy řízení a účasti komunity GCC. V současné době, GCC společenství je relativně stabilní a dobře definované známost společnosti, v níž každý člověk má jasné úkoly a povinnosti:

  • Richard Stallman a Free Software Foundation (FSF): i když zřídka zapojeny v GCC řízení společenství, Richard Stallman a FSF jsou stále odděleny v licenční a právní záležitosti.
  • Průmyslový Výbor GCC: Řídí záležitosti komunity GCC, technologicky nezávislá témata vývoje GCC, a jmenování a oznámení recenzentů a správců. V současné době má 13 členů.
  • Globální správci: ovládají rozvojové aktivity GCC. Do jisté míry určují vývojový trend GCC. V současné době existuje 13 globálních správců, kteří ne všichni zastávají funkci v průmyslovém výboru GCC.
  • Frontend, middle-end a backend maintainers: jsou udržovateli frontendu, backendu a dalších modulů. Jsou zodpovědní za kód odpovídajícího modulu GCC a mnoho z nich je hlavními přispěvateli do kódu modulu. Stojí za zmínku, že recenzenti jsou obecně zařazeni do této skupiny. Rozdíl je v tom, že recenzenti nemohou schválit vlastní opravu, zatímco správci mohou předložit své vlastní úpravy v rámci své odpovědnosti bez souhlasu recenzentů.
  • přispěvatelé: Jedná se o nejrozsáhlejší skupiny vývojářů v komunitě GCC. Po podpisu smlouvy o autorských právech mohou vývojáři požádat o zápis po schválení od komunity a poté kód sami předložit.

stejně jako ostatní komunity s otevřeným zdrojovým kódem již vyspělá komunita GCC není ovládána hackery. Komerční společnosti začaly hrát v komunitě důležitou roli, jako je nábor vývojářů a sponzorování vývojových setkání. V současné době je komunita GCC ovládána následujícími typy komerčních společností:

  • prodejci systémů, zejména včetně RedHat a SUSE.
  • dodavatelé čipů, zejména včetně Intel, ARM, AMD a IBM (PowerPC).
  • specializovaní dodavatelé, jako jsou CodeSourcery a poskytovatelé služeb řetězce nástrojů, jako je AdaCore na základě jazyka Ada. CodeSourcery měl skvělou historii a přijal mnoho slavných vývojářů, ale odmítl poté, co byl získán mentorem.

v současné komunitě GCC dominují prodejci čipů vývoj backendu, zatímco dodavatelé systémů řídí další oblasti vývoje. Pokud jde o rozvoj komunity, kód GCC je v současné době hostován na vlastním SVN serveru. Pro usnadnění vývoje a odesílání je k dispozici rozhraní GIT API. Patch review je podobný tomu v komunitě linuxového jádra a používá formulář Mailing listu. Jak bylo uvedeno výše, komunita GCC je relativně stabilní (nebo uzavřená) známá společnost. Komunita má v zásadě 150 až 200 aktivních přispěvatelů každý rok a každoročně v září pořádá vývojářskou konferenci. V září 2019 se bude v kanadském Montrealu konat vývojářská konference.

LLVM komunita

LLVM komunita je noob-friendly kompilátor Společenství. Rychle reaguje na otázky nových uživatelů a recenze oprav. To je také základem a zdrojem pro následné diskuse nadací LLVM a přijetí Kodexu chování komunity LLVM, a způsobuje řadu politicky korektních diskusí.

všechny projekty a problémy LLVM jsou diskutovány prostřednictvím e-mailového seznamu DevExpress a odeslání kódu je oznámeno prostřednictvím e-mailového seznamu commits. Všechny chyby a úpravy funkcí jsou sledovány v seznamu chyb. Předložené záplaty se doporučují pro hlavní větve. Styl je v souladu s kódovacími standardy LLVM a kontrola kódu se provádí prostřednictvím Phabricatoru. V současné době bylo úložiště kódu LLVM migrováno na GitHub.

Na rozdíl od komunity GCC má komunita LLVM pouze nadaci LLVM. Nadace LLVM má osm členů. Kromě řízení komunitních záležitostí LLVM musí každý člen nadace LLVM řídit rozvojové otázky LLVM související s technologií. V současné době je prezidentkou Tanya Lattner, manželka Chris Lattner. Chris Lattner sám je také členem nadace a má silnou kontrolu nad komunitou LLVM a směrem rozvoje LLVM.

zásady kontroly kódu v komunitě LLVM jsou v podstatě stejné jako v komunitě GCC. Rozdíl je v tom, že kvůli rychlému vývoji LLVM mnoho přispěvatelů nemá oprávnění k přístupu k odevzdání a musí předložit svůj kód prostřednictvím správců. V současné době mají komunity Clang a LLVM každý rok více než 1,000 XNUMX přispěvatelů. Obvykle, vývojářské konference se konají každoročně v dubnu a říjnu. Vývojářská konference v říjnu 2019 se bude konat v San Jose v USA.

Licence LLVM je změněna z Licence UIUC na licenci Apache 2.0 s výjimkami LLVM. Používá se hlavně k vyřešení problému, že runtime knihovna LLVM je založena na licenci MIT a patentová autorizace potřebná pro projekt je příliš rozsáhlá. Na základě této licence umožňuje LLVM komukoli odvozovat komerční produkty z LLVM bez jakýchkoli omezení a nevyžaduje, aby jakékoli deriváty poskytovaly otevřený zdrojový kód, čímž podporuje rozsáhlé používání LLVM, včetně:

  1. stahování nebo použití LLVM zcela nebo zčásti pro osobní, interní nebo komerční účely. Schopnost modifikovat LLVM kód bez přispění zpět do projektu.
  2. vytvoření balíčku nebo verze verze obsahující LLVM. Asociace LLVM s kódem autorizovaným všemi ostatními hlavními open source licencemi (včetně BSD, MIT, GPLv2 a GPLv3).
  3. při opětovné distribuci LLVM musíte zachovat oznámení o autorských právech. Záhlaví autorských práv nelze odstranit ani nahradit. Binární soubor obsahující LLVM musí obsahovat oznámení o autorských právech.

Porovnání Výkonu mezi GCC a LLVM

Architektura: x86_64
Procesor: Intel (R) Xeon (R) Platinum 8163 CPU @ 2.50 GHz
L1 data cache: 32 KB
L2 cache: 1024 KB
L3 cache: 33,792 KB
Paměť: 800 GB
Operační systém: Alibaba Group Enterprise Linux Server, release 7.2 (Paladin)
Jádro: 4.9.151–015.ali3000.alios7.x86_64
Compiler: Clang/LLVM 8.0 GCC8.3.1

Měřítko

SPEC CPU 2017 je sada subsystému CPU testovací nástroje pro testování PROCESORU, cache, paměť, a kompilátor. Obsahuje 43 testy ze čtyř kategorií, včetně SPECspeed 2017 INT a FP, které testují celé číslo, rychlost a operace s plovoucí desetinnou čárkou rychlost a SPECrate 2017 INT a FP, které testují číslo souběžnosti rychlost a plovoucí bod souběžnosti rychlost. Clang nepodporuje jazyk Fortran. Tedy, v tomto příkladu, C/C ++ programy v SPEC Rychlost testovací sady se používají k testování single-core výkon rozdíl mezi binární programy vytvořené Clang a GCC. V následující tabulce jsou uvedeny SPEC CPU2017 C A C++ sady:

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

zkušební metody

k provedení testu a porovnání výkonu se používá automatizační rámec LLVM-lnt. Běží stejným způsobem jako runcpu SPEC CPU. Před LLVM-lnt běží, cache (echo 3 > /proc/sys/vm/drop_caches) je zrušeno a pak test dataset běží. Dále se ref dataset spustí třikrát. Jako konečný výsledek se použije průměrná hodnota tří výsledků ref testu. Aby se snížily výkyvy výkonu způsobené migrací CPU nebo přepínačem kontextu, procesy běžící na testovacím datovém souboru a datovém souboru ref jsou vázány na jádro CPU pomocí nástroje CPU affinity tool. Pro test doby kompilace používá tato metoda vlákno 1 k sestavení testovacího programu a porovnání testovacích položek, které byly kompilovány po dlouhou dobu. Doba kompilace nezahrnuje dobu provádění linkerů. Zahrnuje pouze čas, kdy jsou generovány všechny zdrojové soubory ve všech testovacích programech.

porovnání výkonu kompilace

proces kompilace GCC je následující: přečtěte si zdrojový soubor, předzpracujte zdrojový soubor, převeďte jej na IR, optimalizujte a vygenerujte soubor sestavy. Poté assembler vygeneruje objektový soubor. Clang a LLVM se nespoléhají na nezávislé kompilátory, ale integrují Samostatně implementované kompilátory v backendu. Proces generování sestav souborů je vynechán v procesu generování objektových souborů. Objektový soubor je generován přímo z IR. Kromě toho, ve srovnání s GCC IR, datová struktura LLVM IR je stručnější. Během kompilace zabírá méně paměti a podporuje rychlejší průchod. Proto jsou Clang a LLVM výhodné z hlediska doby kompilace, což dokazují údaje získané ze spec kompilace, jak je znázorněno na obrázku níže. Clang zkracuje dobu kompilace s jedním vláknem o 5% až 10% ve srovnání s GCC. Proto Clang nabízí více výhod pro výstavbu velkých projektů.

Porovnání SPEC čas kompilace

Srovnání Výkonu Výkon

Většina cloudové pracovní zátěže vyžaduje, aby aplikace může běžet v různých klastrů. Při vytváření těchto aplikací nezadávejte parametry související se strojem. Chcete-li se přizpůsobit rychlé iteraci způsobené změnami poptávky, musí být také laditelné pracovní zatížení mimo prostory. Proto kromě některých stabilních a běžných knihoven, které umožňují vysoké úrovně optimalizace kompilace, má samotná pracovní zátěž nízkou úroveň kompilace a optimalizace (O2 nebo nižší). Pro splnění tohoto požadavku, tento dokument porovnává výkon různých kompilátorů na úrovních optimalizace O2 a O3 pro programy rychlosti INT, jak je znázorněno na následujícím obrázku:

Výkon srovnání SPEC CPU2017 INT Rychlost

GCC má 1% na 4% výkonnostní výhodu nad Clang a LLVM pro většinu programů v O2 a O3 úrovně, a v průměru má přibližně 3% výkonnostní výhodu pro SPEC CPU2017 INT Rychlost. Z hlediska 600.perlbench a 602.gcc_s / O2, GCC má velkou výkonovou výhodu (více než 10%). Tyto dvě testovací položky nemají žádné vynikající hotspoty a mohou odrážet komplexní optimalizační efekt kompilátoru. Výsledky testů ukazují, že GCC je vždy výhodný při optimalizaci výkonu. Pro dva programy související s AI, včetně 631.deepsjeng_s a 641.leela_s, které jsou nově přidány do testu SPEC, Clang a LLVM zlepšují výkon o více než 3% ve srovnání s GCC. To také odráží rychlý pokrok LLVM z hlediska optimalizace. Pro 625. x264_s O2 optimalizace, LLVM zvyšuje výkon o 40%, protože hotspot případu v souladu s vectorized pravidla. Ale Clang a LLVM optimalizují vektory na úrovni O2, zatímco GCC optimalizuje vektory na úrovni O3. S výjimkou vektorizovaných programů GCC výrazně nezlepšuje výkon na úrovni O3 ve srovnání s výkonem na úrovni O2. Jinými slovy, programy nejsou citlivé na optimalizaci GCC O3. Naproti tomu Clang a LLVM výrazně zlepšují výkon některých programů (například 600. perlbench a 602. gcc_s) na úrovni O3.

HPC programy, jako je FP Speed, obvykle běží na špičkových serverech. Mají stabilní základní algoritmy, vysoké požadavky na vektorizaci a paralelismus související s výkonem a umožňují vysokou úroveň optimalizace (O3 nebo vyšší). Proto tento dokument porovnává výkon na úrovni optimalizace O3 + march = native (skylake-avx512), jak je uvedeno níže:

Výkon srovnání SPEC CPU2017 FP Rychlost

Pro dva FP programy, GCC také může zlepšit výkon tím, že o 3%. Clang a LLVM jsou konzervativní v optimalizaci smyčky, a proto nejsou výhodné ve výkonu. Nicméně, Polly sub-projektu Clang a LLVM poskytuje high-level smyčky a data lokalitě optimizer, která byla široce používány v oblasti strojového učení, vysoký výkon computing, a heterogenní computing optimalizace. Věřím, že Polly může výrazně zlepšit výkon programů, které obsahují smyčky hotspotů vyhovující pravidlům vektorizace a paralelismu. Budu také analyzovat výkon Polly v řadě benchmarků a pracovních zátěží.

Závěrečné Poznámky

Od srovnávací testy výše, můžeme vidět, že kovový zvuk nabízí více výhod pro výstavbu velkých projektů, zatímco GCC je vždy výhodné v optimalizaci výkonu. Bla závisí na konkrétní aplikaci.

kromě porovnání výkonu, bych se chtěl podělit o výhody a nevýhody GCC a Clang a LLVM:

Výhody GCC

  • GCC podporuje více tradiční jazyky než Clang a LLVM, jako je Ada, Fortran, a Jít.
  • GCC podporuje více méně populárních architektur a podporuje RISC-V dříve než Clang a LLVM.
  • GCC podporuje více jazykových rozšíření a více jazykových funkcí než Clang a LLVM. GCC je stále jedinou možností pro kompilaci jádra Linuxu. I když výzkum na kompilaci jádra pomocí Clang a LLVM je také hlášena v průmyslu, jádro nemůže být sestavena bez úpravy zdrojového kódu a sestavování parametrů.

výhody Clang a LLVM

  • nově vznikající jazyky používají rámce LLVM, jako jsou Swift, Rust, Julia a Ruby.
  • Clang a LLVM splňují standardy C A C ++ přísněji než GCC. GNU Inline a další problémy během upgradu GCC nedochází.
  • Clang také podporuje některá rozšíření, například atributy pro kontrolu zabezpečení podprocesu.
  • Zvonění poskytuje další užitečné nástroje, jako například scan-build a clang statický analyzátor pro statickou analýzu, clang-formát a clang-pro pořádek syntaktická analýza, stejně jako editor plug-in Clangd.
  • Zvonění poskytuje přesnější a přátelské diagnostické informace, a zdůrazňuje, chybová hlášení, chybové řádky, řádek chyba výzvy, opravy a návrhy. Clang považuje diagnostické informace za funkci. Diagnostické informace se začaly zlepšovat až od GCC 5.0 a v GCC 8 se staly dospělými.

(původní článek Ma Jun马骏)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *