GCC 9 kompiliatoriaus rinkinio išleidimas

Po metų plėtros paskelbti nemokamo kompiliatorių rinkinio išleidimas GCC 9.1, pirmasis didelis leidimas naujoje GCC 9.x šakoje. Pagal nauja schema laidų numerius, kūrimo procese buvo naudojama 9.0 versija, o prieš pat GCC 9.1 išleidimą jau buvo atsišakojusi GCC 10.0 šaka, kurios pagrindu būtų formuojama kita reikšminga laida – GCC 10.1.

GCC 9.1 pasižymi C++17 standarto palaikymo stabilizavimu, būsimojo C++20 standarto (kodiniu pavadinimu C++2a) galimybių diegimu, D kalbos įtraukimu į sąsają, daliniu OpenMP 5.0 palaikymu. , beveik visiškas OpenACC 2.5 palaikymas, padidina procedūrų optimizavimo ir optimizavimo mastelio keitimą susiejimo etape, išplėtė diagnostikos įrankius ir įtraukė naujus įspėjimus, „OpenRISC“, „C-SKY V2“ ir AMD GCN grafikos procesorius.

pagrindinis pokyčiai:

  • Pridėtas D programavimo kalbos palaikymas. GCC apima sąsają su kompiliatoriumi GDC (Gnu D Compiler) ir vykdymo bibliotekos (libphobos), leidžiančios naudoti standartinį GCC kuriant programas D programavimo kalba. D kalbos palaikymo GCC įgalinimo procesas prasidėjo dar 2011 m., tačiau užsitęsė dėl poreikio suderinti kodą su GCC reikalavimais ir problemų, susijusių su intelektinės nuosavybės teisių perleidimu D programavimo kalbą kuriančiai Digital Mars;
  • Buvo atlikti kodų generatoriaus patobulinimai. Pavyzdžiui, buvo įgyvendintos įvairios strategijos, skirtos Switch išraiškoms išplėsti (peršokimo lentelė, bitų testas, sprendimų medis), atsižvelgiant į situacijas. Pridėta galimybė transformuoti tiesines funkcijas, apimančias Switch išraišką, naudojant optimizavimą „-ftree-switch-conversion“ (pavyzdžiui, sąlygų rinkinys, pvz., „2 atvejis: kaip = 205; pertrauka; 3 atvejis: kaip = 305; pertrauka ;“ bus konvertuotas į „100 * kaip + 5“;
  • Patobulintas tarpprocedūrinis optimizavimas. Inline diegimo nustatymai buvo pritaikyti šiuolaikinėms C++ kodų bazėms ir išplėsti naujais parametrais max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns ir uninlined - Think-time. Pagerintas šalto ir karšto kodo atskyrimo tikslumas ir agresyvumas. Patobulintas mastelio keitimas labai dideliems vertimo vienetai (pavyzdžiui, taikant optimizavimą didelių programų susiejimo etape);
  • Patobulintas kodo profiliavimo (PGO – Profile-guided optimization) rezultatais pagrįstas optimizavimo mechanizmas, kuris generuoja optimalesnį kodą, remiantis kodo vykdymo charakteristikų analize. Santraukos parinktis "-fprofilio naudojimas" dabar apima optimizavimo režimus "-fversion-loops-for-stides", "-floop-interchange", "-floop-unroll-and-jam" ir "-ftree-loop-distribution". Pašalintas histogramų su skaitikliais įtraukimas į failus, dėl ko sumažėjo failų su profiliais dydis (dabar histogramos generuojamos skrydžio metu, atliekant optimizavimą susiejimo metu);
  • Patobulintas susiejimo laiko optimizavimas (LTO). Prieš generuojant rezultatą buvo pateiktas tipų supaprastinimas, kuris leido žymiai sumažinti LTO objektų failų dydį, sumažinti atminties sąnaudas susiejimo stadijoje ir pagerinti operacijų lygiagrečiavimą. Skyrių (-param lto-partitions) skaičius padidintas nuo 32 iki 128, o tai pagerina sistemų su daugybe procesoriaus gijų našumą. Pridėtas parametras optimizavimo procesų skaičiui valdyti
    "-param lto-max-streaming-parallelism";

    Dėl to, palyginti su GCC 8.3, GCC 9 įdiegtos optimizacijos leidžiama sumažinti „Firefox 5“ ir „LibreOffice 66“ kompiliavimo laiką maždaug 6.2.3%. Objektų failų dydis sumažėjo 7%. Surišimo laikas 8 branduolių CPU sumažėjo 11%. Nuosekliojo susiejimo etapo optimizavimo etapas dabar yra 28 % greitesnis ir sunaudoja 20 % mažiau atminties. Kiekvieno lygiagrečios LTO pakopos procesoriaus atminties sąnaudos sumažėjo 30 %;

  • Didžioji dalis lygiagretaus programavimo specifikacijų yra įdiegta C, C++ ir Fortran kalboms OpenACC 2.5, kuri apibrėžia GPU ir specializuotų procesorių, pvz., NVIDIA PTX, operacijų iškrovimo įrankius;
  • Dalinis standarto palaikymas įdiegtas C ir C++ „OpenMP 5.0“ (Open Multi-Processing), kuri apibrėžia API ir lygiagretaus programavimo metodų taikymo metodus C, C++ ir Fortran kalboms kelių branduolių ir hibridinėse (CPU+GPU/DSP) sistemose su bendra atmintimi ir vektorizavimo įrenginiais (SIMD) ;
  • C kalbai buvo pridėti nauji įspėjimai: "-Supakuoto nario vata“ (nesulygiuota rodyklės reikšmė į supakuotą struktūros ar jungties narį) ir
    «-Absoliutinė vertė" (kai pasiekiamos absoliučios vertės skaičiavimo funkcijos, jei nurodytam argumentui yra tinkamesnė funkcija, pvz., vietoj abs(3.14) turėtų būti naudojamas fabs(3.14). Pridėta naujų C++ įspėjimų: „-Wdeprecated-copy“,
    „-Winit-list-lifetime“, „-Wredundant-move“, „-Wpessimizing-move“ ir „-Wclass-conversion“. Daugelis anksčiau galimų įspėjimų buvo išplėsti;

  • Pridėtas eksperimentinis būsimos C kalbos standarto dalies, kodiniu pavadinimu C2x, palaikymas. Norėdami įjungti C2x palaikymą, naudokite parinktis „-std=c2x“ ir „-std=gnu2x“ (kad įgalintumėte GNU plėtinius). Standartas dar yra ankstyvoje kūrimo stadijoje, todėl iš jo galimybių palaikoma tik išraiška _Static_assert su vienu argumentu (_Static_assert su dviem argumentais standartizuota C11);
  • C++17 standarto palaikymas paskelbtas stabiliu. Frontend'e C++17 kalbos galimybės yra visiškai įdiegtos, o libstdc++ standarte apibrėžtos bibliotekos funkcijos yra beveik visiškai įgyvendintos;
  • Tęsinys įgyvendinimas būsimo C++2a standarto elementai. Pavyzdžiui, buvo pridėta galimybė inicijavimo metu įtraukti diapazonus, įdiegti lambda išraiškų plėtiniai, pridėta tuščių duomenų struktūrų narių ir tikėtinų / mažai tikėtinų atributų palaikymas, suteikta galimybė sąlyginėse išraiškose iškviesti virtualias funkcijas. ir kt.
    Norėdami įjungti C++2a palaikymą, naudokite parinktis „-std=c++2a“ ir „-std=gnu++2a“. Pridėjo bitų ir versijų antraštės failus į libstdc++, skirtą C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ir std::type_identity bruožai, stdstd::midlerpoint, stdstd::midlerpoint , std::bind_front,
    std::visit, std::is_constant_valuated ir std::sume_aligned, pridėtas char8_t tipo palaikymas, įdiegta galimybė patikrinti eilučių priešdėlį ir galūnę (starts_with, ends_with);

  • Pridėtas naujų ARM procesorių palaikymas
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE ir Neoverse N1. Pridėtas palaikymas instrukcijoms, įdiegtoms Armv8.3-A, skirtas darbui su kompleksiniais skaičiais, pseudoatsitiktinių skaičių generavimu (rng) ir atminties žymėjimu (memtag), taip pat instrukcijos, kaip blokuoti atakas, susijusias su spekuliaciniu atšakos numatymo bloko vykdymu ir veikimu. . AArch64 architektūrai buvo pridėtas apsaugos režimas rietuvės ir krūvos sankirtos („-fstack-clash-protection“). Norint naudoti Armv8.5-A architektūros ypatybes, buvo pridėta parinktis „-march=armv8.5-a“

  • Jame yra užpakalinė programa, skirta generuoti AMD GPU kodą, pagrįstą GCN mikroarchitektūra. Šiuo metu įgyvendinimas apsiriboja vienos gijos taikomųjų programų kompiliavimu (palaikymas kelių gijų skaičiavimams per OpenMP ir OpenACC bus pasiūlytas vėliau) ir GPU Fiji ir Vega 10 palaikymu;
  • Pridėta nauja procesorių backend OpenRISC;
  • Pridėta procesorių backend C-SKY V2, kurį gamina to paties pavadinimo Kinijos įmonė įvairiems plataus vartojimo prietaisams;
  • Visos komandų eilutės parinktys, kuriose veikia baitų reikšmės, palaiko priesagas kb, KiB, MB, MiB, GB ir GiB;
  • Įgyvendinta parinktis „-flive-patching=[inline-only-static|inline-clone]“ leidžia saugiai kompiliuoti tiesioginio pataisymo sistemas dėl kelių lygių tarpprocedūrinių (PNPP) optimizavimas;
  • Pridėta parinktis „--užbaigimas“, kad būtų galima tiksliai valdyti parinkties užbaigimą naudojant bash;
  • Diagnostikos įrankiai pateikia šaltinio teksto ištraukas, kuriose nurodomas eilutės numeris ir vizualiai pažymima susijusi informacija, pvz., operandų tipai. Norėdami išjungti eilučių numerių ir etikečių rodymą, pateikiamos parinktys „-fno-diagnostics-show-line-numbers“ ir „-fno-diagnostics-show-labels“;

    GCC 9 kompiliatoriaus rinkinio išleidimas

  • Išplėstas C++ kodo klaidų diagnostikos įrankiai, pagerintas informacijos apie klaidų priežastis įskaitomumas ir probleminių parametrų išryškinimas;

    GCC 9 kompiliatoriaus rinkinio išleidimas

  • Pridėta parinktis „-fdiagnostics-format=json“, kuri leidžia generuoti diagnostinę išvestį mašininio skaitymo formatu (JSON);
  • Pridėtos naujos profiliavimo parinktys „-fprofile-filter-files“ ir „-fprofile-exclude-files“, kad būtų galima pasirinkti apdorotus šaltinio failus;
  • AddressSanitizer suteikia kompaktiškesnį automatinių kintamųjų patvirtinimo kodą, kuris sumažina tikrinamo vykdomojo failo atminties suvartojimą;
  • Patobulinta išvestis "-fopt-info» (išsami informacija apie pridėtus optimizavimus). Pridėta naujų priešdėlių „optimizuota“ ir „praleista“, be anksčiau galimo priešdėlio „pastaba“. Pridėta informacijos apie sprendimų priėmimą išvedimas į eilutę ir ciklų vektorizavimą;
  • Pridėta parinktis „-fsave-optimization-record“, kai nurodyta, GCC išsaugo SRCFILE.opt-record.json.gz failą su sprendimų dėl tam tikrų optimizacijų naudojimo aprašymu. Naujoji parinktis skiriasi nuo „-fopt-info“ režimo, nes apima papildomus metaduomenis, pvz., informaciją apie profilį ir įterptas grandines;
  • Pridėtos parinktys „-fipa-stack-alignment“ ir „-fipa-reference-addressable“, kad būtų galima valdyti dėklo lygiavimą ir adresavimo režimų (tik rašymo arba tikslaus skaitymo) naudojimą statiniams kintamiesiems atliekant tarpprocedūrinį optimizavimą;
  • Įdiegtos naujos integruotos funkcijos, skirtos valdyti atributų susiejimą, taip pat elgesį, susijusį su šakų numatymu ir spekuliacinių komandų vykdymu:__builtin_has_tribute«,«__builtin_expect_su_tikimybe"Ir"__builtin_speculation_safe_value“. Pridėtas naujas atributas funkcijoms, kintamiesiems ir tipams nukopijuoti;
  • Fortran kalbai įdiegtas visiškas asinchroninio įvesties/išvesties palaikymas;
  • „Solaris 10“ (*-*-solaris2.10) ir „Cell/BE“ („Cell Broadband Engine SPU“) platformų palaikymas nebenaudojamas ir bus pašalintas kitame dideliame leidime. Armv2, Armv3, Armv5 ir Armv5E architektūrų palaikymas buvo nutrauktas. „Intel MPX“ (atminties apsaugos plėtinių) palaikymas buvo nutrauktas.

Šaltinis: opennet.ru

Добавить комментарий