После года разработки увидел свет (https://gcc.gnu.org/) релиз свободного набора компиляторов GCC 5.1 (https://gcc.gnu.org/gcc-5/), первый значительный выпуск в новой ветке GCC 5.x. Новый выпуск примечателен возможностью работы в роли JIT-компилятора, интеграцией системы оптимизации AutoFDO, поддержкой OpenMP 4.0 и OpenACC 2.0 для offloading-вычислений, применением по умолчанию стандарта GNU11 (C11), поддержкой интерфейса параллельного программирования Cilk Plus, полной поддержкой стандарта C++11 и экспериментальной поддержкой C++14.
Основные изменения (https://gcc.gnu.org/gcc-5/changes.html):
- Для языка Си вместо gnu89 (-std=gnu89) по умолчанию активирован режим gnu11 (-std=gnu11) на базе стандарта C11.
- В runtime-библиотеке C++ (libstdc++) обеспечена (https://gcc.gnu.org/onlinedocs/gcc-5.1.0/libstdc++/manual/ma... полная поддержка стандарта C++11, а также экспериментальная поддержка стандарта C++14 и спецификаций Library Fundamentals TS (http://en.cppreference.com/w/cpp/experimental). Задействован по умолчанию новый ABI, а также новые реализации std::string и std::list. Возможность использования старого ABI сохранена, для этого нужно установить в 0 макрос _GLIBCXX_USE_CXX11_ABI перед включением в заголовочного файла;
- Генератор кода может быть собран в виде разделяемой библиотеки libgccjit (https://gcc.gnu.org/wiki/JIT) и затем встроен в другие процессы и использован для организации JIT-компиляции байткода в машинный код. Кроме предоставляемого библиотекой C API и обёртки для C++, подготовлены биндинги для языков Python и D. В качестве возможных областей применения отмечается использование libgccjit в интерпретаторах для компиляции функций из байткода в машинный код или для организации упреждающей компиляции (ahead-of-time);
- Многочисленные улучшения (http://hubicka.blogspot.ru/2015/04/GCC5-IPA-LTO-news.html) оптимизатора. В том числе добавлен новый режим оптимизации на основе обратной связи - AutoFDO (https://gcc.gnu.org/wiki/AutoFDO) (Automatic Feedback Directed Optimizer), который использует счетчики производительности (performance counters) ядра Linux в качестве источника информации о производительности различных частей программы.
Сокращено потребление памяти и время связывания при включении оптимизаций во время динамического связывания (LTO, Link Time Optimization). В реализацию межпроцедурных оптимизаций добавлен новый проход ICF (Identical Code Folding), нацеленный на более качественное объединение идентичных блоков кода.
- В компиляторах C, C++ и Fortran реализованы средства OpenMP 4.0 (Open Multi-Processing) для ускорения вычислений за счёт выноса операций (offloading (https://gcc.gnu.org/wiki/Offloading)) на специализированные процессоры. Готовая runtime-библиотека и эмулятор представлены для акселераторов Intel Xeon Phi (Intel MIC). Для выноса операций на GPU представлена предварительная реализация спецификации OpenACC 2.0a (https://gcc.gnu.org/wiki/OpenACC);
- Реализована полноценная поддержка набора расширений Cilk Plus (https://www.cilkplus.org/), предлагающего новую эффективную методику параллельного программирования для языков Си и Си++, позволяющую существенно упростить разработку программ, части которых выполняются параллельно с задействованием разных процессорных ядер и векторных сопроцессоров (Vector Units). Для управления генерацией кода с улучшенной векторизацией предусмотрена pragma simd. Поддерживается два метода увеличения производительности - параллелизм данных и параллельное выполнение подпрограмм. В первом случае, обеспечиваются механизмы прозрачного распараллеливания типовых операций над массивами данных и автоматическое задействование SIMD-инструкций. Для организации параллелизма на уровне подпрограмм в обиход вводится три ключевых слова: _Cilk_spawn - запуск функции в параллельном режиме, _Cilk_sync - ожидание завершения параллельно выполняемой функции, и _Cilk_for - организация работы цикла в параллельном режиме.
- Возможность включения заголовочных файлов, только если они присутствуют в системе. Для проверки наличия заголовочного файла представлены директивы препроцессора __has_include и __has_include_next;
- Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.4.2;
- Добавлена поддержка векторных инструкций AVX-512 (http://en.wikipedia.org/wiki/AVX-512), которые появятся в будущих выпусках процессоров Intel на базе новой микроархитектуры Skylake;
- Добавлена поддержка процессоров ARM Cortex-A72, Cavium ThunderX и Applied Micro X-Gene 1. Улучшена генерация кода для 64-разрядной архитектуры ARM (AArch64) с учётом специфики процессоров Cortex-A57 и Cortex-A53.
- Поддержка архитектуры MIPS третьего, пятого и шестого поколения, в том числе процессоров Cavium Octeon 3 и Imagination P5600;
URL: https://gcc.gnu.org/
Новость: http://www.opennet.dev/opennews/art.shtml?num=42087