Hledat
Přihlásit se
  • Věda a technika
  • Herní doupě
  • Tipy pro PC
  • IT Byznys
  • Mobily
  • Počítače
  • Počítače
  • Témata
  • Poradna
  • Diskuzní fórum
  • Video
  • Bazar
  • Blogy
  • MĚŘENÍ RYCHLOSTI
  • RSS
  • Facebook Twitter Google+ YouTube
  • Hardware
  • Software
  • Počítače
  • Notebooky
  • Služby na webu
  • Apple
  • Google
  • Microsoft
  • Seznam
  • Tiskové zprávy
Další témata
  • Týden Živě
  • Zprávy Živě
  • Testy
  • Pitvy
Všechna videa
X

Doporučit článek

Vaše jméno:

Váš e-mail:

E-mail adresáta:

Komentář:

kontrolní kód

Odeslat

Blogy Živě » Linux zblízka

Linux zblízka

 

Test: optimalizace v GCC a LLVM

16. 8. 2010, uzivatel2

V dnešním testu srovnám klasický starý dobrý překladač GCC s překladačem LLVM. Test se bude týkat míry optimalizace celočíselných aritmetických výpočtů. Představení obou produktů :

GCC : Balík GNU Compiler Collection (GCC) je součástí projektu GNU. Překladač GCC se stal ve světě svobodného softwaru de facto standardem. Rovněž se těší značné popularitě i na nesvobodných platformách; např. ve Windows prostředí Dev-C++, portování svobodného softwaru s pomocí CygWin…, na Mac OS např. vývojové prostředí XCode…

Vývoj GCC započal v roce 1985. Návrh kvalitního kompilátoru patří mezi vůbec nejkomplikovanější praktické výzvy. Například vlastní kompilace v GCC probíhá velmi zjednodušeně tímto způsobem:

  • Zdrojový kód se převede na abstract syntax tree (AST).
  • Dále se převede do na programovacím jazyku již nezávislé formy GENERIC a GIMPLE.
  • GIMPLE se rozbije na tvar static single assignment (SSA).
  • Nyní se v několika rundách aplikuje série optimalizačních algoritmů. (Samozřejmě drobné optimalizace probíhají i v ostatních krocích.)
  • Z elementárního SSA je kód znova složen do kódu v jazyce Register Transfer Language (RTL).
  • Zdrojový kód v jazyce RTL je zkompilován do assembleru (resp. strojového kódu) cílové architektury.

Postupem času se GCC výrazně zlepšoval. V kvalitě generovaného kódu se GCC dnes přinejmenším vyrovná komerčním kompilátorům jako Intel C++ Compiler. V čem GCC předbíhá konkurenci je podpora různých procesorových architektur a to včetně různých pokročilých možností jednotlivých platforem (např. vektorizace za použití sady instrukcí/registrů typu SIMD). Podle Wikipedie GCC podporuje nejméně 53 cílových procesorových architektur, pro dalších 16 existují rozšíření a navíc GCC podporuje i některé architektury virtuálních strojů (např. Java bytecode). Pochopitelně mnohé z těchto architektur již vyhynuly; obecně však lze říci, že GCC podporuje všechny důležité mikroprocesory. To kontrastuje např. s konkurenčním Intel C++ Compiler. Návrh algoritmů GCC umožňuje mimo jiné kvalitní optimalizaci pro jakoukoli podporovanou architekturu.

(Poznámka : Pochopitelně pro různé architektury dokonalá optimalizace vede k různým algoritmům. Např. architektury s vysokým počtem základních aritmetických registrů (např. Itanium nabízí 128 registrů) mohou na rozdíl od architektur s nízkým počtem registrů (např. x86) vyhodnocovat delší výrazy, aniž by museli vícenásobně číst tutéž hodnotu z paměti. Proto u architektur s nízkým počtem registrů bude optimalizace směřovat k snižování Horton–Strahlerova čísla u vyhodnocovaných výrazů.)

LLVM : V roce 2005 byla vydána první verze kompilačního příslušenství Low Level Virtual Machine (LLVM). Tvůrce University of Illinois uvolnil LLVM pod licencí ve stylu BSD. Tvůrci systémů z rodiny *BSD koketují s možností využívat LLVM. Připomenu, že takovéto licence podporují tvorbu odvozeného proprietárního softwaru; proto se o LLVM zajímají i tvůrci nesvobodného softwaru (např. Apple). Vedle originálního frontendu Clang existuje i frontend GCC-LLVM, který jsem použil při testu. Na rozdíl od GCC je dnes tržní podíl LLVM zanedbatelný a LLVM je využívám téměř výhradně nekomerčním způsobem.

Návrh datových struktur využívaných v LLVM je méně sofistikovaný než v případě GCC. Jako výhoda LLVM je pak uváděna výrazně vyšší rychlost kompilace a nižší paměťová náročnost. Někteří příznivci LLVM tvrdí, že generovaný kód je oproti GCC více optimalizovaný.

Způsob provedení testu

Test jsem provedl v podstatě stejným způsobem jako v příspěvku Optimalizace v GCC. Jednoúčelovým programem v Javě jsem vygeneroval množství náhodného zdrojového kódu v jazyce C v rozsahu několika desítek tisíc řádků, který jsem vložil do kostry programu. (Způsob generování kódu téměř vylučuje aritmetické chyby jako dělení nulou nebo přetečení proměnných.) Nad rozsah dřívějšího příspěvku jsem vytvořil druhou odvozenou verzi, která generuje zdrojový kód, který na cílové architektuře x86 půjde jen stěží optimalizovat. Tento kód budu označovat jako “neoptimalizovatelný” v kontrastu s prvním “optimalizovatelným” kódem.

Jak jsem slíbil založil jsem si svou pracovní prezentaci a na ní vytvořil sekci pro různé přílohy k tomuto blogu. Konkrétně přílohu k tomuto článku naleznete zde. (Pozor, stránky jsou stále ve výstavbě.)

Při sestavování skutečných aplikací by byl vliv optimalizace při kompilace menší, protože například spouští i kód (sdílené knihovny, jádro), který není vytvořen při kompilaci aplikace. Testy vlivu volby kompilátoru na výkon aplikací najdete např. na serveru Phoronix.

Výsledky měření

Přesné velikosti změřených hodnot najdete v protokolu z měření dostupného na zmíněné  stránce. S pomocí přílohy si můžete test také zkusit s různými parametry.

Závěr

V případě kompilací bez optimalizace (přepínač -O0) bylo LLVM více jak šestkrát rychlejší než GCC a i vygenerovaný kód byl lepší. Při kompilací s nejnižší úrovní optimalizace výrazně dominuje LLVM. Při vyšších úrovních optimalizací však vede GCC. Na nejvyšší úrovni optimalizace (bez použití profileru) vede GCC v rychlosti kompilace i v rychlosti generovaného kódu.

Při produkčním nasazení jde především o kvalitu přeloženého programu. Výnosy ze zrychlení běhu aplikace jsou nesrovnatelně větší než náklady na delší kompilaci. Takže za celkového vítěze považuji GCC.

Štítky: profesionální aplikace, Testy


Publikováno v rubrice Nezařazené. Reakce v diskuzi lze sledovat prostřednictvím RSS 2.0. Odkazování není povoleno.

« Může virus napadat zdrojové kódy?
Komerce a svobodný software »
 

Komentáře v diskuzi

1.  uzivatel2(ověřeno)   16. 8. 2010, 09:20

Předmětem komentářů by měl být obsah článku. Zdrojáky v příloze tohoto článku jsou odfláknuté, protože cílem bylo jen jednoduše otestovat dva kompilátory. Pokud nejdete ve zdrojácích bug (dost pravděpodobné) napište sem příspěvek.

V budoucnu možná tyto zdrojáky využiji k napsání dalšího příspěvku do tohoto blogu. Plánuji srovnat různé běhové platformy vycházející ze syntaxe jazyka C(např. kompilovaný C kód, javascript ve Firefoxu, PHP…). Pokud by jste chtěli tento článek napsat, rád Vám dostatečně kvalitní post zveřejním pod Vašim jménem na tomto blogu. (Kontakt na mě najdete na pracovních stránkách.)

2.  tucin(195.146.106.xxx)   17. 8. 2010, 10:32

Clanek je velice zajimavy ovsem trochu mi chybelo porovnani prave s Intel Compilerem. Neni prave on povazovan za producenta nejoptimalnejsiho kodu?

3.  uzivatel2(ověřeno)   17. 8. 2010, 13:24

re tucin : Předně bych poznamenal, že nevlastním licenci k Intel Compileru a nemám s ním zkušenosti. Jedná se kompilátor výrobce procesorů společnosti Intel, podobně jako AMD nabízí kompilátor Open64. Očekával bych u Intel Compileru především lepší práci s specialitami jako využívání “multimediálních” instrukcí/procesorů (např. SSE). Tyto přednosti by se v testu neprojevily, proto jsem kompiloval proti základní instrukční sadě x86. V testu jsem samozřejmě mohl přepínači zacílit na konkrétní použitý stroj (seznam přepínačů viz http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html ); toto téma mě však nezajímalo.

4.  JSH(89.102.36.xxx)   20. 8. 2010, 21:36

Nejsem si úplně jistý, ale přepínač O2 by měl možná větší vypovídací hodnotu. O3 podle dokumentace používá i optimalizace, u kterých není jisté, jestli budou prospěšné, nebo ne.

5.  uzivatel2(ověřeno)   21. 8. 2010, 14:29

re JSH : Podle mojich zkušeností je v praxi O3 rychlejší než O2. Můj dřívější test http://linuxzblizka.blog.zive.cz/2010/05/optimalizace-v-gcc/ prováděný pro obdobný kód ukázal, že O3 je přibližně o 10% rychlejší než O2.

Přidat komentář

*
Opište prosím text z obrázku.
Anti-Spam Image


Aktuální články a bleskovky

Apple iTV: Není důvod se těšit
Apple iTV: Není důvod se těšit
Naprogramujte si vlastního robota nebo MP3 přehrávač
Naprogramujte si vlastního robota nebo MP3 přehrávač
Ad ACTA: rozhodne až zákon
Ad ACTA: rozhodne až zákon
Týden Živě 162: Když nateče do počítače voda
Týden Živě 162: Když nateče do počítače voda



Linux zblízka využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články a komentáře


  • Seznam odkazů

    • Kontakt na autora blogu
    • Moje články pro LE
    • Různé přílohy k blogu
    • Stránky autora blogu
  • Poslední příspěvky

    • Kontroverze okolo Křišťálové lupy
    • Deset největších open source inovací
    • Nová “daň” za software
    • Má smysl kupovat TV tuner?
    • Zvýšila se v Linuxu spotřeba?
    • Porušování GPL licence ve světě Androidu
    • Je bezplatnost Linuxu výhodou?
    • Potřebujeme nová uživatelská rozhraní?
    • Podvod s hlasováním v přímém přenosu
    • Facebook není zadarmo
    • Nápad na startup
    • Co hrají linuxáci?
    • Nová cloudová platforma OpenShift
    • Kvalitní linuxové antiviry pro desktop ve skutečnosti neexistují
    • Lze věřit anketám na internetu?
  • Administrace

    • Přihlásit se

1202_infobox.png

Časopis Computer

  • Zrychlete Windows
  • Test 25 notebookových brašen
  • Ultrabook Toshiba Portégé 
  • Pitva Blu-ray mechaniky
  • Radíme s koupí Wi-Fi routeru

Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN


Video Živě

Týden Živě 162. - 5. února 2012
Zprávy Živě - 4. února 2012
Ultrabook Toshiba Portege Z830
3D Blu-ray rekordér LG BDS590

další videa »






Mladá Fronta a.s. Mladá Fronta a.s.
Tiráž | Autoři | Připomínky | Odběr novinek | RSS | Textová verze
Copyright 2000–2012 Mladá fronta a.s. | Inzerce: onlinesales@mf.cz | Kontakt na redakci | Návštěvnost měří NetMonitor