GCC 9 -kääntäjäpaketin julkaisu

Vuoden kehitystyön jälkeen julkaistu ilmaisen kääntäjien julkaisun GCC 9.1, ensimmäinen merkittävä julkaisu uudessa GCC 9.x -haarassa. Mukaisesti uusi järjestelmä julkaisunumerot, kehitysprosessissa käytettiin versiota 9.0 ja vähän ennen GCC 9.1:n julkaisua oli jo haarautunut GCC 10.0 -haara, jonka pohjalta muodostuisi seuraava merkittävä julkaisu, GCC 10.1.

GCC 9.1 on merkittävä C++17-standardin tuen vakauttaminen, tulevan C++20-standardin (koodinimeltään C++2a) ominaisuuksien toteuttamisen jatkaminen, D-kielen käyttöliittymän sisällyttäminen, OpenMP 5.0:n osittainen tuki. , lähes täydellinen tuki OpenACC 2.5:lle, lisää prosessien välisten optimointien ja optimointien skaalautuvuutta sitomisvaiheessa, diagnostiikkatyökalujen laajentamista ja uusien varoitusten lisäämistä, taustaohjelmia OpenRISC:lle, C-SKY V2:lle ja AMD GCN GPU:lle.

Pääasiallinen muutokset:

  • Lisätty tuki D-ohjelmointikielelle. GCC sisältää käyttöliittymän kääntäjällä GDC (Gnu D Compiler) ja ajonaikaiset kirjastot (libphobos), joiden avulla voit käyttää standardia GCC:tä ohjelmien rakentamiseen D-ohjelmointikielellä. Prosessi, jolla D-kielen tuki otetaan käyttöön GCC:ssä on alkanut vuonna 2011, mutta kesti johtuen tarpeesta saattaa koodi GCC:n vaatimusten mukaiseksi ja ongelmista immateriaalioikeuksien siirtämisessä Digital Marsille, joka kehittää D-ohjelmointikieltä;
  • Koodigeneraattoriin on tehty parannuksia. Esimerkiksi erilaisten strategioiden käyttö Switch-lausekkeiden (hyppytaulukko, bittitesti, päätöspuu) laajentamiseen tilanteista riippuen on toteutettu. Lisätty mahdollisuus muuttaa lineaarisia funktioita, jotka sisältävät Switch-lausekkeen käyttämällä optimointia "-ftree-switch-conversion" (esimerkiksi joukko ehtoja, kuten "tapaus 2: miten = 205; tauko; tapaus 3: miten = 305; break" ;” muunnetaan muotoon "100 * kuinka + 5";
  • Parannetut prosessien väliset optimoinnit. Inline-käyttöönoton asetukset on mukautettu nykyaikaisiin C++-koodikantoihin ja laajennettu uusilla parametreilla max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns ja uninlined -hukka-aika. Parempi kylmä/kuuma koodin erottelun tarkkuus ja aggressiivisuus. Parannettu skaalautuvuus erittäin suurille käännösyksiköt (esimerkiksi käytettäessä optimointia suurten ohjelmien linkitysvaiheessa);
  • Koodiprofiloinnin tuloksiin perustuvaa optimointimekanismia (PGO - Profile-guided optimization) on parannettu, mikä tuottaa optimaalisemman koodin koodin suorituksen ominaisuuksien analyysin perusteella. Yhteenvetovaihtoehto "-fprofiilin käyttö" sisältää nyt optimointitilat "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" ja "-ftree-loop-distribution". Poistettiin laskureilla varustettujen histogrammien sisällyttäminen tiedostoihin, mikä pienensi profiileilla varustettujen tiedostojen kokoa (histogrammit luodaan nyt lennossa, kun optimointi suoritetaan linkityksen aikana);
  • Enhanced Linking Time Optimizations (LTO). Tyyppejä yksinkertaistettiin ennen tuloksen luomista, mikä mahdollisti merkittävästi LTO-objektitiedostojen koon pienentämisen, muistin kulutuksen vähentämisen sidontavaiheessa ja toimintojen rinnakkaistamisen parantamisen. Osioiden (-param lto-partitions) määrä on nostettu 32:sta 128:aan, mikä parantaa suorituskykyä järjestelmissä, joissa on suuri määrä CPU-säikeitä. Parametri on lisätty ohjaamaan optimointiprosessien määrää
    "-param lto-max-streaming-parallelism";

    Tämän seurauksena GCC 8.3:een verrattuna GCC 9:ssä käyttöönotetut optimoinnit sallittu vähentää Firefox 5:n ja LibreOffice 66:n käännösaikaa noin 6.2.3 %. Objektitiedostojen koko pieneni 7 %. Sitoutumisaika 8-ytimisessä CPU:ssa väheni 11 %. Linkitysvaiheen peräkkäinen optimointivaihe on nyt 28 % nopeampi ja kuluttaa 20 % vähemmän muistia. LTO:n rinnakkaisvaiheen kunkin prosessorin muistin kulutus laski 30 %;

  • Suurin osa rinnakkaisohjelmointimäärityksistä on toteutettu C-, C++- ja Fortran-kielille OpenACC 2.5, joka määrittelee työkalut toimintojen purkamiseen GPU:illa ja erikoisprosessoreilla, kuten NVIDIA PTX;
  • C- ja C++-standardin osittainen tuki on toteutettu Avaa MP 5.0 (Open Multi-Processing), joka määrittelee API:n ja menetelmät rinnakkaisten ohjelmointimenetelmien soveltamiseen C-, C++- ja Fortran-kielille moniytimisissä ja hybridijärjestelmissä (CPU+GPU/DSP), joissa on jaettu muisti ja vektorointiyksiköt (SIMD) ;
  • Uusia varoituksia on lisätty C-kielelle: "-Waddress-of-pakattu-jäsen" (kohdistamaton osoittimen arvo rakenteen tai liitoksen pakattuun jäseneen) ja
    «-Absoluuttinen arvo" (käytettäessä funktioita absoluuttisen arvon laskemiseksi, jos määritetylle argumentille on sopivampi funktio, esimerkiksi fabs(3.14) tulee käyttää abs(3.14) sijaan. Uusia varoituksia lisätty C++:aan: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" ja "-Wclass-conversion". Monia aiemmin saatavilla olevia varoituksia on laajennettu;

  • Lisätty kokeellinen tuki osalle tulevasta C-kielistandardista, koodinimeltään C2x. Ota C2x-tuki käyttöön käyttämällä vaihtoehtoja "-std=c2x" ja "-std=gnu2x" (ottaaksesi käyttöön GNU-laajennukset). Standardi on vielä varhaisessa kehitysvaiheessa, joten sen ominaisuuksista tuetaan vain lauseketta _Static_assert yhdellä argumentilla (_Static_assert kahdella argumentilla on standardoitu C11:ssä);
  • C++17-standardin tuki on julistettu vakaaksi. Käyttöliittymässä C++17:n kieliominaisuudet on täysin toteutettu, ja libstdc++:ssa standardissa määritellyt kirjastotoiminnot ovat lähes täyttä toteutusta;
  • Jatkui toteutus tulevan C++2a-standardin elementtejä. Esimerkiksi on lisätty mahdollisuus sisällyttää alueita alustuksen aikana, laajennuksia lambda-lausekkeille on otettu käyttöön, tuki tietorakenteiden tyhjille jäsenille ja todennäköisille/epätodennäköisille attribuuteille on lisätty, mahdollisuus kutsua virtuaalisia toimintoja ehdollisissa lausekkeissa. , jne.
    Ota C++2a-tuki käyttöön käyttämällä vaihtoehtoja "-std=c++2a" ja "-std=gnu++2a". Lisätty bitti- ja versiootsikkotiedostot libstdc++:aan C++2a:lle, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity ominaisuudet, stdstd::midpoint, stdstd::midpoint. , std::bind_front,
    std::visit, std::is_constant_evaluated ja std::assume_aligned, lisätty tuki char8_t-tyypille, otettu käyttöön mahdollisuus tarkistaa merkkijonojen etuliite ja pääte (alkaa_kanssa, päättyy_with);

  • Lisätty tuki uusille ARM-prosessoreille
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE ja Neoverse N1. Lisätty tuki Armv8.3-A:ssa käyttöönotetuille ohjeille, jotka on tarkoitettu työskentelyyn kompleksilukujen, näennäissatunnaisten lukujen luomisen (rng) ja muistin merkitsemisen (memtag) kanssa, sekä ohjeet haarojen ennustusyksikön spekulatiiviseen suorittamiseen ja toimintaan liittyvien hyökkäysten estämiseen. . AArch64-arkkitehtuurille on lisätty suojaustila pinon ja kasan leikkauspisteet ("-fstack-clash-protection"). Armv8.5-A-arkkitehtuurin ominaisuuksien käyttämiseksi on lisätty vaihtoehto "-march=armv8.5-a".

  • Se sisältää taustajärjestelmän koodin luomiseksi AMD GPU:ille GCN-mikroarkkitehtuuriin perustuen. Toteutus rajoittuu tällä hetkellä yksisäikeisten sovellusten kokoamiseen (tukea monisäikeisten laskelmien suorittamiseen OpenMP:n ja OpenACC:n kautta tarjotaan myöhemmin) sekä GPU Fiji- ja Vega 10 -tukeen;
  • Lisätty uusi taustaohjelma prosessoreille OpenRISC;
  • Lisätty taustaohjelma prosessoreille C-SKY V2, jonka on valmistanut samanniminen kiinalainen yritys erilaisille kuluttajalaitteille;
  • Kaikki tavuarvoja käyttävät komentorivivalinnat tukevat päätteitä kb, KiB, MB, MiB, GB ja GiB;
  • Toteutettu "-flive-patching=[inline-only-static|inline-clone]" mahdollistaa turvallisen käännöksen live-patching-järjestelmille, koska monitasoinen ohjaus prosessienvälisten (IPA) optimoinnit;
  • Lisätty "--completion" -vaihtoehto vaihtoehdon viimeistelyn hienorakeiseen hallintaan bashia käytettäessä;
  • Diagnostiikkatyökalut tarjoavat näyttöjä lähdetekstiotteista, jotka osoittavat rivin numeron ja merkitsevät visuaalisesti siihen liittyvät tiedot, kuten operandityypit. Voit poistaa rivinumeroiden ja nimikkeiden näyttämisen käytöstä vaihtoehdoilla "-fno-diagnostics-show-line-numbers" ja "-fno-diagnostics-show-labels".

    GCC 9 -kääntäjäpaketin julkaisu

  • Laajennettu työkalut C++-koodin virheiden diagnosointiin, virheiden syitä koskevien tietojen parempi luettavuus ja ongelmallisten parametrien korostaminen;

    GCC 9 -kääntäjäpaketin julkaisu

  • Lisätty vaihtoehto “-fdiagnostics-format=json”, joka mahdollistaa diagnostisen tulosteen luomisen koneellisesti luettavassa muodossa (JSON);
  • Lisätty uusia profilointivaihtoehtoja "-fprofile-filter-files" ja "-fprofile-exclude-files" prosessoitavien lähdetiedostojen valitsemiseksi;
  • AddressSanitizer tuottaa kompaktimman vahvistuskoodin automaattisille muuttujille, mikä vähentää tarkistettavan suoritettavan tiedoston muistin kulutusta.
  • Parannettu tulos "-fopt-info» (yksityiskohtaiset tiedot lisätyistä optimoinneista). Lisätty uudet etuliitteet "optimoitu" ja "jätetty" aiemmin saatavilla olevan etuliite "huomautus" lisäksi. Lisätty tiedonanto päätöksenteosta syklien inline-avoinnilla ja vektorisoinnilla;
  • Lisätty "-fsave-optimization-record" vaihtoehto, kun se on määritetty, GCC tallentaa SRCFILE.opt-record.json.gz-tiedoston kuvauksella tiettyjen optimointien käyttöä koskevista päätöksistä. Uusi vaihtoehto eroaa "-fopt-info" -tilasta lisäämällä metatietoja, kuten tietoja profiilista ja sisäisistä ketjuista;
  • Lisätty vaihtoehdot "-fipa-stack-alignment" ja "-fipa-reference-addressable" pinon kohdistuksen ja osoitemoodien (vain kirjoitus tai luku-tarkka) käytön ohjaamiseksi staattisille muuttujille proseduurien välisten optimointien aikana;
  • Uusia sisäänrakennettuja toimintoja on otettu käyttöön attribuuttien sitomisen sekä haaran ennustamiseen ja spekulatiivisten käskyjen suorittamiseen liittyvän käyttäytymisen hallitsemiseksi: "__builtin_has_attribute""__builtin_expect_with_probability"ja"__builtin_speculation_safe_value". Uusi attribuutti on lisätty funktioille, muuttujille ja tyypeille kopio;
  • Täysi tuki asynkroniselle syötölle/tulostukselle on otettu käyttöön Fortran-kielellä;
  • Tuki Solaris 10 (*-*-solaris2.10) ja Cell/BE (Cell Broadband Engine SPU) -alustoille on vanhentunut, ja se poistetaan seuraavassa suuressa julkaisussa. Armv2-, Armv3-, Armv5- ja Armv5E-arkkitehtuurien tuki on lopetettu. Intel MPX (Memory Protection Extensions) -tuki on lopetettu.

Lähde: opennet.ru

Lisää kommentti