Основные темы, по которым ведутся работы в группе:
- Статические компиляторы (на основе Clang/LLVM и GCC):
- Разработка/улучшение машинно-зависимых оптимизаций в компиляторе с учетом специфических особенностей процессорных архитектур и их расширений (ARM, PowerPC, RISC-V, x86_64 и др., а также GPU/NPU).
- Добавление поддержки новых процессорных архитектур (или улучшение поддержки для существующих) в промышленных компиляторах GCC, Clang/LLVM.
- Создание полного набора инструментов для разработки (toolchain) для новых процессорных архитектур, включающего в себя оптимизирующий компилятор, компоновщик, отладчик, стандартную библиотеку.
- Безопасная компиляция:
- Разработка безопасного компилятора, предотвращающего появление уязвимостей в программе при выполнении агрессивных оптимизаций кода.
- Разработка и улучшение методов повышения уровня защищенности генерируемого компилятором кода, комбинирующих статические (на этапе компиляции) и динамические (во время выполнения) подходы к предотвращению известных уязвимостей. Применяемые в данный момент методы включают в себя более строгие предупреждения о неопределенном поведении, санитайзеры, защиту стека, рандомизацию адресного пространства и др.
- Динамические (JIT) компиляторы для различных языков и сред исполнения (Java, JavaScript, SQL):
- Оптимизации в JIT-компиляторах, виртуальных машинах.
- Разработка динамического компилятора для языков высокого уровня на основе LLVM JIT.
- Инструменты:
- Разработка инструментов для анализа производительности, эффективности использования памяти и кэша (для платформы ARM).
- Автоматическая настройка компиляторных оптимизаций для улучшения производительности и размера кода.
- Использование информации о трассах выполнения для уточнения оптимизаций, основанных на профиле (PGO) в LLVM.
- Инструмент для поиска гонок при параллельной сборке.
В ходе работы над проектами студенты приобретают следующие знания и навыки:
- Внутреннее устройство компилятора.
- Написание оптимизационного прохода в одном из компиляторов LLVM, GCC или оптимизации для виртуальной машины среды выполнения языка Java/JavaScript.
- Анализ сгенерированного компилятором кода, сопоставление с промежуточным кодом, и улучшение оптимизаций/кодогенерации в компиляторе на основе анализа.
- Углубленные знания о процессорных архитектурах, языке ассемблера, соглашениях о вызовах.
Темы исследовательских работ для студентов на 2023-2024 уч. г. будут предложены в рамках одной из следующих задач:
- Разработка графового компилятора для NPU на основе инфраструктуры MLIR. MLIR (Multi-Level Intermediate Representation) – расширяемый фреймворк для написания компиляторов, предоставляющий универсальную инфраструктуру работы с кодом промежуточного представления и позволяющий производить оптимизации, недоступные классическому компилятору. Одна из наиболее перспективных областей применения MLIR – компиляторы для нейронных сетей, позволяющие значительно уменьшить время исполнения нейронной сети на конечном устройстве. Ключевая цель заключается в изучении способа эффективной компиляции нейронных сетей для NPU при помощи инфраструктуры MLIR.
- Исследование и реализация методов статического анализа кода на языке описания аппаратуры SystemVerilog с использованием инфраструктуры MLIR. В основе промышленного маршрута проектирования цифровых СБИС лежит язык SystemVerilog и основанная на нем методология верификации UVM (Universal Verification Methodology). Целью является создание базовых программных инструментов для работы с SystemVerilog-описаниями — средств трансляции и статического анализа кода на основе инфраструктуры MLIR/CIRCT. Система статического анализа предназначена для проверки проекта на наличие типовых ошибок (нарушений синтаксических и семантических свойств) и построения промежуточного представления, допускающего трансляцию в разные форматы для последующего использования в симуляторах, инструментах синтеза, средствах имитационной и формальной верификации.
- Безопасный компилятор SAFEC. В рамках данного проекта ведется разработка безопасного компилятора, предотвращающего появление уязвимостей в программе при выполнении агрессивных оптимизаций кода. Кроме того, ведется разработка и улучшение методов повышения уровня защищенности генерируемого компилятором кода, комбинирующих статические (на этапе компиляции) и динамические (во время выполнения) подходы к предотвращению известных уязвимостей. Применяемые в данный момент методы включают в себя более строгие предупреждения о неопределенном поведении, санитайзеры, защиту стека, рандомизацию адресного пространства и др.
Примеры тем исследовательских работ студентов в 2022-2023 уч. г.:
- Переупорядочивание функций в больших приложениях для улучшения локальности кода. Эта задача включает в себя снятие частичных трасс выполнения через аппаратные счётчики и интерфейс perf на Linux, поиск эвристик для определения порядка функций, который минимизировал бы промахи в кеше инструкций и трансляции страниц (iTLB), и реализацию переупорядочивания функций для стандартного тулчейна (GCC + Binutils).
- Обнаружение случаев неопределенного поведения в языке Си при использовании функций семейства setjmp. Программы на языке Си могут вызывать необычные функции setjmp и vfork, которые возвращают управление в точку вызова более одного раза (setjmp возвращается второй раз, принимая управление от longjmp, а vfork возвращает управление сначала в дочернем процессе, затем в родительском). Типичной ошибкой при использовании таких функций является использование обычных стековых переменных, которые живы в момент «второго возврата», так как для них не гарантируется сохранение значений. Задача — улучшить качество предупреждений, выдаваемых компилятором GCC на подобные ошибки.
- Инструмент для поиска гонок при параллельной сборке. Если в Makefile не указаны некоторые зависимости промежуточных файлов друг от друга, то возможны ситуации, когда при последовательной сборке проект всегда собирается успешно, а при параллельной сборке — нет, причём ошибки сборки могут возникать недетерминированно. В этой задаче предлагалось разработать инструмент детерминированного поиска таких гонок за счёт сопоставления графа зависимостей в Makefile и потенциально конфликтующих доступов к файловой системе.
Open source проекты, разработанные группой:
- parmasan — a parallel make sanitizer — https://github.com/ispras/parmasan
- libosuction — a tool for stripping dynamic libraries of unneeded symbols — https://github.com/ispras/libosuction
- LLV8 — an experimental top-tier compiler for V8 JavaScript Engine — https://github.com/ispras/llv8
- Tool for Automatic Compiler Tuning (TACT) — https://github.com/ispras/tact
- PostgreSQL with JIT compiler for expressions — https://github.com/ispras/postgres
- V8 JavaScript Engine with AOTC — https://github.com/ispras/v8-aotc
- Webkit with JavaScriptCore AOTB support — https://github.com/ispras/webkit-aotc
- GCC with extended modulo scheduling support — https://github.com/ispras/gcc-sms