Основные темы, по которым ведутся работы в группе:

  1. Статические компиляторы (на основе Clang/LLVM и GCC):
    • Разработка/улучшение машинно-зависимых оптимизаций в компиляторе с учетом специфических особенностей процессорных архитектур и их расширений (ARM, PowerPC, RISC-V, x86_64 и др., а также GPU/NPU).
    • Добавление поддержки новых процессорных архитектур (или улучшение поддержки для существующих) в промышленных компиляторах GCC, Clang/LLVM.
    • Создание полного набора инструментов для разработки (toolchain) для новых процессорных архитектур, включающего в себя оптимизирующий компилятор, компоновщик, отладчик, стандартную библиотеку.
  2. Безопасная компиляция:
    • Разработка безопасного компилятора, предотвращающего появление уязвимостей в программе при выполнении агрессивных оптимизаций кода.
    • Разработка и улучшение методов повышения уровня защищенности генерируемого компилятором кода, комбинирующих статические (на этапе компиляции) и динамические (во время выполнения) подходы к предотвращению известных уязвимостей. Применяемые в данный момент методы включают в себя более строгие предупреждения о неопределенном поведении, санитайзеры, защиту стека, рандомизацию адресного пространства и др.
  3. Динамические (JIT) компиляторы для различных языков и сред исполнения (Java, JavaScript, SQL):
    • Оптимизации в JIT-компиляторах, виртуальных машинах.
    • Разработка динамического компилятора для языков высокого уровня на основе LLVM JIT.
  4. Инструменты:
    • Разработка инструментов для анализа производительности, эффективности использования памяти и кэша (для платформы 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 проекты, разработанные группой: