Lanzamiento del conjunto de compiladores GCC 9

Después de un año de desarrollo publicado lanzamiento de un conjunto gratuito de compiladores GCC 9.1, la primera versión importante de la nueva rama GCC 9.x. De acuerdo con nuevo esquema números de versión, en el proceso de desarrollo se utilizó la versión 9.0, y poco antes del lanzamiento de GCC 9.1, la rama GCC 10.0 ya se había dividido, sobre la base de la cual se formaría la próxima versión importante, GCC 10.1.

GCC 9.1 se destaca por estabilizar el soporte para el estándar C++ 17, continuar implementando las capacidades del futuro estándar C++ 20 (con nombre en código C++ 2a), inclusión en la interfaz del lenguaje D, soporte parcial para OpenMP 5.0 , soporte casi completo para OpenACC 2.5, aumento de la escalabilidad de las optimizaciones entre procedimientos y optimizaciones en la etapa de enlace, expansión de las herramientas de diagnóstico y adición de nuevas advertencias, backends para OpenRISC, C-SKY V2 y GPU AMD GCN.

El principal cambios:

  • Se agregó soporte para el lenguaje de programación D. GCC incluye una interfaz con un compilador GDC (Gnu D Compiler) y bibliotecas de tiempo de ejecución (libphobos), que le permiten utilizar GCC estándar para crear programas en el lenguaje de programación D. El proceso de habilitación del soporte del lenguaje D en GCC comenzó en 2011, pero prolongado debido a la necesidad de adaptar el código a los requisitos del GCC y problemas con la transferencia de derechos de propiedad intelectual a Digital Mars, que está desarrollando el lenguaje de programación D;
  • Se han realizado mejoras en el generador de código. Por ejemplo, se ha implementado el uso de diferentes estrategias para expandir expresiones Switch (tabla de salto, prueba de bits, árbol de decisión) dependiendo de las situaciones. Se agregó la capacidad de transformar funciones lineales que incluyen una expresión Switch usando la optimización “-ftree-switch-conversion” (por ejemplo, un conjunto de condiciones como “caso 2: cómo = 205; interrupción; caso 3: cómo = 305; interrupción ;” se convertirá en "100 * cómo + 5";
  • Optimizaciones interprocedimientos mejoradas. La configuración de implementación en línea se ha adaptado para las bases de código C++ modernas y se ha ampliado con nuevos parámetros max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns y uninlined. -thunk-tiempo. Precisión y agresividad mejoradas en la separación de códigos fríos/calientes. Escalabilidad mejorada para muy grandes unidades de traducción (por ejemplo, al aplicar la optimización en la etapa de vinculación a programas grandes);
  • Se ha mejorado el mecanismo de optimización basado en los resultados del perfilado de código (PGO - Optimización guiada por perfiles), que genera un código más óptimo basado en un análisis de las características de ejecución del código. Opción de resumen "-fprofile-uso" ahora incluye los modos de optimización "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" y "-ftree-loop-distribution". Se eliminó la inclusión de histogramas con contadores en los archivos, lo que redujo el tamaño de los archivos con perfiles (los histogramas ahora se generan sobre la marcha cuando se realizan optimizaciones durante la vinculación);
  • Optimizaciones mejoradas del tiempo de vinculación (LTO). Se proporcionó una simplificación de tipos antes de generar el resultado, lo que permitió reducir significativamente el tamaño de los archivos de objetos LTO, reducir el consumo de memoria en la etapa de vinculación y mejorar la paralelización de las operaciones. El número de particiones (-param lto-partitions) se ha aumentado de 32 a 128, lo que mejora el rendimiento en sistemas con una gran cantidad de subprocesos de CPU. Se ha agregado un parámetro para controlar el número de procesos del optimizador.
    "-param lto-max-streaming-paralelismo";

    Como resultado, en comparación con GCC 8.3, las optimizaciones introducidas en GCC 9 permitido reducir el tiempo de compilación de Firefox 5 y LibreOffice 66 en aproximadamente un 6.2.3%. El tamaño de los archivos objeto disminuyó en un 7%. El tiempo de vinculación en una CPU de 8 núcleos disminuyó en un 11%. La etapa de optimización secuencial de la etapa de vinculación ahora es un 28 % más rápida y consume un 20 % menos de memoria. El consumo de memoria de cada procesador de la etapa paralelizada de LTO disminuyó en un 30%;

  • La mayor parte de las especificaciones de programación paralela están implementadas para los lenguajes C, C++ y Fortran. AbiertoACC 2.5, que define herramientas para descargar operaciones en GPU y procesadores especializados como NVIDIA PTX;
  • Se ha implementado soporte parcial para el estándar para C y C++. Open MP 5.0 (Open Multi-Processing), que define la API y los métodos de aplicación de métodos de programación paralela para lenguajes C, C++ y Fortran en sistemas multinúcleo e híbridos (CPU+GPU/DSP) con memoria compartida y unidades de vectorización (SIMD). ;
  • Se han agregado nuevas advertencias para el lenguaje C: "-Waddress-de-miembro-empaquetado" (valor de puntero no alineado a un miembro empaquetado de una estructura o unión) y
    «-Wabsoluto-valor" (al acceder a funciones para calcular un valor absoluto, si hay una función más adecuada para el argumento especificado, por ejemplo, se debe usar fabs(3.14) en lugar de abs(3.14). Nuevas advertencias agregadas para C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" y "-Wclass-conversion". Se han ampliado muchas advertencias disponibles anteriormente;

  • Se agregó soporte experimental para parte del futuro estándar del lenguaje C, cuyo nombre en código es C2x. Para habilitar la compatibilidad con C2x, use las opciones "-std=c2x" y "-std=gnu2x" (para habilitar las extensiones GNU). El estándar aún se encuentra en una etapa temprana de desarrollo, por lo tanto, de sus capacidades, solo se admite la expresión _Static_assert con un argumento (_Static_assert con dos argumentos está estandarizada en C11);
  • Se ha declarado estable el soporte para el estándar C++17. En la interfaz, las capacidades del lenguaje C++ 17 están completamente implementadas, y en libstdc++, las funciones de la biblioteca definidas en el estándar están cerca de la implementación completa;
  • Continuado implementación elementos del futuro estándar C++2a. Por ejemplo, se agregó la capacidad de incluir rangos durante la inicialización, se implementaron extensiones para expresiones lambda, se agregó soporte para miembros vacíos de estructuras de datos y atributos probables/improbables, se proporcionó la capacidad de llamar a funciones virtuales en expresiones condicionales. , etc.
    Para habilitar la compatibilidad con C++2a, utilice las opciones "-std=c++2a" y "-std=gnu++2a". Se agregaron archivos de encabezado de versión y bits a libstdc++ para C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible y std::type_identity traces, std::midpoint, std::lerp. , std::bind_front,
    std::visit, std::is_constant_evaluated y std::assume_aligned, soporte agregado para el tipo char8_t, implementó la capacidad de verificar el prefijo y sufijo de cadenas (empieza_con, termina_con);

  • Se agregó soporte para nuevos procesadores ARM.
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE y Neoverse N1. Se agregó soporte para instrucciones introducidas en Armv8.3-A para trabajar con números complejos, generación de números pseudoaleatorios (rng) y etiquetado de memoria (memtag), así como instrucciones para bloquear ataques relacionados con la ejecución especulativa y el funcionamiento de la unidad de predicción de ramas. . Para la arquitectura AArch64, se ha agregado un modo de protección. intersecciones de pila y montón (“-fstack-clash-protection”). Para utilizar las funciones de la arquitectura Armv8.5-A, se ha agregado la opción “-march=armv8.5-a”

  • Incluye un backend para generar código para GPU AMD basado en la microarquitectura GCN. La implementación se limita actualmente a la compilación de aplicaciones de un solo subproceso (más adelante se ofrecerá soporte para realizar cálculos de múltiples subprocesos a través de OpenMP y OpenACC) y soporte para GPU Fiji y Vega 10;
  • Se agregó un nuevo backend para procesadores. AbiertoRISC;
  • Backend agregado para procesadores. C-SKY V2, producido por la empresa china del mismo nombre para varios dispositivos de consumo;
  • Todas las opciones de línea de comando que operan valores de bytes admiten los sufijos kb, KiB, MB, MiB, GB y GiB;
  • Implementado la opción “-flive-patching=[inline-only-static|inline-clone]” le permite lograr una compilación segura para sistemas de parcheo en vivo debido al control multinivel sobre el uso de interprocedimiento (IPA) optimizaciones;
  • Se agregó la opción "--completion" para un control detallado de la finalización de opciones cuando se usa bash;
  • Las herramientas de diagnóstico proporcionan visualizaciones de extractos del texto fuente que indican el número de línea y marcan visualmente la información relacionada, como los tipos de operandos. Para deshabilitar la visualización de números de línea y etiquetas, se proporcionan las opciones “-fno-diagnostics-show-line-numbers” y “-fno-diagnostics-show-labels”;

    Lanzamiento del conjunto de compiladores GCC 9

  • Expandido herramientas para diagnosticar errores en código C++, legibilidad mejorada de la información sobre las causas de los errores y resaltado de parámetros problemáticos;

    Lanzamiento del conjunto de compiladores GCC 9

  • Se agregó la opción “-fdiagnostics-format=json”, que permite generar resultados de diagnóstico en formato legible por máquina (JSON);
  • Se agregaron nuevas opciones de creación de perfiles “-fprofile-filter-files” y “-fprofile-exclude-files” para seleccionar los archivos de origen que se procesarán;
  • AddressSanitizer proporciona generación de código de verificación más compacto para variables automáticas, lo que reduce el consumo de memoria del archivo ejecutable que se está verificando;
  • Salida mejorada en "-fopt-info» (información detallada sobre optimizaciones agregadas). Se agregaron nuevos prefijos "optimizado" y "perdido", además del prefijo "nota" disponible anteriormente. Se agregó salida de información sobre la toma de decisiones sobre el despliegue en línea y la vectorización de ciclos;
  • Se agregó la opción "-fsave-optimization-record", cuando se especifica, GCC guarda el archivo SRCFILE.opt-record.json.gz con una descripción de las decisiones sobre el uso de ciertas optimizaciones. La nueva opción se diferencia del modo “-fopt-info” al incluir metadatos adicionales, como información sobre el perfil y cadenas en línea;
  • Se agregaron opciones “-fipa-stack-alignment” y “-fipa-reference-addressable” para controlar la alineación de la pila y el uso de modos de direccionamiento (solo escritura o lectura exacta) para variables estáticas durante optimizaciones entre procedimientos;
  • Se introducen nuevas funciones integradas para controlar la vinculación de atributos, así como el comportamiento relacionado con la predicción de bifurcaciones y la ejecución de instrucciones especulativas: "__builtin_has_attribute","__incorporado_esperar_con_probabilidad" Y "__builtin_speculación_valor_seguro". Se ha agregado un nuevo atributo para funciones, variables y tipos. copia;
  • Se ha implementado soporte completo para entrada/salida asincrónica para el lenguaje Fortran;
  • La compatibilidad con las plataformas Solaris 10 (*-*-solaris2.10) y Cell/BE (Cell Broadband Engine SPU) ha quedado obsoleta y se eliminará en la próxima versión principal. Se ha interrumpido la compatibilidad con las arquitecturas Armv2, Armv3, Armv5 y Armv5E. Se ha interrumpido la compatibilidad con Intel MPX (Extensiones de protección de memoria).

Fuente: opennet.ru

Añadir un comentario