Внедрение компилятора во время выполнения на FPGA в реальном времени

Мне любопытно слышать мнения людей о том, как сложно было бы реализовать компилятор на FPGA. Это может быть просто компилятор, например, LLVM, и реализация будет просто принимать LLVM IR и выводить машинный код.

Целью этого было бы позволить - так сказать - выполнение исходного кода (или кода промежуточного представления) в реальном времени в том смысле, что вы:

  • Настроить FPGA как компилятор для определенного языка (например, C)
  • Подайте компилятор с исходным кодом для вашей программы
  • Вывод (машинный код) компилятора идет непосредственно в CPU и выполняется

Для данной системы более или менее статической частью FPGA может быть LLVM-бэкэнд, т.е. часть, которая решает, какой тип машинного кода выводится, например x86-64 с SSE4. Или ARM Thumb-2 с инструкциями NEON и VFP. Если у вас нет системы с несколькими процессорами, это будет оставаться неизменным. Это не должно быть полностью статическим и, следовательно, не реализовано в аппаратном обеспечении, потому что оптимизация для компилятора производится постоянно, и его необходимо время от времени обновлять. Чаще меняющейся частью FPGA будет front-end, часть, которая производит LLVM IR с определенного языка: C, С++, Vala и т.д.

Оптимальная вещь в этой системе будет заключаться в том, что код всегда оптимизируется для ЦП в системе под рукой. В нынешней ситуации несколько сборок используют все дополнительные функции в процессорах: SSE, AVX, 3DNow!, Neon, VFP. Используя этот (полностью гипотетический) подход, полный потенциал процессоров можно было бы использовать путем компиляции для конкретной архитектуры в режиме реального времени и выполнения подготовленных инструкций сразу после. Это было бы особенно полезно для систем на базе ARM, где нам нужен весь сок, который мы можем выжать из процессоров, а сам процессор очень медленно выполняет компиляцию.

Я знаю, что gcc может быть настроен на использование потоков, и я бы предположил, что распараллеливание компилятора будет относительно простым. Т.е. просто компилировать все исходные файлы параллельно.

Мы могли бы также отключить интерфейс - специфичную для языка программирования часть компилятора - и просто распространять программы как промежуточный код представления, такой как LLVM IR.

Насколько это возможно?

Ответ 1

Я бы не стал беспокоиться. Я бы сконфигурировал FPGA как виртуальную виртуальную машину LLVM и просто запустил код, делегируя управление оборудованием процессору.

Ответ 2

Некоторые части компиляции очень легко распараллеливаются не-поточным способом. Например, словари с ключевыми словами очень распространены, поэтому адресная память содержимого может обеспечить значительную оптимизацию.

FPGA будут очень плохо работать для некоторых аспектов компиляции. Например, разрешение перегрузки должно учитывать зависящий от аргумента поиск, пользовательские преобразования, шаблоны и т.д.

Вы получите максимальную производительность путем конвейерной обработки и использования ресурсов как FPGA, так и CPU. Например, дайте FPGA lex исходный код и создайте поток токенов со всеми идентификаторами, замещенными индексами таблиц символов, в то время как CPU выполняет более поздние шаги компиляции (например, встраивание и оптимизация циклов).

Конечно, вы уже указали, что это не очень помогает оптимизации каждой машины, если код может быть предварительно обработан и распространен в формате p-кода. Можете сделать хороший компилятор-ускоритель во время разработки, хотя.

Ответ 3

У меня также была такая же идея некоторое время назад.

Реализация такой сложной программы на ПЛИС возможна, учитывая адекватную технологию синтеза. Использование поведенческого синтеза (так называемый C to HDL synthis) делает его выполнимым.

Самое забавное в том, что если выход вашего компилятора также является HDL, можно представить себе, как загружать поведенческий синтезатор (т.е. сам синтезировать), что, как правило, является важным этапом валидации для компилятора.

Ответ 4

Алан Кей дает очень классную беседу, которая исследует эту идею. Его команда построила ОС с целью, чтобы каждый домен (например, графика, сеть) был написан на языке сверхвысокого уровня как можно ближе к теории.

Первоначально они хотели сделать переводчики для всех этих языков на аппаратных средствах (FPGA или ASIC), но они были соблазнены соблазном делать демонстрации на товарных ноутбуках. По словам Кей, в "графических битах" есть "несколько" докторских диссертаций. Таким образом, "возможно" - вопрос о том, сколько времени и талантов вы можете бросить на проблему.

Этот разговор действительно заставил меня критически подумать о компромиссах, связанных с использованием инструментов общего назначения, как в аппаратном, так и в программном обеспечении.