Handel-C

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:26, 8 июня 2016.
Handel-C
Парадигма язык программирования
Спроектировано Mentor Graphics
Печать дисциплины статическая
OS кроссплатформенный
Лицензия Проприетарный
Портал: https://www.mentor.com/products/fpga/handel-c/

Handel-C — Си-подобный язык программирования, имеющий встроенные возможности для параллельных вычислений через FPGA.

История

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

Синтаксис

Организация параллелизма

Для организации параллелизма в языке Handel-C используется концепция взаимодействующих последовательных процессов, разработанная Хоаром. В Handel-C для этого задано ключевое слово par. Оно позволяет организовать блок операторов, в котором все операторы будут выполняться параллельно. С помощью ключевого слова seq внутри блока par можно задавать последовательные блоки вычислений, таким образом, организуя набор параллельно работающих процессов, каждый из которых выполняется последовательно (допускается любая степень вложенности блоков par и seq друг в друга).

Приведём пример работы двух этих операторов:

Оператор par:

static unsigned 8 a = 2;
static unsigned 8 b = 1;
par
{
    a++;
    b = a+10;
}

Блок par исполняется за один такт, результат: a = 3, b = 12.

Оператор seq:

static unsigned 8 a = 2;
static unsigned 8 b = 1;
seq
{
    a++;
    b = a+10;
}

Блок seq исполняется за 2 такта, результат: a = 3, b = 13, как в обычном С.

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

Таким образом, изначально любая программа, написанная на Handel-C, является последовательной, а параллелизм обеспечивается при задании блоков с помощью ключевого слова par. Такая С-подобность языка двояка. Тот факт, что Handel-C похож на обычный С, с одной стороны, позволяет достаточно легко портировать приложения под ПЛИС; однако с другой стороны, может приводить к написанию программ в стиле С, что отрицательно скажется на способности программы к параллельному выполнению.

В языке Handel-C помимо использования конструкции par существует ещё один способ создания параллельной программы - это задание нескольких функций main. Таким образом, можно обеспечивать параллельное выполнение нескольких независимых ветвей программы. Важной особенностью является то, что для каждого такого процесса (который задаётся функцией main) можно задавать свою частоту, с которой этот процесс будет выполняться на ПЛИС. Между разными процессами возможно взаимодействие посредством тех же самых каналов, которые используются в блоке par.

Особенности Handel-C

Помимо описанных выше отличий языка Handel-C от С, можно выделить ещё несколько его особенностей. Некоторые из них характерны и для других языков написания программ для ПЛИС, например, реализация обеих ветвей условного оператора if в аппаратуре, после чего на этапе выполнения выбирается одна из них, а вторая отбрасывается. Также уже отмечалось, что есть возможность задавать произвольный размер для каждой переменной, от 1 до 128 бит, что позволяет оптимизировать использование ресурсов ПЛИС-микросхемы.

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

Все переменные в языке Handel-C по умолчанию реализуются на регистрах, при этом массив задаётся как набор переменных, поэтому возможен одновременный доступ к разным элементам массива. Помимо этого, существует возможность реализации на ПЛИС типов памяти RAM и ROM (однако для этого требуется поддержка этой возможности со стороны аппаратуры). В отличие от стандартных массивов в Handel-C, которые представляют собой набор переменных, эти два типа более близки к стандартному пониманию массива: в каждый момент времени возможен доступ только к одному элементу. Это окупается за счёт использования меньшего объёма ресурсов ПЛИС.

Иногда в блоке par может появиться необходимость использования только что полученного значения переменной. Для этого существует тип данных signal, значение которого хранится только текущий такт:

signal unsigned 8 a;
static unsigned 8 b;
par
{
    a = 7;
    b = a;
}

Результат: a = 0, b = 7.

signal unsigned 8 a;
static unsigned 8 b;
seq
{
    a = 7;
    b = a;
}

Результат: a = 0, b = 0.

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

Каналы

Каналы позволяют взаимодействовать параллельным потокам: один поток помещает данные в каналы, а другой считывает из него данные. Каналы могут быть созданы как с типом очереди FIFO, так и без него. В случае канала без FIFO, канал, вызывающий операцию чтения (записи) ждет, пока соответствующий параллельный поток не выполнит команду записи (чтения). Таким образом отправитель и получатель могут синхронизироваться и обмениваться данными.

Расширения языка Си

В дополнение к стандартной семантике языка Си, следующие ключевые слова зарезервированы для работы c FPGA или для элементов языка, полученных из Occam.

Типы и объекты Выражения Операторы

chan


chanin


chanout


macro expr


external


external_divide


inline


interface


internal


internal_divide


mpram


macro proc


ram


rom


sema


shared


signal


typeof


undefined


wom

< ... > (type clarifier)


[ : ] (bit range selection)


\\ (drop)


<- (take)


@ (concatenation operator)


select


width


(send into channel) !


(read from channel) ?


delay


ifselect


set intwidth


let … ; in


par


prialt


releasesema


set clock


set family


set part


set reset


seq


try { … } reset


trysema


with


Полезные ссылки

  1. Среда разработки и методология
  2. Мануал (на английском)