Udgivelse af GCC 9 compiler suite

Efter et års udvikling offentliggjort frigivelse af et gratis sæt kompilatorer GCC 9.1, den første store udgivelse i den nye GCC 9.x-gren. I overensstemmelse med ny ordning udgivelsesnumre, version 9.0 blev brugt i udviklingsprocessen, og kort før udgivelsen af ​​GCC 9.1 var GCC 10.0-grenen allerede forgrenet, på grundlag af hvilken den næste væsentlige udgivelse, GCC 10.1, ville blive dannet.

GCC 9.1 er kendt for at stabilisere understøttelsen af ​​C++17-standarden, fortsætte med at implementere mulighederne i den fremtidige C++20-standard (kodenavnet C++2a), inkludering i frontend for D-sproget, delvis understøttelse af OpenMP 5.0 , næsten komplet understøttelse af OpenACC 2.5, øge skalerbarheden af ​​interprocedureelle optimeringer og optimeringer på bindingsstadiet, udvidelse af diagnostiske værktøjer og tilføjelse af nye advarsler, backends til OpenRISC, C-SKY V2 og AMD GCN GPU.

The main ændringer:

  • Tilføjet understøttelse af programmeringssproget D. GCC inkluderer en frontend med en compiler GDC (Gnu D Compiler) og runtime-biblioteker (libphobos), som giver dig mulighed for at bruge standard GCC til at bygge programmer i programmeringssproget D. Processen med at aktivere D-sprogunderstøttelse i GCC er begyndt tilbage i 2011, men trukket ud på grund af behovet for at bringe koden i overensstemmelse med GCC-krav og problemer med overførsel af intellektuelle ejendomsrettigheder til Digital Mars, som er ved at udvikle programmeringssproget D;
  • Der er foretaget forbedringer af kodegeneratoren. For eksempel er brugen af ​​forskellige strategier til at udvide Switch-udtryk (hoppetabel, bittest, beslutningstræ) afhængigt af situationer blevet implementeret. Tilføjet muligheden for at transformere lineære funktioner, der inkluderer et Switch-udtryk ved hjælp af "-ftree-switch-conversion"-optimeringen (for eksempel et sæt betingelser som "case 2: how = 205; break; case 3: how = 305; break ;” vil blive konverteret til "100 * hvordan + 5";
  • Forbedrede interprocedureelle optimeringer. Indstillinger for inline-implementering er blevet tilpasset til moderne C++-kodebaser og udvidet med nye parametre max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-inss og uninlined -tanke-tid. Forbedret nøjagtighed og aggressivitet af kold/varm kodeadskillelse. Forbedret skalerbarhed for meget store oversættelsesenheder (f.eks. ved anvendelse af optimering på linkningsstadiet til store programmer);
  • Optimeringsmekanismen baseret på resultaterne af kodeprofilering (PGO - Profile-guided optimization) er blevet forbedret, hvilket genererer mere optimal kode baseret på en analyse af kodeeksekveringens karakteristika. Opsummeringsmulighed "-fprofil-brug" inkluderer nu optimeringstilstandene "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" og "-ftree-loop-distribution". Fjernede inklusion af histogrammer med tællere i filer, hvilket reducerede størrelsen af ​​filer med profiler (histogrammer genereres nu i farten, når der udføres optimeringer under sammenkædning);
  • Enhanced Linking Time Optimizations (LTO). Forenkling af typer blev tilvejebragt før generering af resultatet, hvilket gjorde det muligt at reducere størrelsen af ​​LTO-objektfiler betydeligt, reducere hukommelsesforbruget på bindingsstadiet og forbedre paralleliseringen af ​​operationer. Antallet af partitioner (-param lto-partitioner) er blevet øget fra 32 til 128, hvilket forbedrer ydeevnen på systemer med et stort antal CPU-tråde. Der er tilføjet en parameter for at styre antallet af optimeringsprocesser
    "-param lto-max-streaming-parallelism";

    Som et resultat, sammenlignet med GCC 8.3, de optimeringer, der blev introduceret i GCC 9 tilladt reducere kompileringstiden for Firefox 5 og LibreOffice 66 med omkring 6.2.3 %. Størrelsen af ​​objektfiler faldt med 7 %. Bindingstiden på en 8-core CPU faldt med 11 %. Det sekventielle optimeringstrin i linkningsfasen er nu 28 % hurtigere og bruger 20 % mindre hukommelse. Hukommelsesforbruget for hver processor i den paralleliserede fase af LTO faldt med 30%;

  • Det meste af de parallelle programmeringsspecifikationer er implementeret for C, C++ og Fortran sprog OpenACC 2.5, som definerer værktøjer til aflæsning af operationer på GPU'er og specialiserede processorer såsom NVIDIA PTX;
  • Delvis understøttelse af standarden er implementeret for C og C++ Åbn MP 5.0 (Open Multi-Processing), som definerer API'et og metoderne til at anvende parallelle programmeringsmetoder for C, C++ og Fortran sprog på multi-core og hybrid (CPU+GPU/DSP) systemer med delt hukommelse og vektoriseringsenheder (SIMD) ;
  • Nye advarsler er blevet tilføjet for C-sproget: "-Vaddress-of-packed-medlem" (ujusteret pointerværdi til et pakket medlem af en struktur eller forening) og
    «-Wabsolut-værdi" (ved adgang til funktioner til at beregne en absolut værdi, hvis der er en mere passende funktion til det angivne argument, skal f.eks. fabs(3.14) bruges i stedet for abs(3.14). Nye advarsler tilføjet til C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" og "-Wclass-conversion". Mange tidligere tilgængelige advarsler er blevet udvidet;

  • Tilføjet eksperimentel støtte til en del af den fremtidige C-sprogstandard, kodenavnet C2x. For at aktivere C2x-understøttelse skal du bruge indstillingerne "-std=c2x" og "-std=gnu2x" (for at aktivere GNU-udvidelser). Standarden er stadig på et tidligt udviklingsstadium, derfor er det kun udtrykket _Static_assert med et argument, der understøttes (_Static_assert med to argumenter er standardiseret i C11);
  • Understøttelse af C++17-standarden er blevet erklæret stabil. I frontend er sprogfunktionerne i C++17 fuldt implementeret, og i libstdc++ er biblioteksfunktionerne defineret i standarden tæt på fuld implementering;
  • Fortsatte implementering elementer i den fremtidige C++2a-standard. For eksempel er muligheden for at inkludere områder under initialisering blevet tilføjet, udvidelser til lambda-udtryk er blevet implementeret, understøttelse af tomme medlemmer af datastrukturer og sandsynlige/usandsynlige attributter er blevet tilføjet, muligheden for at kalde virtuelle funktioner i betingede udtryk er blevet leveret , etc.
    For at aktivere C++2a-understøttelse skal du bruge "-std=c++2a" og "-std=gnu++2a" mulighederne. Tilføjede bit- og versionsheaderfiler til libstdc++ for C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity-træk, std::midpoint, std::lerp-funktion , std::bind_front,
    std::visit, std::is_constant_evaluated og std::assume_aligned, tilføjede understøttelse af char8_t-typen, implementerede evnen til at kontrollere præfikset og suffikset for strenge (starts_with, ends_with);

  • Tilføjet understøttelse af nye ARM-processorer
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE og Neoverse N1. Tilføjet understøttelse af instruktioner introduceret i Armv8.3-A til arbejde med komplekse tal, generering af pseudo-tilfældige tal (rng) og hukommelsesmærkning (memtag), samt instruktioner til blokering af angreb relateret til spekulativ udførelse og drift af grenforudsigelsesenheden . Til AArch64-arkitekturen er der tilføjet en beskyttelsestilstand skæringspunkter mellem stak og heap ("-fstack-clash-protection"). For at bruge funktionerne i Armv8.5-A-arkitekturen er indstillingen "-march=armv8.5-a" blevet tilføjet

  • Det inkluderer en backend til generering af kode til AMD GPU'er baseret på GCN-mikroarkitekturen. Implementeringen er i øjeblikket begrænset til kompilering af enkelt-trådede applikationer (understøttelse af udførelse af multi-trådede beregninger via OpenMP og OpenACC vil blive tilbudt senere) og understøttelse af GPU Fiji og Vega 10;
  • Tilføjet ny backend til processorer OpenRISC;
  • Tilføjet backend til processorer C-SKY V2, produceret af det kinesiske firma af samme navn til forskellige forbrugerenheder;
  • Alle kommandolinjeindstillinger, der betjener byteværdier, understøtter suffikserne kb, KiB, MB, MiB, GB og GiB;
  • Implementeret "-flive-patching=[inline-only-static|inline-clone]" giver dig mulighed for at opnå sikker kompilering for live-patching-systemer på grund af multi-level kontrol over brugen af ​​interprocedure (IPA) optimeringer;
  • Tilføjet "--fuldførelse" mulighed for finkornet kontrol af færdiggørelse af option ved brug af bash;
  • De diagnostiske værktøjer giver visninger af kildetekstuddrag, der angiver linjenummeret og visuel markering af relateret information, såsom operandtyper. For at deaktivere visningen af ​​linjenumre og etiketter er indstillingerne "-fno-diagnostics-show-line-numbers" og "-fno-diagnostics-show-labels" tilvejebragt;

    Udgivelse af GCC 9 compiler suite

  • Udvidet værktøjer til diagnosticering af fejl i C++ kode, forbedret læsbarhed af information om årsagerne til fejl og fremhævelse af problematiske parametre;

    Udgivelse af GCC 9 compiler suite

  • Tilføjet mulighed "-fdiagnostics-format=json", som gør det muligt at generere diagnostisk output i maskinlæsbart format (JSON);
  • Tilføjet nye profileringsmuligheder "-fprofile-filter-files" og "-fprofile-exclude-files" for at vælge kildefiler, der skal behandles;
  • AddressSanitizer giver generering af mere kompakt verifikationskode til automatiske variabler, hvilket reducerer hukommelsesforbruget for den eksekverbare fil, der kontrolleres;
  • Forbedret output i "-fopt-info» (detaljeret information om tilføjede optimeringer). Tilføjet nye præfikser "optimeret" og "savnet", ud over det tidligere tilgængelige præfiks "note". Tilføjet output af information om beslutningstagning om inline-udfoldning og vektorisering af cyklusser;
  • Tilføjet "-fsave-optimization-record", når det er angivet, gemmer GCC filen SRCFILE.opt-record.json.gz med en beskrivelse af beslutninger om brugen af ​​visse optimeringer. Den nye mulighed adskiller sig fra "-fopt-info"-tilstanden ved at inkludere yderligere metadata, såsom information om profilen og inline-kæder;
  • Tilføjede muligheder "-fipa-stack-alignment" og "-fipa-reference-addressable" for at kontrollere stakjustering og brugen af ​​adresseringstilstande (skrive-kun eller læse-nøjagtig) for statiske variable under interprocedureelle optimeringer;
  • Nye indbyggede funktioner introduceres til at kontrollere attributbinding samt adfærd relateret til grenforudsigelse og udførelse af spekulativ instruktion: "__indbygget_har_attribut""__indbygget_forventer_med_sandsynlighed"og"__indbygget_sikker_værdi". Der er tilføjet en ny attribut for funktioner, variabler og typer kopiere;
  • Fuld understøttelse af asynkron input/output er blevet implementeret for Fortran-sproget;
  • Understøttelse af Solaris 10 (*-*-solaris2.10) og Cell/BE (Cell Broadband Engine SPU) platforme er blevet forældet og vil blive fjernet i den næste større udgivelse. Understøttelse af Armv2, Armv3, Armv5 og Armv5E arkitekturer er afbrudt. Understøttelse af Intel MPX (Memory Protection Extensions) er afbrudt.

Kilde: opennet.ru

Tilføj en kommentar