Проекты:
- Оптимизация кодогенерации для платформы ARM.
- Разработка инструментов для анализа производительности, эффективности использования памяти и кэша (для платформы ARM).
- Автоматическая настройка компиляторных оптимизаций для улучшения производительности и размера кода.
- Оптимизации в JIT-компиляторах, виртуальных машинах.
- Разработка динамического компилятора для языков высокого уровня на основе LLVM JIT.
- Использование информации о трассах выполнения для уточнения оптимизаций, основанных на профиле (PGO) в LLVM.
В ходе работы над проектами студенты приобретают следующие знания и навыки:
- Внутреннее устройство компилятора.
- Написание оптимизационного прохода в одном из компиляторов LLVM, GCC или оптимизации для виртуальной машины среды выполнения языка Java/JavaScript.
- Анализ сгенерированного компилятором кода, сопоставление с промежуточным кодом, и улучшение оптимизаций/кодогенерации в компиляторе на основе анализа.
- Углубленные знания о процессорных архитектурах, языке ассемблера, соглашениях о вызовах.
Темы исследовательских работ студентов в 2022-2023 уч. г.:
- Переупорядочивание функций в больших приложениях для улучшения локальности кода. Эта задача включает в себя снятие частичных трасс выполнения через аппаратные счётчики и интерфейс perf на Linux, поиск эвристик для определения порядка функций, который минимизировал бы промахи в кеше инструкций и трансляции страниц (iTLB), и реализацию переупорядочивания функций для стандартного тулчейна (GCC + Binutils).
- Обнаружение случаев неопределенного поведения в языке Си при использовании функций семейства setjmp. Программы на языке Си могут вызывать необычные функции setjmp и vfork, которые возвращают управление в точку вызова более одного раза (setjmp возвращается второй раз, принимая управление от longjmp, а vfork возвращает управление сначала в дочернем процессе, затем в родительском). Типичной ошибкой при использовании таких функций является использование обычных стековых переменных, которые живы в момент «второго возврата», так как для них не гарантируется сохранение значений. Задача — улучшить качество предупреждений, выдаваемых компилятором GCC на подобные ошибки.
Open source проекты, разработанные группой:
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