Vydanie sady kompilátorov GCC 9

Po roku vývoja zverejnená vydanie bezplatnej sady kompilátorov GCC 9.1, prvé veľké vydanie v novej vetve GCC 9.x. V súlade s nová schéma čísla vydania, vo vývoji bola použitá verzia 9.0 a krátko pred vydaním GCC 9.1 sa už vetva GCC 10.0 rozvetvila, na základe ktorej by sa vytvorilo ďalšie významné vydanie GCC 10.1.

GCC 9.1 sa vyznačuje stabilizáciou podpory pre štandard C++17, pokračovaním implementácie schopností budúceho štandardu C++20 (kódové označenie C++2a), zahrnutím do frontendu pre jazyk D, čiastočnou podporou pre OpenMP 5.0 , takmer úplná podpora OpenACC 2.5, zvýšenie škálovateľnosti interprocedurálnych optimalizácií a optimalizácií v štádiu viazania, rozšírenie diagnostických nástrojov a pridanie nových upozornení, backendy pre OpenRISC, C-SKY V2 a AMD GCN GPU.

Hlavné zmeny:

  • Pridaná podpora pre programovací jazyk D. GCC obsahuje frontend s kompilátorom GDC (Gnu D Compiler) a runtime knižnice (libphobos), ktoré vám umožňujú použiť štandardný GCC na vytváranie programov v programovacom jazyku D. Proces povolenia podpory jazyka D v GCC začalo ešte v roku 2011, ale ťahal ďalej kvôli potrebe uviesť kód do súladu s požiadavkami GCC a problémom s prevodom práv duševného vlastníctva na spoločnosť Digital Mars, ktorá vyvíja programovací jazyk D;
  • Vylepšenia sa dočkali aj generátor kódu. Napríklad bolo implementované použitie rôznych stratégií na rozšírenie výrazov Switch (tabuľka skokov, bitový test, rozhodovací strom) v závislosti od situácií. Pridaná možnosť transformovať lineárne funkcie, ktoré zahŕňajú výraz Switch, pomocou optimalizácie „-ftree-switch-conversion“ (napríklad súbor podmienok ako „prípad 2: ako = 205; prerušenie; prípad 3: ako = 305; prerušenie ;“ sa prevedie na „100 * ako + 5“;
  • Vylepšené interprocedurálne optimalizácie. Nastavenia inline nasadenia boli prispôsobené pre moderné kódové základne C++ a rozšírené o nové parametre max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns a uninlined - čas na zamyslenie. Vylepšená presnosť a agresivita separácie studeného/horúceho kódu. Vylepšená škálovateľnosť pre veľmi veľké prekladové jednotky (napríklad pri aplikácii optimalizácie vo fáze spájania s veľkými programami);
  • Vylepšený bol optimalizačný mechanizmus založený na výsledkoch profilovania kódu (PGO - Profile-guided optimization), ktorý generuje optimálnejší kód na základe analýzy charakteristík vykonávania kódu. Možnosť súhrnu "-fprofile-use" teraz obsahuje optimalizačné režimy "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" a "-ftree-loop-distribution". Odstránilo sa zahrnutie histogramov s počítadlami do súborov, čím sa zmenšila veľkosť súborov s profilmi (histogramy sa teraz generujú za behu pri vykonávaní optimalizácií počas prepojenia);
  • Vylepšená optimalizácia doby prepojenia (LTO). Pred vygenerovaním výsledku bolo zabezpečené zjednodušenie typov, čo umožnilo výrazne znížiť veľkosť súborov objektov LTO, znížiť spotrebu pamäte v štádiu viazania a zlepšiť paralelizáciu operácií. Počet oddielov (-param lto-partitions) sa zvýšil z 32 na 128, čo zlepšuje výkon na systémoch s veľkým počtom vlákien CPU. Bol pridaný parameter na riadenie počtu procesov optimalizácie
    "-param lto-max-streaming-parallelism";

    Výsledkom je v porovnaní s GCC 8.3 optimalizácia zavedená v GCC 9 povolený skrátiť čas kompilácie Firefoxu 5 a LibreOffice 66 približne o 6.2.3 %. Veľkosť objektových súborov sa znížila o 7 %. Čas viazania na 8-jadrovom CPU sa znížil o 11 %. Fáza sekvenčnej optimalizácie fázy prepojenia je teraz o 28 % rýchlejšia a spotrebuje o 20 % menej pamäte. Spotreba pamäte každého procesora paralelného stupňa LTO klesla o 30%;

  • Väčšina špecifikácií paralelného programovania je implementovaná pre jazyky C, C++ a Fortran OpenACC 2.5, ktorý definuje nástroje pre operácie znižovania záťaže na GPU a špecializovaných procesoroch, ako je NVIDIA PTX;
  • Čiastočná podpora štandardu bola implementovaná pre C a C++ Otvorte MP 5.0 (Open Multi-Processing), ktorý definuje API a metódy aplikácie metód paralelného programovania pre jazyky C, C++ a Fortran na viacjadrových a hybridných (CPU+GPU/DSP) systémoch so zdieľanou pamäťou a vektorizačnými jednotkami (SIMD) ;
  • Pre jazyk C boli pridané nové upozornenia: "-Waddress-of-packed-member" (nezarovnaná hodnota ukazovateľa na zbalený člen štruktúry alebo únie) a
    «-Absolútna hodnota" (pri prístupe k funkciám na výpočet absolútnej hodnoty, ak existuje vhodnejšia funkcia pre zadaný argument, napríklad fabs(3.14) by sa mal použiť namiesto abs(3.14). Nové upozornenia pridané pre C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" a "-Wclass-conversion". Mnohé predtým dostupné varovania boli rozšírené;

  • Pridaná experimentálna podpora pre časť budúceho štandardu jazyka C s kódovým označením C2x. Ak chcete povoliť podporu C2x, použite voľby "-std=c2x" a "-std=gnu2x" (ak chcete povoliť rozšírenia GNU). Štandard je stále v ranom štádiu vývoja, preto z jeho možností je podporovaný iba výraz _Static_assert s jedným argumentom (_Static_assert s dvoma argumentmi je štandardizovaný v C11);
  • Podpora pre štandard C++17 bola vyhlásená za stabilnú. Vo frontende sú jazykové možnosti C++17 plne implementované a v libstdc++ sú knižničné funkcie definované v štandarde blízko plnej implementácii;
  • Pokračovanie uskutočnenie prvky budúceho štandardu C++2a. Napríklad bola pridaná možnosť zahrnúť rozsahy počas inicializácie, boli implementované rozšírenia pre lambda výrazy, bola pridaná podpora pre prázdne členy dátových štruktúr a pravdepodobné/nepravdepodobné atribúty, bola poskytnutá možnosť volať virtuálne funkcie v podmienených výrazoch. , atď.
    Ak chcete povoliť podporu C++2a, použite možnosti "-std=c++2a" a "-std=gnu++2a". Pridané bitové a verzie hlavičkových súborov do libstdc++ pre C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity traits, std::midpoint,p , std::bind_front,
    std::visit, std::is_constant_evaluated a std::assume_aligned, pridaná podpora pre typ char8_t, implementovaná možnosť kontroly predpony a prípony reťazcov (začína_s, končí_s);

  • Pridaná podpora pre nové procesory ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE a Neoverse N1. Pridaná podpora inštrukcií zavedených v Armv8.3-A na prácu s komplexnými číslami, generovanie pseudonáhodných čísel (rng) a označovanie pamäte (memtag), ako aj pokyny na blokovanie útokov súvisiacich so špekulatívnym vykonávaním a prevádzkou jednotky predikcie vetvy . Pre architektúru AArch64 bol pridaný ochranný režim priesečníky stohu a haldy („-fstack-clash-protection“). Na využitie funkcií architektúry Armv8.5-A bola pridaná možnosť „-march=armv8.5-a“.

  • Zahŕňa backend na generovanie kódu pre GPU AMD na základe mikroarchitektúry GCN. Implementácia je v súčasnosti obmedzená na kompiláciu jednovláknových aplikácií (podpora pre vykonávanie viacvláknových výpočtov cez OpenMP a OpenACC bude ponúknutá neskôr) a podporu pre GPU Fiji a Vega 10;
  • Pridaný nový backend pre procesory OpenRISC;
  • Pridaný backend pre procesory C-SKY V2, vyrábané čínskou spoločnosťou s rovnakým názvom pre rôzne spotrebiteľské zariadenia;
  • Všetky možnosti príkazového riadka, ktoré ovládajú hodnoty bajtov, podporujú prípony kb, KiB, MB, MiB, GB a GiB;
  • Implementovaná možnosť „-flive-patching=[inline-only-static|inline-clone]“ vám umožňuje dosiahnuť bezpečnú kompiláciu pre systémy live-patching vďaka viacúrovňovej kontrole používania interprocedurálnych (IPA) optimalizácie;
  • Pridaná možnosť „--completion“ pre jemnú kontrolu dokončenia možnosti pri použití bash;
  • Diagnostické nástroje poskytujú zobrazenie úryvkov zdrojového textu s uvedením čísla riadku a vizuálneho označenia súvisiacich informácií, ako sú typy operandov. Ak chcete vypnúť zobrazovanie čísiel a označení riadkov, sú k dispozícii možnosti „-fno-diagnostics-show-line-numbers“ a „-fno-diagnostics-show-labels“;

    Vydanie sady kompilátorov GCC 9

  • Rozšírené nástroje na diagnostiku chýb v kóde C++, zlepšenie čitateľnosti informácií o príčinách chýb a zvýrazňovanie problematických parametrov;

    Vydanie sady kompilátorov GCC 9

  • Pridaná možnosť „-fdiagnostics-format=json“, ktorá umožňuje generovanie diagnostického výstupu v strojovo čitateľnom formáte (JSON);
  • Pridané nové možnosti profilovania „-fprofile-filter-files“ a „-fprofile-exclude-files“ na výber zdrojových súborov na spracovanie;
  • AddressSanitizer poskytuje generovanie kompaktnejšieho overovacieho kódu pre automatické premenné, čo znižuje spotrebu pamäte kontrolovaného spustiteľného súboru;
  • Vylepšený výstup v "-fopt-info» (podrobné informácie o pridaných optimalizáciách). Pridané nové predpony „optimalizované“ a „zmeškané“ okrem predtým dostupnej predpony „poznámka“. Pridaný výstup informácií o rozhodovaní o inline-rozkladaní a vektorizácii cyklov;
  • Pridaná možnosť „-fsave-optimization-record“, keď je špecifikovaná, GCC uloží súbor SRCFILE.opt-record.json.gz s popisom rozhodnutí o použití určitých optimalizácií. Nová možnosť sa líši od režimu „-fopt-info“ zahrnutím ďalších metadát, ako sú informácie o profile a inline reťazcoch;
  • Pridané možnosti „-fipa-stack-alignment“ a „-fipa-reference-addressable“ na riadenie zarovnania zásobníka a použitie režimov adresovania (len zápis alebo presné čítanie) pre statické premenné počas interprocedurálnych optimalizácií;
  • Zavádzajú sa nové vstavané funkcie na riadenie viazania atribútov, ako aj správania súvisiace s predikciou vetvenia a vykonávaním špekulatívnych pokynov: "__builtin_has_attribute" '__builtin_expect_with_pravdepodobnosti"A"__builtin_speculation_safe_value". Pre funkcie, premenné a typy bol pridaný nový atribút kópie;
  • Pre jazyk Fortran bola implementovaná plná podpora asynchrónneho vstupu/výstupu;
  • Podpora pre platformy Solaris 10 (*-*-solaris2.10) a Cell/BE (Cell Broadband Engine SPU) bola zastaraná a bude odstránená v nasledujúcom hlavnom vydaní. Podpora pre architektúry Armv2, Armv3, Armv5 a Armv5E bola ukončená. Podpora pre Intel MPX (Memory Protection Extensions) bola ukončená.

Zdroj: opennet.ru

Pridať komentár