Rilascio della suite di compilatori GCC 9

Dopo un anno di sviluppo pubblicato rilascio di un set gratuito di compilatori GCC 9.1, la prima major release nel nuovo ramo GCC 9.x. Secondo nuovo schema numeri di rilascio, nel processo di sviluppo è stata utilizzata la versione 9.0 e poco prima del rilascio di GCC 9.1 si era già ramificato il ramo GCC 10.0, sulla base del quale sarebbe stata formata la successiva versione significativa, GCC 10.1.

GCC 9.1 si distingue per aver stabilizzato il supporto per lo standard C++17, continuando a implementare le funzionalità del futuro standard C++20 (nome in codice C++2a), inclusione nel frontend per il linguaggio D, supporto parziale per OpenMP 5.0 , supporto quasi completo per OpenACC 2.5, aumento della scalabilità delle ottimizzazioni interprocedurali e ottimizzazioni in fase di collegamento, espansione degli strumenti diagnostici e aggiunta di nuovi avvisi, backend per OpenRISC, C-SKY V2 e GPU AMD GCN.

Il principale modifiche:

  • Aggiunto supporto per il linguaggio di programmazione D. GCC include un frontend con un compilatore GDC (Gnu D Compiler) e librerie runtime (libphobos), che consentono di utilizzare GCC standard per creare programmi nel linguaggio di programmazione D. Il processo di abilitazione del supporto del linguaggio D in GCC iniziato nel 2011, ma trascinato a causa della necessità di adeguare il codice ai requisiti del GCC e dei problemi con il trasferimento dei diritti di proprietà intellettuale a Digital Mars, che sta sviluppando il linguaggio di programmazione D;
  • Sono stati apportati miglioramenti al generatore di codice. Ad esempio, è stato implementato l'utilizzo di diverse strategie per espandere le espressioni Switch (jump table, bit test, decision tree) a seconda delle situazioni. Aggiunta la possibilità di trasformare funzioni lineari che includono un'espressione Switch utilizzando l'ottimizzazione “-ftree-switch-conversion” (ad esempio, un insieme di condizioni come “case 2: how = 205; break; case 3: how = 305; break ;” verrà convertito in "100 * quanto + 5";
  • Ottimizzazioni interprocedurali migliorate. Le impostazioni di distribuzione in linea sono state adattate per le moderne basi di codice C++ e ampliate con nuovi parametri max-inline-insns-small, max-inline-insns-size, uninline-function-insns, uninline-function-time, uninlined-thunk-insns e uninlined -thunk-time. Migliorata la precisione e l'aggressività della separazione del codice freddo/caldo. Scalabilità migliorata per ambienti molto grandi unità di traduzione (ad esempio, quando si applica l'ottimizzazione nella fase di collegamento a programmi di grandi dimensioni);
  • È stato migliorato il meccanismo di ottimizzazione basato sui risultati della profilazione del codice (PGO - Profile-guided optimization), che genera codice più ottimale in base all'analisi delle caratteristiche di esecuzione del codice. Opzione di riepilogo "-fprofile-uso" ora include le modalità di ottimizzazione "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" e "-ftree-loop-distribution". Rimosso l'inclusione di istogrammi con contatori nei file, che riduceva la dimensione dei file con profili (gli istogrammi vengono ora generati al volo quando si eseguono ottimizzazioni durante il collegamento);
  • Ottimizzazioni del tempo di collegamento migliorate (LTO). Prima di generare il risultato è stata fornita una semplificazione dei tipi, che ha consentito di ridurre significativamente la dimensione dei file oggetto LTO, ridurre il consumo di memoria nella fase di associazione e migliorare la parallelizzazione delle operazioni. Il numero di partizioni (-param lto-partitions) è stato aumentato da 32 a 128, il che migliora le prestazioni sui sistemi con un gran numero di thread della CPU. È stato aggiunto un parametro per controllare il numero di processi di ottimizzazione
    "-param lto-max-streaming-parallelismo";

    Di conseguenza, rispetto a GCC 8.3, le ottimizzazioni introdotte in GCC 9 permesso ridurre il tempo di compilazione di Firefox 5 e LibreOffice 66 di circa il 6.2.3%. La dimensione dei file oggetto è diminuita del 7%. Il tempo di collegamento su una CPU a 8 core è diminuito dell'11%. La fase di ottimizzazione sequenziale della fase di collegamento è ora più veloce del 28% e consuma il 20% in meno di memoria. Il consumo di memoria di ciascun processore dello stadio parallelizzato di LTO è diminuito del 30%;

  • La maggior parte delle specifiche di programmazione parallela sono implementate per i linguaggi C, C++ e Fortran OpenACC 2.5, che definisce strumenti per scaricare le operazioni su GPU e processori specializzati come NVIDIA PTX;
  • Il supporto parziale per lo standard è stato implementato per C e C++ Apri MP 5.0 (Open Multi-Processing), che definisce le API e le modalità di applicazione dei metodi di programmazione parallela per i linguaggi C, C++ e Fortran su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e unità di vettorizzazione (SIMD) ;
  • Sono stati aggiunti nuovi avvisi per il linguaggio C: "-Waddress-of-packed-member" (valore del puntatore non allineato a un membro compresso di una struttura o unione) e
    «-Wvalore assoluto" (quando si accede a funzioni per il calcolo di un valore assoluto, se esiste una funzione più adatta per l'argomento specificato, ad esempio, si dovrebbe usare fabs(3.14) invece di abs(3.14). Aggiunti nuovi avvisi per C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" e "-Wclass-conversion". Molti avvisi precedentemente disponibili sono stati ampliati;

  • Aggiunto supporto sperimentale per parte del futuro standard del linguaggio C, nome in codice C2x. Per abilitare il supporto C2x, utilizzare le opzioni "-std=c2x" e "-std=gnu2x" (per abilitare le estensioni GNU). Lo standard è ancora in una fase iniziale di sviluppo, quindi delle sue capacità è supportata solo l'espressione _Static_assert con un argomento (_Static_assert con due argomenti è standardizzato in C11);
  • Il supporto per lo standard C++17 è stato dichiarato stabile. Nel frontend, le funzionalità del linguaggio C++17 sono completamente implementate e in libstdc++ le funzioni di libreria definite nello standard sono prossime alla piena implementazione;
  • Continua implementazione elementi del futuro standard C++2a. Ad esempio, è stata aggiunta la possibilità di includere intervalli durante l'inizializzazione, sono state implementate estensioni per le espressioni lambda, è stato aggiunto il supporto per membri vuoti di strutture dati e attributi probabili/improbabili, è stata fornita la possibilità di chiamare funzioni virtuali in espressioni condizionali , eccetera.
    Per abilitare il supporto C++2a, utilizzare le opzioni "-std=c++2a" e "-std=gnu++2a". Aggiunti file di intestazione bit e versione a libstdc++ per C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e tratti std::type_identity, std::midpoint, funzioni std::lerp , std::bind_front,
    std::visit, std::is_constant_evaluated e std::assume_aligned, aggiunto il supporto per il tipo char8_t, implementata la possibilità di controllare il prefisso e il suffisso delle stringhe (inizia_con, finisce_con);

  • Aggiunto il supporto per i nuovi processori ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE e Neoverse N1. Aggiunto il supporto per le istruzioni introdotte in Armv8.3-A per lavorare con numeri complessi, generazione di numeri pseudo-casuali (rng) e tagging della memoria (memtag), nonché istruzioni per bloccare gli attacchi relativi all'esecuzione speculativa e al funzionamento dell'unità di previsione dei rami . Per l'architettura AArch64 è stata aggiunta una modalità di protezione intersezioni di stack e heap (“-fstack-clash-protezione”). Per utilizzare le funzionalità dell'architettura Armv8.5-A è stata aggiunta l'opzione “-march=armv8.5-a”

  • Include un backend per generare codice per GPU AMD basato sulla microarchitettura GCN. L'implementazione è attualmente limitata alla compilazione di applicazioni single-thread (il supporto per effettuare calcoli multi-thread tramite OpenMP e OpenACC verrà offerto in seguito) e al supporto per GPU Fiji e Vega 10;
  • Aggiunto nuovo backend per i processori ApriRISC;
  • Aggiunto backend per processori C-SKY V2, prodotto dall'omonima azienda cinese per diversi dispositivi consumer;
  • Tutte le opzioni della riga di comando che gestiscono valori byte supportano i suffissi kb, KiB, MB, MiB, GB e GiB;
  • Implementato l'opzione “-flive-patching=[inline-only-static|inline-clone]” consente di ottenere una compilazione sicura per i sistemi di live-patching grazie al controllo multilivello sull'uso dell'interprocedura (IPA) ottimizzazioni;
  • Aggiunta l'opzione "--completion" per un controllo dettagliato del completamento delle opzioni quando si utilizza bash;
  • Gli strumenti diagnostici forniscono visualizzazioni di estratti del testo di origine che indicano il numero di riga e contrassegnano visivamente le informazioni correlate, come i tipi di operandi. Per disabilitare la visualizzazione dei numeri di riga e delle etichette sono disponibili le opzioni “-fno-diagnostics-show-line-numbers” e “-fno-diagnostics-show-labels”;

    Rilascio della suite di compilatori GCC 9

  • allargato strumenti per la diagnosi degli errori nel codice C++, migliore leggibilità delle informazioni sulle cause degli errori ed evidenziazione dei parametri problematici;

    Rilascio della suite di compilatori GCC 9

  • Aggiunta l'opzione “-fdiagnostics-format=json”, che consente di generare output diagnostico in formato leggibile dalla macchina (JSON);
  • Aggiunte nuove opzioni di profilazione “-fprofile-filter-files” e “-fprofile-exclude-files” per selezionare i file sorgente da elaborare;
  • AddressSanitizer fornisce la generazione di un codice di verifica più compatto per le variabili automatiche, che riduce il consumo di memoria del file eseguibile da controllare;
  • Risultati migliorati in "-fopt-info» (informazioni dettagliate sulle ottimizzazioni aggiunte). Aggiunti nuovi prefissi "ottimizzato" e "mancato", oltre al prefisso "nota" precedentemente disponibile. Aggiunto output di informazioni sul processo decisionale sullo sviluppo in linea e sulla vettorizzazione dei cicli;
  • Aggiunta l'opzione “-fsave-optimization-record”, quando specificata, GCC salva il file SRCFILE.opt-record.json.gz con una descrizione delle decisioni sull'uso di determinate ottimizzazioni. La nuova opzione differisce dalla modalità “-fopt-info” includendo metadati aggiuntivi, come informazioni sul profilo e catene in linea;
  • Aggiunte le opzioni “-fipa-stack-alignment” e “-fipa-reference-addressable” per controllare l'allineamento dello stack e l'uso delle modalità di indirizzamento (sola scrittura o lettura esatta) per le variabili statiche durante le ottimizzazioni interprocedurali;
  • Vengono introdotte nuove funzioni integrate per controllare l'associazione degli attributi nonché il comportamento relativo alla previsione dei rami e all'esecuzione speculativa delle istruzioni: "__builtin_ha_attributo«,«__builtin_expect_with_probability" E "__builtin_speculation_safe_value". È stato aggiunto un nuovo attributo per funzioni, variabili e tipi copia;
  • Per il linguaggio Fortran è stato implementato il supporto completo per input/output asincrono;
  • Il supporto per le piattaforme Solaris 10 (*-*-solaris2.10) e Cell/BE (Cell Broadband Engine SPU) è stato deprecato e verrà rimosso nella prossima versione principale. Il supporto per le architetture Armv2, Armv3, Armv5 e Armv5E è stato interrotto. Il supporto per Intel MPX (Memory Protection Extensions) è stato interrotto.

Fonte: opennet.ru

Aggiungi un commento