Veröffentlichung der GCC 9-Compiler-Suite

Nach einem Jahr Entwicklung veröffentlicht Veröffentlichung eines kostenlosen Satzes von Compilern GCC 9.1, die erste Hauptversion im neuen GCC 9.x-Zweig. Gemäß neues Schema Aufgrund der Release-Nummern wurde im Entwicklungsprozess Version 9.0 verwendet und kurz vor der Veröffentlichung von GCC 9.1 hatte sich bereits der GCC 10.0-Zweig abgezweigt, auf dessen Grundlage das nächste bedeutende Release, GCC 10.1, gebildet werden sollte.

GCC 9.1 zeichnet sich durch die Stabilisierung der Unterstützung des C++17-Standards, die weitere Implementierung der Funktionen des zukünftigen C++20-Standards (Codename C++2a), die Einbindung der D-Sprache in das Frontend und die teilweise Unterstützung von OpenMP 5.0 aus , nahezu vollständige Unterstützung für OpenACC 2.5, Erhöhung der Skalierbarkeit interprozeduraler Optimierungen und Optimierungen in der Bindungsphase, Erweiterung der Diagnosetools und Hinzufügung neuer Warnungen, Backends für OpenRISC, C-SKY V2 und AMD GCN GPU.

Haupt- Veränderungen:

  • Unterstützung für die Programmiersprache D hinzugefügt. GCC enthält ein Frontend mit einem Compiler GDC (Gnu D Compiler) und Laufzeitbibliotheken (libphobos), die es Ihnen ermöglichen, Standard-GCC zum Erstellen von Programmen in der Programmiersprache D zu verwenden. Der Prozess der Aktivierung der D-Sprachunterstützung in GCC begann Damals im Jahr 2011, aber zog sich hin aufgrund der Notwendigkeit, den Code in Übereinstimmung mit den GCC-Anforderungen zu bringen, und aufgrund von Problemen bei der Übertragung von geistigen Eigentumsrechten an Digital Mars, das die Programmiersprache D entwickelt;
  • Am Codegenerator wurden Verbesserungen vorgenommen. Beispielsweise wurde die Verwendung verschiedener Strategien zur situationsabhängigen Erweiterung von Switch-Ausdrücken (Sprungtabelle, Bittest, Entscheidungsbaum) implementiert. Es wurde die Möglichkeit hinzugefügt, lineare Funktionen, die einen Switch-Ausdruck enthalten, mithilfe der Optimierung „-ftree-switch-conversion“ zu transformieren (z. B. eine Reihe von Bedingungen wie „Fall 2: how = 205; break; Fall 3: how = 305; break“) ;“ wird in „100 * how + 5“ umgewandelt;
  • Verbesserte interprozedurale Optimierungen. Die Inline-Bereitstellungseinstellungen wurden für moderne C++-Codebasen angepasst und um die neuen Parameter max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns und uninlined erweitert -Denkzeit. Verbesserte Genauigkeit und Aggressivität der Kalt-/Heißcode-Trennung. Verbesserte Skalierbarkeit für sehr große Übersetzungseinheiten (zum Beispiel beim Anwenden der Optimierung in der Verknüpfungsphase auf große Programme);
  • Der auf den Ergebnissen der Code-Profilierung basierende Optimierungsmechanismus (PGO – Profile-Guided Optimization) wurde verbessert, wodurch auf der Grundlage einer Analyse der Merkmale der Codeausführung ein optimalerer Code generiert wird. Zusammenfassungsoption "-fprofile-verwenden„ Enthält jetzt die Optimierungsmodi „-fversion-loops-for-strides“, „-floop-interchange“, „-floop-unroll-and-jam“ und „-ftree-loop-distribution“. Die Einbeziehung von Histogrammen mit Zählern in Dateien wurde entfernt, wodurch die Größe von Dateien mit Profilen reduziert wurde (Histogramme werden jetzt im laufenden Betrieb generiert, wenn Optimierungen während der Verknüpfung durchgeführt werden);
  • Erweiterte Linking-Time-Optimierungen (LTO). Vor der Ergebnisgenerierung wurde eine Vereinfachung der Typen vorgenommen, wodurch die Größe der LTO-Objektdateien deutlich reduziert, der Speicherverbrauch in der Bindungsphase reduziert und die Parallelisierung von Vorgängen verbessert werden konnte. Die Anzahl der Partitionen (-param lto-partitions) wurde von 32 auf 128 erhöht, was die Leistung auf Systemen mit einer großen Anzahl von CPU-Threads verbessert. Es wurde ein Parameter hinzugefügt, um die Anzahl der Optimierungsprozesse zu steuern
    „-param lto-max-streaming-parallelism“;

    Daraus ergeben sich im Vergleich zu GCC 8.3 die in GCC 9 eingeführten Optimierungen erlaubt Reduzieren Sie die Kompilierungszeit von Firefox 5 und LibreOffice 66 um etwa 6.2.3 %. Die Größe der Objektdateien verringerte sich um 7 %. Die Bindungszeit auf einer 8-Kern-CPU verringerte sich um 11 %. Die sequentielle Optimierungsphase der Verknüpfungsphase ist jetzt 28 % schneller und verbraucht 20 % weniger Speicher. Der Speicherverbrauch jedes Prozessors der parallelisierten LTO-Stufe sank um 30 %;

  • Die meisten parallelen Programmierspezifikationen sind für die Sprachen C, C++ und Fortran implementiert OpenACC 2.5, das Tools zum Auslagern von Vorgängen auf GPUs und spezialisierten Prozessoren wie NVIDIA PTX definiert;
  • Für C und C++ wurde eine teilweise Unterstützung des Standards implementiert Öffnen Sie MP 5.0 (Open Multi-Processing), das die API und Methoden zur Anwendung paralleler Programmiermethoden für C-, C++- und Fortran-Sprachen auf Multicore- und Hybridsystemen (CPU+GPU/DSP) mit gemeinsam genutztem Speicher und Vektorisierungseinheiten (SIMD) definiert. ;
  • Für die Sprache C wurden neue Warnungen hinzugefügt: „-Waddress-of-packed-member" (nicht ausgerichteter Zeigerwert auf ein gepacktes Mitglied einer Struktur oder Union) und
    «-Wabsoluter Wert" (Wenn beim Zugriff auf Funktionen zur Berechnung eines Absolutwerts eine passendere Funktion für das angegebene Argument vorhanden ist, sollte beispielsweise fabs(3.14) anstelle von abs(3.14) verwendet werden. Neue Warnungen für C++ hinzugefügt: „-Wdeprecated-copy“,
    „-Winit-list-lifetime“, „-Wredundant-move“, „-Wpessimizing-move“ und „-Wclass-conversion“. Viele bisher verfügbare Warnungen wurden erweitert;

  • Experimentelle Unterstützung für einen Teil des zukünftigen C-Sprachstandards mit dem Codenamen C2x hinzugefügt. Um die C2x-Unterstützung zu aktivieren, verwenden Sie die Optionen „-std=c2x“ und „-std=gnu2x“ (um GNU-Erweiterungen zu aktivieren). Der Standard befindet sich noch in einem frühen Entwicklungsstadium, daher wird von seinen Fähigkeiten nur der Ausdruck _Static_assert mit einem Argument unterstützt (_Static_assert mit zwei Argumenten ist in C11 standardisiert);
  • Die Unterstützung für den C++17-Standard wurde als stabil erklärt. Im Frontend sind die Sprachfunktionen von C++17 vollständig implementiert, und in libstdc++ sind die im Standard definierten Bibliotheksfunktionen nahezu vollständig implementiert.
  • Fortsetzung Implementierung Elemente des zukünftigen C++2a-Standards. Beispielsweise wurde die Möglichkeit hinzugefügt, Bereiche während der Initialisierung einzubeziehen, Erweiterungen für Lambda-Ausdrücke wurden implementiert, Unterstützung für leere Mitglieder von Datenstrukturen und wahrscheinliche/unwahrscheinliche Attribute wurde hinzugefügt, und die Möglichkeit, virtuelle Funktionen in bedingten Ausdrücken aufzurufen, wurde bereitgestellt , usw.
    Um die C++2a-Unterstützung zu aktivieren, verwenden Sie die Optionen „-std=c++2a“ und „-std=gnu++2a“. Bit- und Versions-Header-Dateien zu libstdc++ für die Funktionen C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible und std::type_identity, std::midpoint, std::lerp hinzugefügt , std::bind_front,
    std::visit, std::is_constant_evaluated und std::assume_aligned, Unterstützung für den Typ char8_t hinzugefügt, die Möglichkeit implementiert, das Präfix und Suffix von Zeichenfolgen zu überprüfen (starts_with, end_with);

  • Unterstützung für neue ARM-Prozessoren hinzugefügt
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE und Neoverse N1. Unterstützung für Anweisungen hinzugefügt, die in Armv8.3-A für die Arbeit mit komplexen Zahlen, Pseudozufallszahlengenerierung (rng) und Speicherkennzeichnung (memtag) eingeführt wurden, sowie Anweisungen zum Blockieren von Angriffen im Zusammenhang mit der spekulativen Ausführung und dem Betrieb der Verzweigungsvorhersageeinheit . Für die AArch64-Architektur wurde ein Schutzmodus hinzugefügt Schnittpunkte von Stack und Heap („-fstack-clash-protection“). Um die Funktionen der Armv8.5-A-Architektur zu nutzen, wurde die Option „-march=armv8.5-a“ hinzugefügt

  • Es enthält ein Backend zum Generieren von Code für AMD-GPUs basierend auf der GCN-Mikroarchitektur. Die Implementierung beschränkt sich derzeit auf die Kompilierung von Single-Thread-Anwendungen (Unterstützung für die Durchführung von Multi-Thread-Berechnungen über OpenMP und OpenACC wird später angeboten) und Unterstützung für GPU Fiji und Vega 10;
  • Neues Backend für Prozessoren hinzugefügt OpenRISC;
  • Backend für Prozessoren hinzugefügt C-SKY V2, hergestellt von der gleichnamigen chinesischen Firma für verschiedene Verbrauchergeräte;
  • Alle Befehlszeilenoptionen, die Bytewerte bedienen, unterstützen die Suffixe kb, KiB, MB, MiB, GB und GiB;
  • Umgesetzt Mit der Option „-flive-patching=[inline-only-static|inline-clone]“ können Sie eine sichere Kompilierung für Live-Patching-Systeme erreichen, da die Verwendung interprozeduraler (IPA) Optimierungen;
  • Option „--completion“ für eine differenzierte Steuerung der Optionsvervollständigung bei Verwendung von Bash hinzugefügt;
  • Die Diagnosetools bieten die Anzeige von Quelltextauszügen mit Angabe der Zeilennummer und der visuellen Kennzeichnung zugehöriger Informationen, wie z. B. Operandentypen. Um die Anzeige von Zeilennummern und Beschriftungen zu deaktivieren, stehen die Optionen „-fno-diagnostics-show-line-numbers“ und „-fno-diagnostics-show-labels“ zur Verfügung;

    Veröffentlichung der GCC 9-Compiler-Suite

  • Erweitert Tools zur Fehlerdiagnose im C++-Code, verbesserte Lesbarkeit von Informationen zu Fehlerursachen und Hervorhebung problematischer Parameter;

    Veröffentlichung der GCC 9-Compiler-Suite

  • Option „-fdiagnostics-format=json“ hinzugefügt, die die Generierung von Diagnoseausgaben im maschinenlesbaren Format (JSON) ermöglicht;
  • Neue Profilierungsoptionen „-fprofile-filter-files“ und „-fprofile-exclude-files“ hinzugefügt, um zu verarbeitende Quelldateien auszuwählen;
  • AddressSanitizer ermöglicht die Generierung eines kompakteren Verifizierungscodes für automatische Variablen, wodurch der Speicherverbrauch der zu prüfenden ausführbaren Datei reduziert wird.
  • Verbesserte Ausgabe in „-fopt-info» (Detaillierte Informationen zu hinzugefügten Optimierungen). Neue Präfixe „optimiert“ und „missed“ hinzugefügt, zusätzlich zum bisher verfügbaren Präfix „note“. Ausgabe von Informationen zur Entscheidungsfindung bei der Inline-Entfaltung und Vektorisierung von Zyklen hinzugefügt;
  • Die Option „-fsave-optimization-record“ wurde hinzugefügt. Wenn sie angegeben wird, speichert GCC die Datei SRCFILE.opt-record.json.gz mit einer Beschreibung von Entscheidungen über die Verwendung bestimmter Optimierungen. Die neue Option unterscheidet sich vom „-fopt-info“-Modus durch die Einbeziehung zusätzlicher Metadaten, wie Informationen zum Profil und Inline-Ketten;
  • Optionen „-fipa-stack-alignment“ und „-fipa-reference-addressable“ hinzugefügt, um die Stapelausrichtung und die Verwendung von Adressierungsmodi (nur Schreiben oder exaktes Lesen) für statische Variablen während interprozeduraler Optimierungen zu steuern;
  • Es werden neue integrierte Funktionen eingeführt, um die Attributbindung sowie das Verhalten im Zusammenhang mit der Verzweigungsvorhersage und der spekulativen Befehlsausführung zu steuern: „__builtin_has_attribute«,«__builtin_expect_with_probability" Und "__builtin_speculation_safe_value". Für Funktionen, Variablen und Typen wurde ein neues Attribut hinzugefügt Kopieren;
  • Für die Fortran-Sprache wurde vollständige Unterstützung für asynchrone Ein-/Ausgabe implementiert;
  • Die Unterstützung für die Plattformen Solaris 10 (*-*-solaris2.10) und Cell/BE (Cell Broadband Engine SPU) ist veraltet und wird in der nächsten Hauptversion entfernt. Die Unterstützung für Armv2-, Armv3-, Armv5- und Armv5E-Architekturen wurde eingestellt. Die Unterstützung für Intel MPX (Memory Protection Extensions) wurde eingestellt.

Source: opennet.ru

Kommentar hinzufügen