Izdanje paketa prevoditelja GCC 9

Nakon godinu dana razvoja objavljen izdavanje besplatnog skupa prevoditelja GCC 9.1, prvo veće izdanje u novoj grani GCC 9.x. U skladu s nova shema brojevima izdanja, u procesu razvoja korištena je verzija 9.0, a neposredno prije izlaska GCC 9.1 već se razgranala grana GCC 10.0 na temelju koje će nastati sljedeće značajno izdanje, GCC 10.1.

GCC 9.1 poznat je po stabilizaciji podrške za standard C++17, nastavku implementacije mogućnosti budućeg standarda C++20 (kodnog naziva C++2a), uključivanju u sučelje za jezik D, djelomičnoj podršci za OpenMP 5.0 , gotovo potpuna podrška za OpenACC 2.5, povećanje skalabilnosti interproceduralnih optimizacija i optimizacija u fazi povezivanja, proširenje dijagnostičkih alata i dodavanje novih upozorenja, pozadina za OpenRISC, C-SKY V2 i AMD GCN GPU.

Glavni promjena:

  • Dodana podrška za programski jezik D. GCC uključuje sučelje s kompajlerom GDC (Gnu D Compiler) i runtime biblioteka (libphobos), koje vam omogućuju korištenje standardnog GCC-a za izradu programa u programskom jeziku D. Proces omogućavanja podrške za jezik D u GCC-u počelo je još 2011., ali vukao se zbog potrebe usklađivanja koda sa zahtjevima GCC-a i problema s prijenosom prava intelektualnog vlasništva na Digital Mars koji razvija programski jezik D;
  • Generator koda je poboljšan. Na primjer, implementirana je upotreba različitih strategija za proširenje Switch izraza (tablica skokova, test bitova, stablo odlučivanja) ovisno o situacijama. Dodana je mogućnost transformacije linearnih funkcija koje uključuju izraz Switch pomoću optimizacije "-ftree-switch-conversion" (na primjer, skup uvjeta poput "slučaj 2: kako = 205; prekid; slučaj 3: kako = 305; prekid ;” će se pretvoriti u "100 * kako + 5";
  • Poboljšane interproceduralne optimizacije. Inline postavke implementacije prilagođene su modernim C++ kodnim bazama i proširene novim parametrima max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns i uninlined -vrijeme za razmišljanje. Poboljšana točnost i agresivnost odvajanja hladnog/vrućeg koda. Poboljšana skalabilnost za vrlo velike prevoditeljske jedinice (na primjer, kada se primjenjuje optimizacija u fazi povezivanja s velikim programima);
  • Unaprijeđen je mehanizam optimizacije temeljen na rezultatima profiliranja koda (PGO - Profile-guided optimization) koji generira optimalniji kod na temelju analize karakteristika izvođenja koda. Opcija sažetka "-fprofile-upotreba" sada uključuje načine optimizacije "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" i "-ftree-loop-distribution". Uklonjeno uključivanje histograma s brojačima u datoteke, što je smanjilo veličinu datoteka s profilima (histogrami se sada generiraju u hodu prilikom izvođenja optimizacija tijekom povezivanja);
  • Poboljšana optimizacija vremena povezivanja (LTO). Prije generiranja rezultata osigurano je pojednostavljenje tipova, što je omogućilo značajno smanjenje veličine LTO objektnih datoteka, smanjenje potrošnje memorije u fazi povezivanja i poboljšanje paralelizacije operacija. Broj particija (-param lto-partitions) povećan je s 32 na 128, što poboljšava performanse na sustavima s velikim brojem CPU niti. Dodan je parametar za kontrolu broja procesa optimizacije
    "-param lto-max-streaming-parallelism";

    Kao rezultat toga, u usporedbi s GCC 8.3, optimizacije uvedene u GCC 9 dozvoljeno smanjiti vrijeme kompilacije Firefoxa 5 i LibreOfficea 66 za oko 6.2.3%. Veličina objektnih datoteka smanjila se za 7%. Vrijeme povezivanja na 8-jezgrenom CPU-u smanjeno je za 11%. Faza sekvencijalne optimizacije faze povezivanja sada je 28% brža i troši 20% manje memorije. Potrošnja memorije svakog procesora paraleliziranog stupnja LTO-a smanjena je za 30%;

  • Većina specifikacija paralelnog programiranja implementirana je za jezike C, C++ i Fortran OpenACC 2.5, koji definira alate za operacije rasterećenja na GPU-ovima i specijaliziranim procesorima kao što je NVIDIA PTX;
  • Djelomična podrška za standard implementirana je za C i C++ Otvorite MP 5.0 (Open Multi-Processing), koji definira API i metode primjene metoda paralelnog programiranja za jezike C, C++ i Fortran na višejezgrenim i hibridnim (CPU+GPU/DSP) sustavima s dijeljenom memorijom i vektorizacijskim jedinicama (SIMD) ;
  • Dodana su nova upozorenja za jezik C: "-Adresa-upakiranog-člana" (vrijednost neusklađenog pokazivača na upakirani član strukture ili unije) i
    «-Wapsolutna vrijednost" (pri pristupanju funkcijama za izračunavanje apsolutne vrijednosti, ako postoji prikladnija funkcija za navedeni argument, na primjer, treba koristiti fabs(3.14) umjesto abs(3.14). Nova upozorenja dodana za C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" i "-Wclass-conversion". Mnoga prethodno dostupna upozorenja su proširena;

  • Dodana je eksperimentalna podrška za dio budućeg standarda jezika C, kodnog naziva C2x. Da biste omogućili podršku za C2x, koristite opcije "-std=c2x" i "-std=gnu2x" (za omogućavanje GNU proširenja). Standard je još uvijek u ranoj fazi razvoja, stoga je od njegovih mogućnosti podržan samo izraz _Static_assert s jednim argumentom (_Static_assert s dva argumenta standardiziran je u C11);
  • Podrška za standard C++17 proglašena je stabilnom. U sučelju su jezične mogućnosti C++17 u potpunosti implementirane, au libstdc++, funkcije knjižnice definirane u standardu blizu su pune implementacije;
  • Nastavak izvršenje elementi budućeg C++2a standarda. Na primjer, dodana je mogućnost uključivanja raspona tijekom inicijalizacije, implementirana su proširenja za lambda izraze, dodana je podrška za prazne članove struktura podataka i vjerojatne/nevjerojatne atribute, omogućena je mogućnost poziva virtualnih funkcija u uvjetnim izrazima itd.
    Da biste omogućili podršku za C++2a, koristite opcije "-std=c++2a" i "-std=gnu++2a". Dodane datoteke zaglavlja bitova i verzija u libstdc++ za C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity karakteristike, std::midpoint, std::lerp funkcije , std::bind_front,
    std::visit, std::is_constant_evaluated i std::assume_aligned, dodana podrška za tip char8_t, implementirana mogućnost provjere prefiksa i sufiksa nizova (starts_with, ends_with);

  • Dodana podrška za nove ARM procesore
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE i Neoverse N1. Dodana podrška za upute uvedene u Armv8.3-A za rad sa složenim brojevima, generiranje pseudo-slučajnih brojeva (rng) i memorijsko označavanje (memtag), kao i upute za blokiranje napada povezanih sa spekulativnim izvršenjem i radom jedinice za predviđanje grananja . Za arhitekturu AArch64 dodan je način zaštite sjecišta hrpe i hrpe (“-fstack-clash-protection”). Za korištenje značajki Armv8.5-A arhitekture, dodana je opcija “-march=armv8.5-a”

  • Uključuje pozadinu za generiranje koda za AMD GPU-ove temeljene na GCN mikroarhitekturi. Implementacija je trenutačno ograničena na kompilaciju jednonitnih aplikacija (podrška za izvođenje višenitnih izračuna putem OpenMP-a i OpenACC-a bit će ponuđena kasnije) i podršku za GPU Fiji i Vega 10;
  • Dodan novi backend za procesore OpenRISC;
  • Dodana pozadina za procesore C-SKY V2, koju proizvodi istoimena kineska tvrtka za razne potrošačke uređaje;
  • Sve opcije naredbenog retka koje upravljaju vrijednostima bajtova podržavaju sufikse kb, KiB, MB, MiB, GB i GiB;
  • Provedeno opcija “-flive-patching=[inline-only-static|inline-clone]” omogućuje vam postizanje sigurne kompilacije za sustave za krpanje uživo zahvaljujući kontroli na više razina nad upotrebom interproceduralnih (IPA) optimizacije;
  • Dodana je opcija "--completion" za finu kontrolu dovršetka opcije kada se koristi bash;
  • Dijagnostički alati pružaju prikaze izvadaka izvornog teksta koji označavaju broj retka i vizualno označavaju povezane informacije, kao što su vrste operanda. Da biste onemogućili prikaz brojeva redaka i oznaka, dostupne su opcije “-fno-diagnostics-show-line-numbers” i “-fno-diagnostics-show-labels”;

    Izdanje paketa prevoditelja GCC 9

  • Prošireno alati za dijagnosticiranje pogrešaka u C++ kodu, poboljšana čitljivost informacija o uzrocima pogrešaka i isticanje problematičnih parametara;

    Izdanje paketa prevoditelja GCC 9

  • Dodana opcija “-fdiagnostics-format=json”, koja omogućuje generiranje dijagnostičkog izlaza u strojno čitljivom formatu (JSON);
  • Dodane su nove opcije profiliranja “-fprofile-filter-files” i “-fprofile-exclude-files” za odabir izvornih datoteka za obradu;
  • AddressSanitizer omogućuje generiranje kompaktnijeg verifikacijskog koda za automatske varijable, što smanjuje potrošnju memorije izvršne datoteke koja se provjerava;
  • Poboljšan izlaz u "-fopt-info» (detaljne informacije o dodanim optimizacijama). Dodani su novi prefiksi "optimizirano" i "propušteno", uz prethodno dostupan prefiks "napomena". Dodan izlaz informacija o donošenju odluka o inline-odmotavanju i vektorizaciji ciklusa;
  • Dodana je opcija “-fsave-optimization-record”, kada je navedena, GCC sprema datoteku SRCFILE.opt-record.json.gz s opisom odluka o korištenju određenih optimizacija. Nova se opcija razlikuje od načina rada “-fopt-info” uključivanjem dodatnih metapodataka, kao što su informacije o profilu i inline lancima;
  • Dodane opcije “-fipa-stack-alignment” i “-fipa-reference-addressable” za kontrolu poravnanja stoga i korištenje načina adresiranja (samo pisanje ili točno čitanje) za statičke varijable tijekom interproceduralnih optimizacija;
  • Uvedene su nove ugrađene funkcije za kontrolu vezanja atributa, kao i ponašanja vezanog uz predviđanje grananja i spekulativno izvršavanje instrukcija: "__ugrađen_ima_atribut„”__ugrađeno_očekivati_s_vjerojatnošću"I"__ugrađena_sigurna_vrijednost_nagađanja". Dodan je novi atribut za funkcije, varijable i tipove kopija;
  • Potpuna podrška za asinkroni ulaz/izlaz implementirana je za jezik Fortran;
  • Podrška za platforme Solaris 10 (*-*-solaris2.10) i Cell/BE (Cell Broadband Engine SPU) je zastarjela i bit će uklonjena u sljedećem velikom izdanju. Podrška za Armv2, Armv3, Armv5 i Armv5E arhitekture je ukinuta. Podrška za Intel MPX (Memory Protection Extensions) je ukinuta.

Izvor: opennet.ru

Dodajte komentar