V.E.L.O.C.I.T.Y.-OS: JIT и SCE... Заметка
DEV Community на русском

V.E.L.O.C.I.T.Y.-OS: JIT и SCEV-Lite для машинного кода x86-64 (Часть 6)

Автор создает высокопроизводительную операционную систему под названием V.E.L.O.C.I.T.Y.-OS, цель которой — полностью работать в L3-кэше процессора. Для достижения максимальной скорости скалярных операций он теперь компилирует блоки абстрактных синтаксических деревьев (AST) непосредственно в необработанные машинные инструкции x86-64 во время выполнения. Этот подход позволяет избежать накладных расходов на цепочки замыканий, которые ранее были узким местом для не очень больших вычислений. Он разработал скалярный детектор для идентификации блоков, содержащих только базовые скалярные операции, чтобы инициировать эту прямую компиляцию.Затем JIT-компилятор выдает байты машинного кода на исполняемую страницу памяти, включая тщательно разработанный пролог функции для распределения регистров и стекового кадрирования. Локальные переменные отображаются непосредственно на регистры процессора R12D-R15D, чтобы минимизировать доступ к памяти. Была обнаружена и исправлена критическая ошибка, связанная с префиксами REX при загрузке и сохранении регистров.Кроме того, был реализован компонент под названием SCEV-Lite для выполнения алгебраического решения циклов во время JIT-компиляции. Если цикл следует предсказуемым арифметическим закономерностям, SCEV-Lite алгебраически вычисляет конечные значения, преобразуя потенциально миллионы итераций цикла в вычисление с постоянным временем выполнения, состоящее из пяти инструкций. Это значительно ускоряет выполнение циклов.Был введен предварительный проход под названием pre_register_variables для правильного отображения динамических переменных цикла на стек перед генерацией ассемблера, что решило проблему, когда такие переменные записывались обратно как нулевые. Тесты показали невероятное ускорение в 198 937 раз для цикла индукции, скомпилированного с помощью этого нативного JIT, по сравнению с интерпретатором. Эта оптимизация сворачивает слои выполнения, отражая двухуровневую архитектуру современного микрокода процессора.Следующие шаги включают реализацию классических проходов оптимизации компилятора, таких как свертывание констант, распространение, развертывание циклов и удаление мертвого кода, для дальнейшего улучшения генерации кода.
CdXz5zHNQW_tO8Z2K7Tgj.webp