Bombyx: OpenCilk Compilation for FPGA Hardware Acceleration
Shahawy, de Castelnau, Ienne
Task-level parallelism (TLP) is a widely used approach in software where independent tasks are dynamically created and scheduled at runtime. Recent systems have explored architectural support for TLP on field-programmable gate arrays (FPGAs), often leveraging high-level synthesis (HLS) to create processing elements (PEs). In this paper, we present Bombyx, a compiler toolchain that lowers OpenCilk programs into a Cilk-1-inspired intermediate representation, enabling efficient mapping of CPU-oriented TLP applications to spatial architectures on FPGAs. Unlike OpenCilk's implicit task model, which requires costly context switching in hardware, Cilk-1 adopts explicit continuation-passing - a model that better aligns with the streaming nature of FPGAs. Bombyx supports multiple compilation targets: one is an OpenCilk-compatible runtime for executing Cilk-1-style code using the OpenCilk backend, and another is a synthesizable PE generator designed for HLS tools like Vitis HLS. Additionally, we introduce a decoupled access-execute optimization that enables automatic generation of high-performance PEs, improving memory-compute overlap and overall throughput.
academic
Bombyx: Компиляция OpenCilk для аппаратного ускорения FPGA
В данной работе предлагается Bombyx — набор инструментов для компиляции программ OpenCilk в аппаратные ускорители FPGA. Bombyx преобразует неявную модель параллелизма задач OpenCilk в явное представление передачи продолжений (continuation-passing) в стиле Cilk-1, которое лучше подходит для потоковых характеристик FPGA. Инструмент поддерживает несколько целей компиляции: среду выполнения, совместимую с OpenCilk, для верификации, а также генератор синтезируемых обрабатывающих модулей для инструментов высокоуровневого синтеза, таких как Vitis HLS. Кроме того, Bombyx вводит оптимизацию развязывания доступа к памяти и выполнения (DAE), которая автоматически генерирует высокопроизводительные обрабатывающие модули, повышая перекрытие памяти-вычисления и общую пропускную способность.
Параллелизм уровня задач (TLP) — широко используемая техника параллелизма в программном обеспечении, позволяющая динамически создавать и планировать независимые задачи во время выполнения. Хотя существуют аппаратные фреймворки (такие как ParallelXL и HardCilk), поддерживающие TLP на FPGA, отсутствуют автоматизированные инструменты для извлечения и компиляции кода обрабатывающих модулей (PE) из фреймворков TLP программного обеспечения. Существующие фреймворки обычно требуют, чтобы пользователи вручную предоставляли код PE, что является утомительным и подверженным ошибкам.
Потребность в автоматизации: Перенос приложений TLP, ориентированных на CPU, на FPGA требует значительных ручных работ, включая переструктурирование кода, адаптацию аппаратных интерфейсов, генерацию файлов конфигурации и т. д.
Оптимизация производительности: Вручную написанный код сложно применять к продвинутым аппаратным оптимизациям (таким как развязывание доступа к памяти и выполнения)
Эффективность разработки: Отсутствие автоматизированного набора инструментов препятствует широкому применению TLP в ускорении FPGA
Неявная модель OpenCilk: Модель fork-join с использованием cilk_spawn и cilk_sync требует переключения контекста в точках синхронизации. Реализация переключения контекста в аппаратном обеспечении требует сохранения всего состояния схемы, что не поддерживается напрямую текущими инструментами HLS и требует значительной работы с RTL
Промежуточное представление TAPIR: OpenCilk использует TAPIR, который использует низкоуровневые конструкции компилятора, что затрудняет генерацию читаемого кода C++, близкого к исходному коду, для HLS
Ручное написание PE: Требует ручной обработки выравнивания замыканий, интерфейсов буфера записи, генерации файлов конфигурации и других утомительных деталей
Явная модель передачи продолжений Cilk-1 лучше подходит для реализации на аппаратном обеспечении, поскольку она разделяет функции в точках синхронизации на завершающие функции (выполняемые атомарно, без необходимости переключения контекста). Хотя эта модель не очень интуитивна для программирования на программном обеспечении (и поэтому была исключена в эволюции Cilk), она естественна для реализации на аппаратном обеспечении. Цель Bombyx — автоматизировать преобразование из OpenCilk в явный TLP и генерировать оптимизированные аппаратные PE.
Автоматизированный процесс компиляции: Предложен полный автоматизированный набор инструментов компиляции Bombyx от OpenCilk к аппаратным ускорителям FPGA
Явное промежуточное представление: Разработано явное и неявное IR на основе графа управления потоком, реализующее автоматическое преобразование из модели fork-join в модель передачи продолжений
Генерация кода для нескольких целей:
Бэкэнд HardCilk: автоматическая генерация синтезируемого кода C++ HLS и файлов конфигурации
Слой эмуляции Cilk-1: верификация корректности преобразования с использованием среды выполнения OpenCilk
Оптимизация развязывания доступа к памяти и выполнения: Поддержка оптимизации DAE через директивы компилятора (pragma), разделение доступа к памяти и вычислений на различные задачи, повышение производительности аппаратного обеспечения
Экспериментальная верификация: На эталонных тестах обхода графа оптимизация DAE достигает сокращения времени выполнения на 26,5%
Использование фронтэнда Clang OpenCilk для генерации абстрактного синтаксического дерева
Преобразование AST в представление графа управления потоком (CFG) неявного IR
Каждой функции соответствует CFG, содержащий:
Уникальный входной блок (без входящих ребер)
Один или несколько выходных блоков (без исходящих ребер)
Базовые блоки, состоящие из последовательных операторов C, завершающихся операторами управления потоком
Почему не использовать TAPIR: TAPIR использует низкоуровневые конструкции (такие как φ-узлы, alloca и т. д.), что затрудняет генерацию читаемого кода C++, близкого к исходному коду. IR Bombyx сохраняет структуру исходного кода.
Это ключевой этап преобразования Bombyx, преобразующий неявную модель синхронизации OpenCilk в явную модель передачи продолжений Cilk-1.
Ключевые концепции:
Замыкание (Closure): Структура данных, представляющая задачу, содержащая:
Готовые параметры
Заполнители, ожидающие зависимостей
Указатель возврата
spawn_next: Создание задачи продолжения, ожидающей зависимостей
send_argument: Явная запись параметра в ожидающее замыкание и уведомление планировщика
Алгоритм преобразования:
Разделение пути: Обход CFG, начало нового пути при встрече с блоком завершения функции (return) или операцией sync
Каждый путь становится самостоятельной завершающей функцией
Серые области на рисунке 4(c) представляют два пути
Идентификация зависимостей: Анализ отношений зависимостей на границе sync
Идентификация переменных, которые необходимо использовать после sync (например, x и y на рисунке 1)
Эти переменные должны быть явно сохранены в полях замыкания
Замена ключевых слов:
Вставка объявления замыкания в точку вызова spawn
Замена sync на вызов spawn_next функции-преемника
Изменение возвращаемого значения spawn на явную запись в поле замыкания
Сохранение оператора return, который позже может быть преобразован в send_argument
Пример преобразования (рисунок 1 в рисунок 2):
// Неявное (OpenCilk)
int x = cilk_spawn fib(n-1);
int y = cilk_spawn fib(n-2);
cilk_sync;
return x + y;
// Явное (Cilk-1)
cont int x, y;
spawn_next sum(k, ?x, ?y); // Создание задачи продолжения
spawn fib(x, n-1); // Запись в заполнитель x
spawn fib(y, n-2); // Запись в заполнитель y
// Завершение функции, sync не требуется
HardCilk — это генератор архитектуры FPGA TLP с открытым исходным кодом, предоставляющий аппаратный планировщик кража работы. Bombyx автоматически генерирует все компоненты, необходимые для HardCilk:
Компромисс производительность-ресурсы: Повышение производительности на 26,5% за счет примерно 50% увеличения ресурсов является разумным компромиссом для приложений, интенсивно использующих память
Анализ размера PE:
Spawner + Executor ≈ размер одного PE Non-DAE
Задача Access занимает дополнительные ресурсы
Рекомендация: использование PE с параллелизмом данных, реализованного на RTL, может распределить стоимость задачи доступа к памяти
Потенциал оптимизации: В статье указывается, что в будущем задача доступа к памяти может быть интегрирована как примитив черного ящика, а не генерироваться с использованием HLS
DAE оптимизация требует ручного направления: В настоящее время требуется вставка pragma программистом, полная автоматизация не реализована
Ограниченная оценка:
Оценка проведена только на одном эталонном тесте (обход графа)
Отсутствует сравнение с другими методами (например, вручную написанный код, другие компиляторы)
Не протестированы более разнообразные сценарии приложений
Затраты на ресурсы: Оптимизация DAE приводит к примерно 50% увеличению ресурсов, что может ограничить крупномасштабные системы
Реализация задачи доступа к памяти: Использование HLS для генерации PE доступа к памяти неэффективно, рекомендуется использование RTL, но не реализовано
Зрелость инструмента: Как исследовательский прототип, отсутствует полная обработка ошибок и поддержка граничных случаев
Автоматическое определение DAE: Разработка анализа компилятора для автоматического определения кодовых паттернов, подходящих для оптимизации DAE
RTL модули доступа к памяти: Интеграция эффективных реализаций на RTL модулей доступа к памяти с параллелизмом данных
Дополнительные оптимизации: Исследование других оптимизаций, специфичных для аппаратного обеспечения (например, переиспользование данных, оптимизация локальности)
Расширение целей: Поддержка большего количества фреймворков аппаратного TLP и инструментов HLS
Полная оценка: Оценка на большем количестве эталонных тестов, включая различные типы приложений TLP
Уникальная стратегия преобразования: Умелое использование явной модели передачи продолжений Cilk-1 для решения проблемы переключения контекста на аппаратном обеспечении
Ценность автоматизации: Первая реализация полного автоматизированного набора инструментов от OpenCilk к FPGA, заполняющая важный пробел
Разумное проектирование IR: Дизайн IR, сохраняющий структуру исходного кода, делает сгенерированный код HLS более читаемым
Высокая практичность: Автоматизация обработки выравнивания замыканий, интерфейсов буфера записи, генерации файлов конфигурации и других утомительных деталей
Верифицируемость: Предоставление слоя эмуляции Cilk-1 для верификации корректности преобразования, повышение надежности инструмента
Дружественность к открытому исходному коду: Целевой HardCilk — это система с открытым исходным кодом, что способствует распространению инструмента
Сотрудничество аппаратного и программного обеспечения: Глубокое понимание проблемы адаптации модели TLP программного обеспечения к реализации на аппаратном обеспечении
Оптимизация DAE: Сочетание классической аппаратной оптимизации с TLP, демонстрирующее потенциал оптимизации, направляемой компилятором
Единственный эталонный тест: Оценка только обхода графа, невозможно полностью проверить универсальность инструмента
Отсутствие сравнения: Нет сравнения с вручную написанным кодом, другими методами компиляции
Ограниченный масштаб: Протестированные графы относительно небольшие (максимум 87K узлов)
Неглубокий анализ производительности: Не проанализированы конкретные источники повышения производительности (использование полосы пропускания, эффективность планирования задач и т. д.)
2 OpenCilk (PPoPP'23): Последний фреймворк Cilk, входной язык Bombyx
4 HardCilk (FCCM'24): Целевая платформа Bombyx, предыдущая работа авторов
5 Cilk-1 (SIGPLAN'95): Классическая система явной передачи продолжений TLP, теоретическая основа Bombyx
6 Диссертация Joerg (1996): Доказательство теоретической возможности преобразования неявного в явное
Общая оценка: Bombyx — это ценная исследовательская работа, заполняющая важный пробел в автоматизированном наборе инструментов от OpenCilk к аппаратному ускорению FPGA. Его основная инновация заключается в использовании явной модели передачи продолжений Cilk-1 для избежания дорогостоящего переключения контекста на аппаратном обеспечении и предоставлении полного процесса компиляции. Однако, как предварительная работа, статья имеет явные недостатки в широте и глубине экспериментальной оценки, а полуавтоматическая оптимизация DAE ограничивает удобство использования. Инструмент имеет прямую ценность для пользователей HardCilk и исследователей TLP, но требует дальнейшего совершенствования для широкого применения. Рекомендуется, чтобы последующие работы сосредоточились на автоматизированном определении оптимизации, расширении оценки эталонных тестов и открытии исходного кода для содействия верификации и улучшению сообществом.