GCC 9 kompilatoru komplekta izlaiŔana

Pēc gada attÄ«stÄ«bas publicēta bezmaksas kompilatoru komplekta izlaiÅ”ana GCC 9.1, pirmais lielais laidiens jaunajā GCC 9.x atzarā. Saskaņā ar jauna shēma izlaiduma numurus, izstrādes procesā tika izmantota versija 9.0 un Ä«si pirms GCC 9.1 iznākÅ”anas jau bija atzarojies GCC 10.0 atzars, uz kura pamata veidotos nākamais nozÄ«mÄ«gais laidiens GCC 10.1.

GCC 9.1 ir ievērojams ar C++17 standarta atbalsta stabilizÄ“Å”anu, topoŔā C++20 standarta (ar koda nosaukumu C++2a) iespēju ievieÅ”anu, iekļauÅ”anu D valodas frontendā, daļēju OpenMP 5.0 atbalstu. , gandrÄ«z pilnÄ«gs OpenACC 2.5 atbalsts, palielināt starpprocedÅ«ru optimizācijas un optimizācijas mērogojamÄ«bu saistÄ«Å”anas stadijā, diagnostikas rÄ«ku paplaÅ”ināŔana un jaunu brÄ«dinājumu pievienoÅ”ana, aizmugursistēmas OpenRISC, C-SKY V2 un AMD GCN GPU.

Galvenais izmaiņas:

  • Pievienots D programmÄ“Å”anas valodas atbalsts. GCC ietver priekÅ”galu ar kompilatoru GDC (Gnu D Compiler) un izpildlaika bibliotēkas (libphobos), kas ļauj izmantot standarta GCC, lai izveidotu programmas D programmÄ“Å”anas valodā. D valodas atbalsta iespējoÅ”anas process GCC ir sācies vēl 2011. gadā, bet ievilkās sakarā ar nepiecieÅ”amÄ«bu saskaņot kodu ar GCC prasÄ«bām un problēmām ar intelektuālā Ä«paÅ”uma tiesÄ«bu nodoÅ”anu Digital Mars, kas izstrādā D programmÄ“Å”anas valodu;
  • Ir veikti uzlabojumi kodu Ä£eneratorā. Piemēram, ir ieviestas dažādas stratēģijas Switch izteiksmju paplaÅ”ināŔanai (lēciena tabula, bitu pārbaude, lēmumu koks) atkarÄ«bā no situācijām. Pievienota iespēja pārveidot lineāras funkcijas, kas ietver Switch izteiksmi, izmantojot optimizāciju ā€œ-ftree-switch-conversionā€ (piemēram, tādu nosacÄ«jumu kopa kā ā€œcase 2: how = 205; break; case 3: how = 305; break ;ā€ tiks pārveidots par "100 * kā + 5";
  • Uzlabota starpprocedÅ«ru optimizācija. Iekļautās izvietoÅ”anas iestatÄ«jumi ir pielāgoti modernām C++ kodu bāzēm un paplaÅ”ināti ar jauniem parametriem max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns un uninlined. - domāŔanas laiks. Uzlabota aukstā/karstā koda atdalÄ«Å”anas precizitāte un agresivitāte. Uzlabota mērogojamÄ«ba ļoti lieliem tulkoÅ”anas vienÄ«bas (piemēram, pielietojot optimizāciju saistÄ«Å”anas stadijā lielām programmām);
  • Uzlabots optimizācijas mehānisms, kas balstÄ«ts uz koda profilÄ“Å”anas rezultātiem (PGO - Profile-guided optimization), kas Ä£enerē optimālāku kodu, pamatojoties uz koda izpildes Ä«paŔību analÄ«zi. Kopsavilkuma opcija "-fprofila lietoÅ”ana" tagad ietver optimizācijas režīmus "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" un "-ftree-loop-distribution". Noņemta histogrammu ar skaitÄ«tājiem iekļauÅ”ana failos, kas samazināja failu izmērus ar profiliem (tagad histogrammas tiek Ä£enerētas lidojumā, veicot optimizāciju saistÄ«Å”anas laikā);
  • Uzlabota saistÄ«Å”anas laika optimizācija (LTO). Pirms rezultāta Ä£enerÄ“Å”anas tika nodroÅ”ināta tipu vienkārÅ”oÅ”ana, kas ļāva ievērojami samazināt LTO objektu failu izmērus, samazināt atmiņas patēriņu saistÄ«Å”anas stadijā un uzlabot darbÄ«bu paralēlizāciju. Sadaļu skaits (-param lto-partitions) ir palielināts no 32 lÄ«dz 128, kas uzlabo veiktspēju sistēmās ar lielu CPU pavedienu skaitu. Ir pievienots parametrs, lai kontrolētu optimizētāja procesu skaitu
    "-param lto-max-streaming-parallelism";

    Tā rezultātā, salÄ«dzinot ar GCC 8.3, GCC 9 ieviestās optimizācijas atļauts samaziniet Firefox 5 un LibreOffice 66 kompilācijas laiku par aptuveni 6.2.3%. Objektu failu lielums samazinājās par 7%. SaistÄ«Å”anas laiks 8 kodolu centrālajam procesoram samazinājās par 11%. SaistÄ«Å”anas posma secÄ«gā optimizācijas stadija tagad ir par 28% ātrāka un patērē par 20% mazāk atmiņas. Katra LTO paralēlā posma procesora atmiņas patēriņŔ samazinājās par 30%;

  • Lielākā daļa paralēlās programmÄ“Å”anas specifikācijas ir ieviestas C, C++ un Fortran valodām OpenACC 2.5, kas nosaka rÄ«kus GPU un specializētu procesoru, piemēram, NVIDIA PTX, izkrauÅ”anas operāciju veikÅ”anai;
  • C un C++ standartam ir ieviests daļējs atbalsts OpenMP 5.0 (Open Multi-Processing), kas nosaka API un paralēlās programmÄ“Å”anas metožu pielietoÅ”anas metodes C, C++ un Fortran valodām daudzkodolu un hibrÄ«dsistēmās (CPU+GPU/DSP) ar koplietojamo atmiņu un vektorizācijas vienÄ«bām (SIMD) ;
  • C valodai ir pievienoti jauni brÄ«dinājumi: "-Sapakotā biedra vatÄ«te" (nesalÄ«dzināta rādÄ«tāja vērtÄ«ba struktÅ«ras vai savienÄ«bas iepakotam elementam) un
    Ā«-AbsolÅ«tā vērtÄ«ba" (piekļūstot funkcijām absolÅ«tās vērtÄ«bas aprēķināŔanai, ja norādÄ«tajam argumentam ir piemērotāka funkcija, piemēram, abs(3.14) vietā jāizmanto fabs(3.14). C++ pievienoti jauni brÄ«dinājumi: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" un "-Wclass-conversion". Daudzi iepriekŔ pieejamie brīdinājumi ir paplaŔināti;

  • Pievienots eksperimentāls atbalsts daļai no topoŔā C valodas standarta ar koda nosaukumu C2x. Lai iespējotu C2x atbalstu, izmantojiet opcijas "-std=c2x" un "-std=gnu2x" (lai iespējotu GNU paplaÅ”inājumus). Standarts vēl ir agrÄ«nā izstrādes stadijā, tāpēc no tā iespējām tiek atbalstÄ«ta tikai izteiksme _Static_assert ar vienu argumentu (_Static_assert ar diviem argumentiem ir standartizēta C11);
  • Atbalsts C++17 standartam ir pasludināts par stabilu. Frontendā C++17 valodas iespējas ir pilnÄ«bā ieviestas, un libstdc++ standartā definētās bibliotēkas funkcijas ir tuvu pilnai ievieÅ”anai;
  • Turpinājums Ä«stenoÅ”anu topoŔā C++2a standarta elementi. Piemēram, ir pievienota iespēja iekļaut diapazonus inicializācijas laikā, ir ieviesti paplaÅ”inājumi lambda izteiksmēm, ir pievienots atbalsts tukÅ”iem datu struktÅ«ru dalÄ«bniekiem un ticamiem/maz ticamiem atribÅ«tiem, ir nodroÅ”ināta iespēja izsaukt virtuālās funkcijas nosacÄ«juma izteiksmēs. utt.
    Lai iespējotu C++2a atbalstu, izmantojiet opcijas "-std=c++2a" un "-std=gnu++2a". Pievienoti bitu un versiju galvenes faili libstdc++, kas paredzēts C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible un std::type_identity iezīmes, stdstd::midler. , std::bind_front,
    std::visit, std::is_constant_evaluated un std::assume_aligned, pievienots atbalsts tipam char8_t, ieviesta iespēja pārbaudīt virkņu prefiksu un sufiksu (sākas_ar, beidzas_ar);

  • Pievienots atbalsts jauniem ARM procesoriem
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE un Neoverse N1. Pievienots atbalsts instrukcijām, kas ieviestas Armv8.3-A darbam ar kompleksajiem skaitļiem, pseidogadÄ«juma skaitļu Ä£enerÄ“Å”anai (rng) un atmiņas marÄ·Ä“Å”anai (memtag), kā arÄ« instrukcijas, lai bloķētu uzbrukumus, kas saistÄ«ti ar zaru prognozÄ“Å”anas vienÄ«bas spekulatÄ«vu izpildi un darbÄ«bu. . AArch64 arhitektÅ«rai ir pievienots aizsardzÄ«bas režīms kaudzes un kaudzes krustojumi (ā€œ-fstack-clash-protectionā€). Lai izmantotu Armv8.5-A arhitektÅ«ras iespējas, ir pievienota opcija ā€œ-march=armv8.5-aā€.

  • Tajā ir iekļauta aizmugursistēma koda Ä£enerÄ“Å”anai AMD GPU, pamatojoties uz GCN mikroarhitektÅ«ru. ÄŖstenoÅ”ana paÅ”laik aprobežojas ar viena pavediena lietojumprogrammu kompilāciju (atbalsts vairāku pavedienu aprēķinu veikÅ”anai, izmantojot OpenMP un OpenACC, tiks piedāvāts vēlāk) un GPU Fiji un Vega 10 atbalstu;
  • Pievienota jauna aizmugursistēma procesoriem OpenRISC;
  • Pievienota aizmugure procesoriem C-SKY V2, ko ražo Ķīnas uzņēmums ar tādu paÅ”u nosaukumu dažādām patēriņa ierÄ«cēm;
  • Visas komandrindas opcijas, kas darbojas ar baitu vērtÄ«bām, atbalsta sufiksus kb, KiB, MB, MiB, GB un GiB;
  • ÄŖstenots opcija ā€œ-flive-patching=[inline-only-static|inline-clone]ā€ ļauj sasniegt droÅ”u kompilāciju reāllaika ielāpu sistēmām, pateicoties daudzlÄ«meņu kontrolei pār starpprocedÅ«ru (IPA) optimizācijas;
  • Pievienota opcija "--completion", lai precÄ«zi kontrolētu opciju pabeigÅ”anu, lietojot bash;
  • Diagnostikas rÄ«ki nodroÅ”ina avota teksta fragmentu displejus, norādot rindas numuru un vizuāli iezÄ«mējot saistÄ«to informāciju, piemēram, operandu veidus. Lai atspējotu rindu numuru un etiÄ·eÅ”u rādÄ«Å”anu, tiek nodroÅ”inātas opcijas ā€œ-fno-diagnostics-show-line-numbersā€ un ā€œ-fno-diagnostics-show-labelsā€;

    GCC 9 kompilatoru komplekta izlaiŔana

  • Izvērsts rÄ«ki kļūdu diagnosticÄ“Å”anai C++ kodā, uzlabota informācijas lasāmÄ«ba par kļūdu cēloņiem un problemātisko parametru izcelÅ”ana;

    GCC 9 kompilatoru komplekta izlaiŔana

  • Pievienota opcija ā€œ-fdiagnostics-format=jsonā€, kas ļauj Ä£enerēt diagnostikas izvadi maŔīnlasāmā formātā (JSON);
  • Pievienotas jaunas profilÄ“Å”anas opcijas ā€œ-fprofile-filter-filesā€ un ā€œ-fprofile-exclude-filesā€, lai atlasÄ«tu apstrādājamos avota failus;
  • AddressSanitizer nodroÅ”ina kompaktāka verifikācijas koda Ä£enerÄ“Å”anu automātiskajiem mainÄ«gajiem, kas samazina pārbaudāmā izpildāmā faila atmiņas patēriņu;
  • Uzlabota izvade "-fopt-infoĀ» (detalizēta informācija par pievienotajām optimizācijām). Pievienoti jauni prefiksi "optimizēts" un "izlaists", papildus iepriekÅ” pieejamajam prefiksam "piezÄ«me". Pievienota informācijas izvade par lēmumu pieņemÅ”anu attiecÄ«bā uz ciklu izvērÅ”anu un vektorizāciju;
  • Pievienota opcija ā€œ-fsave-optimization-recordā€, kad tā ir norādÄ«ta, GCC saglabā SRCFILE.opt-record.json.gz failu ar aprakstu par lēmumiem par noteiktu optimizāciju izmantoÅ”anu. Jaunā opcija atŔķiras no ā€œ-fopt-infoā€ režīma, iekļaujot papildu metadatus, piemēram, informāciju par profilu un iekļautajām ķēdēm;
  • Pievienotas opcijas ā€œ-fipa-stack-alignmentā€ un ā€œ-fipa-reference-addressableā€, lai kontrolētu steka lÄ«dzināŔanu un adresācijas režīmu (tikai rakstÄ«Å”anas vai lasÄ«Å”anas-precÄ«zas) izmantoÅ”anu statiskajiem mainÄ«gajiem starpprocedÅ«ru optimizācijas laikā;
  • Tiek ieviestas jaunas iebÅ«vētās funkcijas, lai kontrolētu atribÅ«tu saistÄ«Å”anu, kā arÄ« uzvedÄ«bu, kas saistÄ«ta ar zaru prognozÄ“Å”anu un spekulatÄ«vo instrukciju izpildi: "__builtin_has_atribute","__builtin_expect_ar_iespējamÄ«bu" Un "__builtin_speculation_safe_value". Ir pievienots jauns atribÅ«ts funkcijām, mainÄ«gajiem un veidiem kopija;
  • Fortran valodai ir ieviests pilns asinhronās ievades/izvades atbalsts;
  • Solaris 10 (*-*-solaris2.10) un Cell/BE (Cell Broadband Engine SPU) platformu atbalsts ir novecojis un tiks noņemts nākamajā lielajā laidienā. Atbalsts Armv2, Armv3, Armv5 un Armv5E arhitektÅ«rām ir pārtraukts. Intel MPX (atmiņas aizsardzÄ«bas paplaÅ”inājumu) atbalsts ir pārtraukts.

Avots: opennet.ru

Pievieno komentāru