Lëshimi i paketës së përpiluesit GCC 9

Pas një viti zhvillimi botuar lëshimi i një grupi kompajlerësh falas GCC 9.1, versioni i parë i madh në degën e re të GCC 9.x. Në përputhje me skemë e re numrat e lëshimit, versioni 9.0 u përdor në procesin e zhvillimit dhe pak para lëshimit të GCC 9.1, dega GCC 10.0 tashmë ishte degëzuar, mbi bazën e së cilës do të formohej versioni tjetër i rëndësishëm, GCC 10.1.

GCC 9.1 është i dukshëm për stabilizimin e mbështetjes për standardin C++17, duke vazhduar të zbatojë aftësitë e standardit të ardhshëm C++20 (i koduar C++2a), përfshirjen në frontin për gjuhën D, mbështetje të pjesshme për OpenMP 5.0 , mbështetje pothuajse e plotë për OpenACC 2.5, rrit shkallëzueshmërinë e optimizimeve dhe optimizimeve ndërprocedurale në fazën e lidhjes, zgjerimin e mjeteve diagnostikuese dhe shtimin e paralajmërimeve të reja, backends për OpenRISC, C-SKY V2 dhe AMD GCN GPU.

Kryesore Ndryshimet:

  • Mbështetje e shtuar për gjuhën e programimit D. GCC përfshin një frontend me një përpilues DPD (Gnu D Compiler) dhe bibliotekat e ekzekutimit (libphobos), të cilat ju lejojnë të përdorni GCC standarde për të ndërtuar programe në gjuhën e programimit D. Procesi i aktivizimit të mbështetjes së gjuhës D në GCC ka filluar në vitin 2011, por zvarritur për shkak të nevojës për të sjellë kodin në përputhje me kërkesat e GCC dhe problemet me transferimin e të drejtave të pronësisë intelektuale në Digital Mars, që po zhvillon gjuhën e programimit D;
  • Janë bërë përmirësime në gjeneratorin e kodit. Për shembull, është zbatuar përdorimi i strategjive të ndryshme për zgjerimin e shprehjeve Switch (tabelë kërcimi, test bit, pemë vendimi) në varësi të situatave. U shtua aftësia për të transformuar funksionet lineare që përfshijnë një shprehje Switch duke përdorur optimizimin "-ftree-switch-conversion" (për shembull, një grup kushtesh si "rasti 2: si = 205; pushim; rasti 3: si = 305; thyej ;” do të konvertohet në "100 * si + 5";
  • Përmirësimi i optimizimeve ndërprocedurale. Cilësimet e vendosjes inline janë përshtatur për bazat moderne të kodeve C++ dhe janë zgjeruar me parametra të rinj max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns and uninlined -thunk-time. Saktësia dhe agresiviteti i përmirësuar i ndarjes së kodit të ftohtë/nxehtë. Shkallueshmëri e përmirësuar për shumë të mëdha njësi përkthimi (për shembull, kur aplikoni optimizimin në fazën e lidhjes me programe të mëdha);
  • Është përmirësuar mekanizmi i optimizimit i bazuar në rezultatet e profilizimit të kodit (PGO - Profile-guided optimization), i cili gjeneron kod më optimal bazuar në një analizë të karakteristikave të ekzekutimit të kodit. Opsioni përmbledhës "-fprofile-përdorim" tani përfshin mënyrat e optimizimit "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" dhe "-ftree-loop-distribution". U hoq përfshirja e histogrameve me numërues në skedarë, gjë që zvogëloi madhësinë e skedarëve me profile (histogramet tani krijohen në fluturim kur kryejnë optimizime gjatë lidhjes);
  • Optimizimet e përmirësuara të kohës së lidhjes (LTO). Thjeshtimi i llojeve u sigurua përpara se të gjenerohej rezultati, gjë që bëri të mundur zvogëlimin e ndjeshëm të madhësisë së skedarëve të objektit LTO, zvogëlimin e konsumit të kujtesës në fazën e lidhjes dhe përmirësimin e paralelizimit të operacioneve. Numri i ndarjeve (-param lto-partitions) është rritur nga 32 në 128, gjë që përmirëson performancën në sistemet me një numër të madh të temave të CPU. Është shtuar një parametër për të kontrolluar numrin e proceseve të optimizuesit
    "-param lto-max-streaming-paralelism";

    Si rezultat, krahasuar me GCC 8.3, optimizimet e prezantuara në GCC 9 lejohet zvogëloni kohën e përpilimit të Firefox 5 dhe LibreOffice 66 me rreth 6.2.3%. Madhësia e skedarëve të objektit u ul me 7%. Koha e lidhjes në një CPU me 8 bërthama u ul me 11%. Faza e optimizimit sekuencial të fazës së lidhjes është tani 28% më e shpejtë dhe konsumon 20% më pak memorie. Konsumi i memories për secilin procesor të fazës së paralelizuar të LTO është ulur me 30%;

  • Shumica e specifikimeve të programimit paralel zbatohen për gjuhët C, C++ dhe Fortran OpenACC 2.5, i cili përcakton mjetet për shkarkimin e operacioneve në GPU dhe procesorë të specializuar si NVIDIA PTX;
  • Mbështetja e pjesshme për standardin është zbatuar për C dhe C++ Hap MP 5.0 (Open Multi-Processing), i cili përcakton API-në dhe metodat e aplikimit të metodave paralele të programimit për gjuhët C, C++ dhe Fortran në sistemet me shumë bërthama dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe njësi vektorizimi (SIMD) ;
  • Janë shtuar paralajmërime të reja për gjuhën C: "-Anëtari i paketuar" (vlera e padrejtuar e treguesit për një anëtar të paketuar të një strukture ose bashkimi) dhe
    «-Vlera-absolute" (kur aksesoni funksionet për llogaritjen e një vlere absolute, nëse ekziston një funksion më i përshtatshëm për argumentin e specifikuar, për shembull, fabs(3.14) duhet të përdoret në vend të abs(3.14). U shtuan paralajmërime të reja për C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" dhe "-Wclass-conversion". Shumë paralajmërime të disponueshme më parë janë zgjeruar;

  • U shtua mbështetje eksperimentale për një pjesë të standardit të ardhshëm të gjuhës C, të koduar C2x. Për të aktivizuar mbështetjen e C2x, përdorni opsionet "-std=c2x" dhe "-std=gnu2x" (për të aktivizuar shtesat GNU). Standardi është ende në një fazë të hershme të zhvillimit, prandaj, për aftësitë e tij, mbështetet vetëm shprehja _Static_assert me një argument (_Static_assert me dy argumente është standardizuar në C11);
  • Mbështetja për standardin C++17 është deklaruar e qëndrueshme. Në frontend, aftësitë gjuhësore të C++17 janë zbatuar plotësisht, dhe në libstdc++, funksionet e bibliotekës të përcaktuara në standard janë afër zbatimit të plotë;
  • Vazhdon zbatim elementet e standardit të ardhshëm C++2a. Për shembull, aftësia për të përfshirë vargjet gjatë inicializimit është shtuar, shtesat për shprehjet lambda janë zbatuar, është shtuar mbështetje për anëtarët bosh të strukturave të të dhënave dhe atributet e mundshme/të pamundura, është siguruar aftësia për të thirrur funksione virtuale në shprehje të kushtëzuara. , etj.
    Për të aktivizuar mbështetjen e C++2a, përdorni opsionet "-std=c++2a" dhe "-std=gnu++2a". Skedarët e kokës së bit-it dhe versionit të shtuar në libstdc++ për C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dhe std:: tiparet e identitetit të tipit, std:: funksioni i mesit, std:: midpoint, , std::bind_front,
    std::visit, std::is_constant_evaluated dhe std::assume_aligned, shtoi mbështetje për llojin char8_t, zbatoi aftësinë për të kontrolluar parashtesën dhe prapashtesën e vargjeve (fillon_me, përfundon_me);

  • Mbështetje e shtuar për procesorët e rinj ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE dhe Neoverse N1. Mbështetje e shtuar për udhëzimet e prezantuara në Armv8.3-A për punën me numra kompleks, gjenerimin e numrave pseudo të rastësishëm (rng) dhe etiketimin e memories (memtag), si dhe udhëzimet për bllokimin e sulmeve që lidhen me ekzekutimin spekulativ dhe funksionimin e njësisë së parashikimit të degës . Për arkitekturën AArch64, është shtuar një mënyrë mbrojtjeje kryqëzimet e pirgut dhe grumbullit (“-fstack-clash-protection”). Për të përdorur veçoritë e arkitekturës Armv8.5-A, është shtuar opsioni “-marsh=armv8.5-a”.

  • Ai përfshin një backend për gjenerimin e kodit për GPU-të AMD bazuar në mikroarkitekturën GCN. Implementimi aktualisht është i kufizuar në përpilimin e aplikacioneve me një fillesë (mbështetja për kryerjen e llogaritjeve me shumë fije nëpërmjet OpenMP dhe OpenACC do të ofrohet më vonë) dhe mbështetje për GPU Fiji dhe Vega 10;
  • U shtua backend i ri për procesorët OpenRISC;
  • Mbështetja e shtuar për procesorët C-SKY V2, prodhuar nga kompania kineze me të njëjtin emër për pajisje të ndryshme konsumatore;
  • Të gjitha opsionet e linjës së komandës që funksionojnë vlerat e bajtit mbështesin prapashtesat kb, KiB, MB, MiB, GB dhe GiB;
  • Zbatuar opsioni "-flive-patching=[inline-only-static|inline-clone]" ju lejon të arrini përpilim të sigurt për sistemet e korrigjimit të drejtpërdrejtë për shkak të kontrollit në shumë nivele mbi përdorimin e ndërprocedurës (IPA) optimizimet;
  • Opsioni i shtuar "--përfundim" për kontroll të imët të plotësimit të opsionit kur përdoret bash;
  • Mjetet diagnostike ofrojnë shfaqje të fragmenteve të tekstit burimor që tregojnë numrin e linjës dhe shënjojnë vizualisht informacionin e lidhur, siç janë llojet e operandit. Për të çaktivizuar shfaqjen e numrave dhe etiketave të linjave, ofrohen opsionet "-fno-diagnostics-show-line-numbers" dhe "-fno-diagnostics-show-labels";

    Lëshimi i paketës së përpiluesit GCC 9

  • Zgjeruar mjete për diagnostikimin e gabimeve në kodin C++, përmirësim të lexueshmërisë së informacionit për shkaqet e gabimeve dhe nxjerrje në pah të parametrave problematikë;

    Lëshimi i paketës së përpiluesit GCC 9

  • Opsioni i shtuar “-fdiagnostics-format=json”, i cili lejon gjenerimin e daljes diagnostike në format të lexueshëm nga makina (JSON);
  • U shtuan opsionet e reja të profilizimit "-fprofile-filter-files" dhe "-fprofile-exclude-files" për të zgjedhur skedarët burim që do të përpunohen;
  • AddressSanitizer siguron gjenerimin e kodit më kompakt të verifikimit për variablat automatike, gjë që redukton konsumin e kujtesës së skedarit të ekzekutueshëm që kontrollohet;
  • Prodhimi i përmirësuar në "-fopt-info» (informacion i detajuar rreth optimizimeve të shtuara). U shtuan prefikset e reja "të optimizuara" dhe "të humbura", përveç parashtesave të disponueshme më parë "shënim". Dalja e shtuar e informacionit në lidhje me vendimmarrjen mbi shpalosjen në linjë dhe vektorizimin e cikleve;
  • U shtua opsioni "-fsave-optimization-record", kur specifikohet, GCC ruan skedarin SRCFILE.opt-record.json.gz me një përshkrim të vendimeve për përdorimin e optimizimeve të caktuara. Opsioni i ri ndryshon nga modaliteti "-fopt-info" duke përfshirë meta të dhëna shtesë, të tilla si informacione për profilin dhe zinxhirët inline;
  • Opsionet e shtuara "-fipa-stack-alignment" dhe "-fipa-reference-addressable" për të kontrolluar shtrirjen e stivës dhe përdorimin e mënyrave të adresimit (vetëm shkrim ose lexim të saktë) për variablat statike gjatë optimizimeve ndërprocedurale;
  • Funksionet e reja të integruara janë futur për të kontrolluar lidhjen e atributeve, si dhe sjelljen në lidhje me parashikimin e degëve dhe ekzekutimin spekulativ të udhëzimeve: "__ndërtuar_ka_atribut" '__ndërtuar_prit_me_probabilitet"Dhe"__spekulimi_ndërtuar_vlera e sigurt". Një atribut i ri është shtuar për funksionet, variablat dhe llojet kopje;
  • Mbështetje e plotë për hyrje/dalje asinkrone është zbatuar për gjuhën Fortran;
  • Mbështetja për platformat Solaris 10 (*-*-solaris2.10) dhe Cell/BE (Cell Broadband Engine SPU) është zhvlerësuar dhe do të hiqet në versionin tjetër të madh. Mbështetja për arkitekturat Armv2, Armv3, Armv5 dhe Armv5E është ndërprerë. Mbështetja për Intel MPX (Zgjatjet e mbrojtjes së kujtesës) është ndërprerë.

Burimi: opennet.ru

Shto një koment