Wydanie zestawu kompilatorów GCC 9

Po roku rozwoju opublikowany wydanie darmowego zestawu kompilatorów GCC 9.1, pierwsze główne wydanie w nowej gałęzi GCC 9.x. Zgodnie z nowy schemat numerów wydań, w procesie rozwoju wykorzystano wersję 9.0, a na krótko przed wydaniem GCC 9.1, gałąź GCC 10.0 już się oddzieliła, na bazie której powstanie kolejne znaczące wydanie, GCC 10.1.

GCC 9.1 wyróżnia się stabilizacją obsługi standardu C++ 17, kontynuacją wdrażania możliwości przyszłego standardu C++ 20 (o nazwie kodowej C++ 2a), włączeniem frontendu dla języka D, częściową obsługą OpenMP 5.0 , prawie pełne wsparcie dla OpenACC 2.5, zwiększenie skalowalności optymalizacji międzyproceduralnych i optymalizacji na etapie wiązania, rozbudowa narzędzi diagnostycznych i dodanie nowych ostrzeżeń, backendy dla OpenRISC, C-SKY V2 i GPU AMD GCN.

Głównym zmiany:

  • Dodano obsługę języka programowania D. GCC zawiera nakładkę z kompilatorem GDC (Gnu D Compiler) i biblioteki wykonawcze (libphobos), które pozwalają na wykorzystanie standardowego GCC do budowania programów w języku programowania D. Proces włączania obsługi języka D w GCC zaczęła w 2011 r., ale wciągnięty na ze względu na konieczność dostosowania kodu do wymogów GCC oraz problemy z przeniesieniem praw własności intelektualnej na firmę Digital Mars rozwijającą język programowania D;
  • Wprowadzono ulepszenia w generatorze kodu. Na przykład zaimplementowano zastosowanie różnych strategii rozwijania wyrażeń Switch (tabela skoków, test bitowy, drzewo decyzyjne) w zależności od sytuacji. Dodano możliwość przekształcania funkcji liniowych zawierających wyrażenie Switch przy użyciu optymalizacji „-ftree-switch-conversion” (na przykład zestaw warunków takich jak „przypadek 2: jak = 205; przerwa; przypadek 3: jak = 305; przerwa ;” zostanie zamienione na „100 * jak + 5”;
  • Ulepszone optymalizacje międzyproceduralne. Ustawienia wdrażania inline zostały dostosowane do nowoczesnych baz kodu C++ i rozszerzone o nowe parametry max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns i uninlined -czas na przemyślenia. Poprawiona dokładność i agresywność separacji zimnego/gorącego kodu. Poprawiona skalowalność dla bardzo dużych jednostki tłumaczeniowe (na przykład przy stosowaniu optymalizacji na etapie łączenia z dużymi programami);
  • Udoskonalono mechanizm optymalizacji bazujący na wynikach profilowania kodu (PGO - Profile-guided optymalizacji), który generuje bardziej optymalny kod na podstawie analizy charakterystyk wykonania kodu. Opcja podsumowania „-f-użycie-profilu„ zawiera teraz tryby optymalizacji „-fversion-loops-for-stride”, „-floop-interchange”, „-floop-unroll-and-jam” i „-ftree-loop-distribution”. Usunięto dołączanie histogramów z licznikami do plików, co zmniejszyło rozmiar plików z profilami (histogramy są teraz generowane na bieżąco podczas optymalizacji podczas łączenia);
  • Ulepszone optymalizacje czasu łączenia (LTO). Przed wygenerowaniem wyniku zapewniono uproszczenie typów, co pozwoliło znacznie zmniejszyć rozmiar plików obiektowych LTO, zmniejszyć zużycie pamięci na etapie wiązania i poprawić zrównoleglenie operacji. Zwiększono liczbę partycji (-param lto-partitions) z 32 do 128, co poprawia wydajność w systemach z dużą liczbą wątków procesora. Dodano parametr umożliwiający kontrolę liczby procesów optymalizatora
    "-param lto-max-równoległość-strumienia";

    W rezultacie, w porównaniu do GCC 8.3, optymalizacje wprowadzone w GCC 9 dozwolony skrócić czas kompilacji Firefoksa 5 i LibreOffice 66 o około 6.2.3%. Rozmiar plików obiektowych zmniejszył się o 7%. Czas wiązania na 8-rdzeniowym procesorze skrócił się o 11%. Etap optymalizacji sekwencyjnej etapu łączenia jest teraz o 28% szybszy i zużywa o 20% mniej pamięci. Zużycie pamięci każdego procesora w fazie równoległej LTO spadło o 30%;

  • Większość specyfikacji programowania równoległego jest zaimplementowana dla języków C, C++ i Fortran OpenACC 2.5, który definiuje narzędzia do odciążania operacji na procesorach graficznych i wyspecjalizowanych procesorach, takich jak NVIDIA PTX;
  • Częściowa obsługa standardu została zaimplementowana dla języków C i C++ Otwarte MP 5.0 (Open Multi-Processing), który definiuje API i metody stosowania metod programowania równoległego dla języków C, C++ i Fortran na systemach wielordzeniowych i hybrydowych (CPU+GPU/DSP) z pamięcią współdzieloną i jednostkami wektoryzacji (SIMD) ;
  • Dodano nowe ostrzeżenia dla języka C: "-Adres-członka-spakowanego" (niewyrównana wartość wskaźnika do spakowanego elementu struktury lub unii) i
    «-Wwartość-absolutna" (podczas uzyskiwania dostępu do funkcji obliczania wartości bezwzględnej, jeśli dla określonego argumentu istnieje bardziej odpowiednia funkcja, na przykład, zamiast abs(3.14) należy użyć fabs(3.14). Dodano nowe ostrzeżenia dla C++: "-Wdeprecated-copy",
    „-Winit-list-lifetime”, „-Wredundant-move”, „-Wpessimizing-move” i „-Wclass-conversion”. Wiele wcześniej dostępnych ostrzeżeń zostało rozszerzonych;

  • Dodano eksperymentalne wsparcie dla części przyszłego standardu języka C o nazwie kodowej C2x. Aby włączyć obsługę C2x, użyj opcji „-std=c2x” i „-std=gnu2x” (aby włączyć rozszerzenia GNU). Standard jest wciąż na wczesnym etapie rozwoju, dlatego też swoich możliwości obsługiwane jest jedynie wyrażenie _Static_assert z jednym argumentem (_Static_assert z dwoma argumentami jest standaryzowane w C11);
  • Wsparcie dla standardu C++17 zostało uznane za stabilne. W frontendzie możliwości językowe C++17 są w pełni zaimplementowane, a w libstdc++ funkcje biblioteczne zdefiniowane w standardzie są bliskie pełnej implementacji;
  • Nieprzerwany wdrożenie elementy przyszłego standardu C++2a. Przykładowo dodano możliwość uwzględniania zakresów podczas inicjalizacji, zaimplementowano rozszerzenia wyrażeń lambda, dodano obsługę pustych składowych struktur danych oraz prawdopodobnych/mało prawdopodobnych atrybutów, zapewniono możliwość wywoływania funkcji wirtualnych w wyrażeniach warunkowych itp.
    Aby włączyć obsługę C++2a, użyj opcji „-std=c++2a” i „-std=gnu++2a”. Dodano pliki nagłówkowe bitów i wersji do libstdc++ dla cech C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity, funkcje std::midpoint, std::lerp , std::bind_front,
    std::visit, std::is_constant_evaluated i std::assume_aligned, dodano obsługę typu char8_t, zaimplementowano możliwość sprawdzania prefiksu i sufiksu ciągów (starts_with, end_with);

  • Dodano obsługę nowych procesorów ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE i Neoverse N1. Dodano obsługę instrukcji wprowadzonych w Armv8.3-A do pracy z liczbami zespolonymi, generowania liczb pseudolosowych (rng) i znakowania pamięci (memtag), a także instrukcji blokowania ataków związanych z wykonaniem spekulatywnym i działaniem jednostki przewidywania rozgałęzień . Dla architektury AArch64 dodano tryb ochrony przecięcia stosu i sterty („-fstack-ochrona przed kolizją”). Aby móc korzystać z funkcji architektury Armv8.5-A, dodano opcję „-march=armv8.5-a”

  • Zawiera backend do generowania kodu dla procesorów graficznych AMD w oparciu o mikroarchitekturę GCN. Implementacja ogranicza się obecnie do kompilacji aplikacji jednowątkowych (obsługa wykonywania obliczeń wielowątkowych poprzez OpenMP i OpenACC zostanie zaoferowana w późniejszym terminie) oraz wsparcia dla GPU Fiji i Vega 10;
  • Dodano nowy backend dla procesorów OpenRISC;
  • Dodano backend dla procesorów C-SKY V2, produkowany przez chińską firmę o tej samej nazwie dla różnych urządzeń konsumenckich;
  • Wszystkie opcje wiersza poleceń obsługujące wartości bajtów obsługują przyrostki kb, KiB, MB, MiB, GB i GiB;
  • Wdrożone opcja „-flive-patching=[inline-only-static|inline-clone]” pozwala na osiągnięcie bezpiecznej kompilacji dla systemów live-patching dzięki wielopoziomowej kontroli nad wykorzystaniem międzyproceduralnych (“近期行動計劃”) optymalizacje;
  • Dodano opcję „--completion” w celu szczegółowej kontroli uzupełniania opcji podczas korzystania z basha;
  • Narzędzia diagnostyczne wyświetlają fragmenty tekstu źródłowego, wskazując numer wiersza i wizualnie zaznaczając powiązane informacje, takie jak typy argumentów. Aby wyłączyć wyświetlanie numerów linii i etykiet, dostępne są opcje „-fno-diagnostics-show-line-numbers” i „-fno-diagnostics-show-labels”;

    Wydanie zestawu kompilatorów GCC 9

  • Rozszerzony narzędzia do diagnozowania błędów w kodzie C++, poprawiona czytelność informacji o przyczynach błędów i wyróżnianie problematycznych parametrów;

    Wydanie zestawu kompilatorów GCC 9

  • Dodano opcję „-fdiagnostics-format=json”, która umożliwia generowanie wyników diagnostycznych w formacie do odczytu maszynowego (JSON);
  • Dodano nowe opcje profilowania „-fprofile-filter-files” i „-fprofile-exclude-files” w celu wybrania plików źródłowych do przetworzenia;
  • AddressSanitizer zapewnia generowanie bardziej zwartego kodu weryfikacyjnego dla zmiennych automatycznych, co zmniejsza zużycie pamięci sprawdzanego pliku wykonywalnego;
  • Ulepszone wyjście w „-fopt-informacje» (szczegółowe informacje o dodanych optymalizacjach). Dodano nowe przedrostki „zoptymalizowany” i „pominięte”, oprócz wcześniej dostępnego przedrostka „uwaga”. Dodano dane wyjściowe dotyczące podejmowania decyzji dotyczących rozwijania inline i wektoryzacji cykli;
  • Dodano opcję „-fsave-optimization-record”, jeśli jest określona, ​​GCC zapisuje plik SRCFILE.opt-record.json.gz z opisem decyzji dotyczących zastosowania określonych optymalizacji. Nowa opcja różni się od trybu „-fopt-info” dołączeniem dodatkowych metadanych, takich jak informacje o profilu i łańcuchach inline;
  • Dodano opcje „-fipa-stack-alignment” i „-fipa-reference-addressable” do kontrolowania wyrównania stosu i użycia trybów adresowania (tylko do zapisu lub dokładnego odczytu) dla zmiennych statycznych podczas optymalizacji międzyproceduralnych;
  • Wprowadzono nowe wbudowane funkcje sterujące powiązaniem atrybutów oraz zachowaniem związanym z przewidywaniem rozgałęzień i wykonywaniem instrukcji spekulatywnych: "__builtin_has_attribute","__builtin_expect_with_prawdopodobieństwem" I "__builtin_speculation_safe_value„. Dodano nowy atrybut dla funkcji, zmiennych i typów kopia;
  • Dla języka Fortran zaimplementowano pełną obsługę asynchronicznego wejścia/wyjścia;
  • Obsługa platform Solaris 10 (*-*-solaris2.10) i Cell/BE (Cell Broadband Engine SPU) jest przestarzała i zostanie usunięta w następnej wersji głównej. Zakończono obsługę architektur Armv2, Armv3, Armv5 i Armv5E. Zakończono obsługę technologii Intel MPX (Memory Protection Extensions).

Źródło: opennet.ru

Dodaj komentarz