OpenCL для ПЛИС

Среда программирования OpenCL позволяет создавать проект на основе ПЛиС на языке высокого уровня, напоминающем C, что делает его доступным для широкого круга пользователей. В статье обсуждаются основы OpenCL, особенности создания проектов на ПЛиС с использованием OpenCL, способы организации потоковых каналов и построения OpenCL-систем на базе нескольких ПЛиС, а также вопросы использования встроенных ARM-процессоров в качестве OpenCL-хостов в ПЛиС.

ПЛИС превратились в весьма мощные и энергоэффективные процессорные системы. Благодаря программируемым аппаратным ресурсам они могут быть адаптированы к специализированным приложениям, превосходя при этом центральные (ЦП) и графические процессоры по функциональным характеристикам и обеспечивая экономию энергопотребления. Основной проблемой широкого внедрения ПЛИС всегда была необходимость использования специализированных языков программирования, известных как языки описания аппаратуры (Hardware Description Languages — HDL), таких как VHDL и Verilog. Если сравнить их с традиционными языками программирования высокого уровня, то они напоминают языки уровня ассемблера, требующие определенных навыков и глубокого знания используемого аппаратного обеспечения. Хотя неоднократно предпринимались попытки создания программных средств, выполняющих преобразование кода, написанного на обычном языке программирования, в HDL для ПЛИС (или из другого высокоуровневого средства разработки, например, Simulink), ни одно из них не получило широкого распространения, и каждое требует некоторого опыта работы с ПЛИС.

Кроме того, с каждым новым поколением сложность и функциональные возможности ПЛИС растут. Например, последнее поколение ПЛИС Altera семейства Stratix 10, изготовленное на базе 14-нм технологии Intel, содержит до 4 млн. логических элементов, 56-Гбит/с трансиверы, процессорные ядра ARM и имеет аппаратную поддержку операций с плавающей запятой. Новые ПЛИС обеспечивают огромные возможности, однако создание проектов на их основе сопряжено с большими сложностями для тех пользователей, кто хотел бы полностью реализовать их потенциал. Убедительными доводами в пользу этих устройств являются их более высокая энероэффектив-ность и функциональность в сравнении с центральными и графическими процессорами, но их внедрение сдерживается еще и необходимостью владения навыками работы с ПЛИС и длительностью цикла разработки.

OPENCL: ИДЕАЛЬНОЕ РЕШЕНИЕ ДЛЯ ПЛИС
В попытке решить эти проблемы компании Altera и Xilinx присоединились к консорциуму OpenCL с целью разработки методов поддержки своих ПЛИС в стандарте OpenCL. Почему именно OpenCL? OpenCL — это открытый стандарт параллельного программирования гетерогенных систем, который курирует Khronos Group — промышленный консорциум, целью которого является разработка открытых стандартов интерфейсов программирования.

Запущенный компанией Apple и в настоящее время контролируемый группой Khronos Group (в состав этой группы входит Intel, AMD, NVidia, IBM, Texas Instruments, Freescale, ARM, Altera, Xilinx и другие компании), стандарт программирования OpenCL поддерживается широким кругом компаний, что является принципиально важным, поскольку это позволяет пользователям выбирать базовое аппаратное обеспечение, которое наилучшим образом подходит к их приложениям, и в сжатые сроки апробировать новые перспективные технологии. Поддержка OpenCL открывает возможности технологии программируемой логики новой, многочисленной группе разработчиков. Вместо необходимости овладения очередной концепцией программирования, можно эффективно использовать существующую открытую и проверенную методологию.

Язык OpenCL создан специально для параллельного программирования, что делает его идеальным для ПЛИС, поскольку одним из основных средств достижения высокой производительности систем на базе ПЛИС является массово-параллельная архитектура этих устройств. В прежних инструментах преобразования кода C в HDL не было возможности описывать параллельные программные процедуры. Компилятор OpenCL для ПЛИС может использовать не только стандартные конвейерные методы генерирования логики из линейного кода, но также способен реализовать параллельную организацию программ.

Наконец, язык OpenCL предназначен для использования в гетерогенных системах. Что представляют собой гетерогенные системы? Это системы с различными типами процессорных компонентов, например, ЦП + графический процессор, ЦП + ПЛИС или ЦП + графический процессор + ПЛИС. Программы на OpenCL содержат код, который запускается на хосте, и код, который запускается на ускорителях (ядрах). Хост — это, как правило, центральный процессор общего назначения, а ускорителем может быть графический процессор, другой центральный процессор (или ядро в многоядерном ЦП) или же ПЛИС (см. рис. 1). Все знают, что ни одна процессорная технология не подходит наилучшим образом для всех приложений, поэтому OpenCL позволяет смешивать процессорные технологии, обеспечивая в то же время общий язык разработки приложений. Пользователи могут легко портировать свой код с одного ускорителя на другой, что позволяет им быстро осуществлять выбор наилучшей платформы для своего приложения. Благодаря встроенным ядрам ARM ПЛИС могут быть самостоятельными гетерогенными системами.

OpenCL для ПЛИС

ОСНОВЫ OPENCL
Программа на OpenCL, как уже упоминалось выше, состоит из кода хоста и кода ускорителя. Код хоста может быть написан на любом языке программирования, а интерфейсы — в среде OpenCL путем определения интерфейсов прикладного программирования (API), в состав которых входят вызовы для передачи данных, коды загрузки и подпрограммы распределения и координации заданий. Каждый поставщик обеспечивает поддержку своих ускорителей, в т.ч. предоставляет пользователю компилятор для создания кода ускорителя и приложение для API хост-процессора. Хотя поставщики могут предлагать свои дополнения для оптимизации кода, в частности, различные библиотеки, они должны соблюдать требования стандарта OpenCL, чтобы обеспечить портируемость. Код ускорителя пишут на языке, производном от C (как правило, C99), с некоторыми расширениями.

Для поддержки OpenCL нужны две вещи. Во-первых, компилятор, который зависит от аппаратных средств и технологии, поэтому каждая компания-производитель предлагает собственный компилятор для своих устройств. Затем требуется пакет поддержки платформы (board support package — BSP) для портирования этого устройства на конкретную плату. Для программируемых процессоров создание компилятора и соответствующего BSP является не слишком трудной задачей, но для ПЛИС все сложнее. Причина состоит в том, что OpenCL — это, фактически, язык программирования на базе C, поэтому он хорошо отображается на программируемые процессоры. Для ПЛИС Altera генерируется, по сути, аппаратное обеспечение (логика), соответствующее конкретному коду ядра, а не просто программируемые процессоры, которые помещаются в ПЛИС. Кроме того, для поставщика плат с ПЛИС должна быть разработана инфраструктура, необходимая для поддержки OpenCL, в то время как в случае программируемых процессоров такая поддержка обычно реализуется на кристалле.

После нескольких лет разработки и более года тестирования у пользователей компания Altera выпустила комплект разработчика программного обеспечения (ПО) (SDK) на базе OpenCL для ПЛИС. В центре этого средства разработки — компилятор OpenCL, который генерирует код Verilog для ядер OpenCL, написанных пользователями. Сгенерированные ядра затем автоматически интегрируются в предварительно созданный проект ПЛИС, который обеспечивает поддержку инфраструктуры OpenCL. Такая поддержка обычно включает интерфейсы внешней памяти и PCIe.

Ключевым моментом подхода компании Altera к OpenCL, который отличается от других способов генерирования HDL, является то, что программист на OpenCL непосредственно генерирует программирующий файл ПЛИС без участия других инструментов синтеза или таких средств как VHDL и Verilog. Разработчик плат для ПЛИС, например, компания BittWare, делает основную работу заранее, создавая пакет поддержки платформы (BSP) для OpenCL, используя обычные средства разработки (VHDL или Verilog), а также базовый проект, куда входят сгенерированные ядра OpenCL. Все внешние интерфейсы в базовом проекте физически зафиксированы так, чтобы обеспечить их синхронизацию по времени при последующей компоновке, а компилятор OpenCL мог заполнить программные сегменты сгенерированным кодом ядра. На рисунке 2 показано такое разделение. Использование такой методологии означает, что программисту не нужно передавать сгенерированный им код разработчикам системы на ПЛИС, чтобы они отрабатывали проект на плате. Вместо этого они непосредственно создают загрузку ресурсов ПЛИС.

Работа компилятора OpenCL от Altera проходит в два этапа, первый из которых — компилирование ядер OpenCL в Verilog. Этот первый этап является довольно быстрым (минуты) и при отсутствии синтаксических и семантических ошибок, вы сразу сможете оценить, насколько быстро будет работать ваше ядро, а также, сколько ресурсов оно использует. Второй этап — это традиционное компилирование ПЛИС, которое может занимать столько времени, сколько обычно требуется для компоновки ПЛИС (часы). Как только первая фаза будет пройдена, вы точно будете знать, что и вторая фаза через некоторое время завершится.

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

Компилятор OpenCL компании Altera фактически генерирует логику для реализации ядер. Он не заполняет ПЛИС зафиксированными процессорными ядрами, которые запускают компилированный код (как в случае графических процессоров), а вместо этого генерирует аппаратные средства, которые реализуют конкретное программное ядро. Это является ключевой причиной того, почему ПЛИС могут превосходить в производительности центральные и графические процессоры при намного меньшем энергопотреблении.

Инициатива компании Altera по внедрению OpenCL в проектирование систем на ПЛИС направлена на решение двух первоочередных задач для специалистов, имеющих намерения использовать технологию ПЛИС в тех областях, где традиционно доминировали программируемые процессоры. Во-первых, OpenCL обеспечивает традиционную среду программирования, открывая ПЛИС потенциально намного более широкому кругу разработчиков. Во-вторых, благодаря возможности создания проектов для ПЛИС на выгокоуровневом языке параллельного программирования, период разработки может быть резко сокращен. Портирование алгоритмов на ПЛИС с помощью VHDL и Verilog может быть довольно кропотливым процессом, поскольку неизбежны изменения, и их реализация — это достаточно трудоемкий процесс. Используя OpenCL, циклы разработки могут быть сокращены с нескольких месяцев до нескольких недель или даже дней.

ПОТОКОВЫЕ КАНАЛЫ OPENCL
Как уже было сказано, при создании проекта на OpenCL используется модель хоста и ускорителя, когда все данные для ускорителя поступают из хоста, и все результаты процессорной обработки возвращаются обратно в хост. Хотя такая модель успешно работает для центральных процессоров, выступающих в роли ускорителей, она не слишком эффективна в том случае, когда приложение требует, чтобы ПЛИС непосредственно сопрягались с внешними входами. Это довольно типичная ситуация, поскольку раньше во многих системах ПЛИС использовались только для взаимодействия с устройствами ввода/вывода. Со временем, когда производительность ПЛИС выросла, все больше и больше задач ввода/вывода и предварительной обработки данных стали брать на себя именно ПЛИС. Однако из-за сложности процесса проектирования основная часть обработки данных оставалась за программируемыми процессорами. OpenCL позволяет преодолеть это, предоставляя возможность среде программирования осуществлять непосредственную связь с внешними данными в пределах ПЛИС и открывая путь для повышения производительности и эффективности системы.

OpenCL для ПЛИС

Для реализации возможности непосредственного доступа к внешним данным в предварительной версии стандарта OpenCL Revison 2.0 было введено понятие «конвейера». Компания Altera обеспечила поддержку этого нововведения в своем расширении к OpenCL с помощью так называемых каналов. Каналы, или конвейеры, позволяют ядру OpenCL непосредственно считывать и записывать данные в устройство, которое фактически работает по принципу FIFO. Одна сторона FIFO соединяется (через заранее запрограммированную логику) с внешними устройствами ввода/вывода. Это означает, что внешние данные могут поступать прямо в ПЛИС, обрабатываться в ядре OpenCL, а затем пересылаться обратно во внешнюю среду. И все это выполняется без взаимодействия потоков данных с хостом. Соответствующая поддержка устройства ввода/вывода реализуется разработчиками ПЛИС и закладывается в BSP вместе с остальной инфраструктурой OpenCL. Заметим, что использование каналов не заменяет собой обычной модели передачи данных в OpenCL, а обеспечивает только еще один метод извлечения и передачи данных в ядро. Теперь может быть реализована любая комбинация потоков данных.

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

Кроме того, каналы OpenCL позволяют сопрягать любую пользовательскую логику ПЛИС с ядром OpenCL. Это означает, например, что можно иметь группу разработчиков системы на ПЛИС и группу программистов и использовать OpenCL как механизм взаимосвязи между двумя группами. Разработчики ПЛИС выполняют свою работу первыми, фиксируют ее в пакете BSP для OpenCL и передают его в группу разработчиков программного обеспечения, которые могут затем разрабатывать алгоритмы обработки данных в OpenCL. Как уже говорилось, подобная последовательность выполнения работ гарантирует сохранение требований синхронизации в проекте на ПЛИС, т.е. группа программистов не должна будет передавать созданный код группе разработчиков для интегрирования и тестирования проекта на ПЛИС — среда OpenCL делает эту работу автоматически.

Потоковые каналы OpenCL добавляют к традиционной модели OpenCL некоторые новые опции для организации потоков данных, в т.ч. потоков между ядрами, потоков между ядром и логикой ПЛИС, а также возможность прямого сопряжения ПЛИС с внешними устройствами ввода/вывода. Для среды разработки OpenCL это открывает бесконечное число возможностей. Во многих системах поток обмена данных с хостом является узким местом, поскольку данные из внешнего мира, поступающие от входного устройства, пересылаются в хост, затем передаются в ускоритель, обратно в хост и, наконец, — в выходное устройство. Теперь же входное, выходное и обрабатывающее устройства могут быть одним устройством. Такой подход может также изменить роль центрального процессора и ускорителя, поскольку ускоритель теперь может быть законченной процессорной системой, а центральный процессор может выполнять общее управление системой. Существует масса примеров приложений, в которых может быть использован этот вариант, в т.ч. обработка видео, обработка данных по сети, обработка сигналов и системы управления в режиме реального времени.

СИСТЕМЫ С ИСПОЛЬЗОВАНИЕМ МНОЖЕСТВА ПЛИС
Стандарт OpenCL допускает использование множества ускорителей в системе, но в первых версиях SDK для OpenCL от Altera в системе допускался только один ускоритель на ПЛИС. К счастью, последняя версия этого инструмента обеспечивает поддержку нескольких ПЛИС, позволяя создавать чрезвычайно мощные процессорные платформы и использовать OpenCL для их программирования.

В самом простом случае каждая ПЛИС представляет собой независимое устройство, и все потоки данных передаются между ними и хостом. Однако для того, чтобы использовать весь потенциал нескольких ПЛИС, чрезвычайно полезными могут быть каналы OpenCL из расширения Altera, поскольку они напрямую соединяют несколько ПЛИС, и потоки данных передаются между ними. Например, система TeraBox от компании BittWare может содержать 16 крупных ПЛИС с высокоскоростными последовательными каналами между ними, а OpenCL с канальным расширением можно эффективно использовать в качестве программной платформы для достижения высоких показателей по производительности.

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

ПОЛНАЯ СИСТЕМА OPENCL НА ПЛИС
Повторимся, что система OpenCL содержит хост и один или более ускорителей. Как правило, это центральный процессор общего назначения с графическим процессором или ПЛИС, установленные на плате расширения. Однако реализация аппаратной встроенной процессорной системы в последних поколениях ПЛИС сделала возможным создание законченной системы OpenCL на одной ПЛИС. В настоящее время компания Altera обеспечивает поддержку OpenCL в тестовом режиме на основе своей СнК ПЛИС Cyclone V со встроенным ARM-процессором. ARM-процессор работает как хост OpenCL, а матрица ПЛИС выступает в роли ускорителя. Имеется также возможность использования второго встроенного ядра ARM в качестве ускорителя OpenCL, в результате чего можно получить на одном кристалле ARM-хост, работающий совместно с ускорителями на базе ARM-процессора и ПЛИС.

Становится все более очевидным, что методология OpenCL делает значительные успехи на пути эффективного использования технологии ПЛИС в тех приложениях, где традиционно доминировали программируемые процессоры. Введение потоковых каналов ввода/вывода, поддержка систем на базе множества ПЛИС и использование встроенных ARM-процессоров в качестве OpenCL-хостов позволяют исключить барьеры, препятствующие широкому внедрению ПЛИС в высокопроизводительных и высокоэффективных системах.

Понравилась статья? Поделиться с друзьями:
TRIAL NEWS