ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION. TECHNICAL SCIENCE. 2017. No 3
УДК 519.685.3+ DOI: 10.17213/0321-2653-2017-3-22-28
О ПРОМЕЖУТОЧНОМ ПРЕДСТАВЛЕНИИ ПРОГРАММ ДЛЯ АВТОМАТИЧЕСКОГО СОЗДАНИЯ КОНВЕЙЕРНЫХ ВЫЧИСЛИТЕЛЕЙ
© 2017г. Е.В. Алымова1, А.П. Баглий1, Д.В. Дубров1, Р.А. Ибрагимов1, Ю.В. Михайлуц1, В.В. Петренко2, Б.Я. Штейнберг1, Р.Б. Штейнберг1, В.А. Яковлев1
1Южный федеральный университет, г. Ростов-на-Дону, Россия, 2ИП Петренко В.В., г. Ростов-на-Дону, Россия
ON THE INTERMEDIATE PROGRAM REPRESENTATION FOR AUTOMATIC GENERATION OF PIPELINE COMPUTE UNITS
E.V. Alymova1, A.P. Bagliy1, D.V. Dubrov1, R.A. Ibragimov1, Yu.V. Mikhailuts1,
V.V. Petrenko2, B.Ya. Steinberg1, R.B. Steinberg1, V.A. Yakovlev1
1Southern Federal University, Rostov-on-Don, Russia, 2Sole entrepreneur Petrenko V.V., Rostov-on-Don, Russia
Алымова Елена Владимировна - канд. техн. наук, ст. преподаватель, кафедра «Алгебра и дискретная математика», Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Баглий Антон Павлович - науч. сотрудник, Институт математики, механики и компьютерных наук имени И.И. Воро-вича, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Дубров Денис Владимирович - канд. физ.-мат. наук, доцент, кафедра «Информатика и вычислительный эксперимент», Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Ибрагимов Руслан Айярович - студент, Институт математики, механики и компьютерных наук имени И.И. Воровича, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Михайлуц Юрий Вячеславович - аспирант, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Петренко Виктор Владимирович - индивидуальный предприниматель, ИП Петренко В.В., г. Ростов-на-Дону, Россия. E-mail: [email protected]
Штейнберг Борис Яковлевич - д-р техн. наук, ст. науч. сотрудник, зав. кафедрой «Алгебра и дискретная математика», Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Штейнберг Роман Борисович - канд. физ.-мат. наук, доцент, кафедра «Алгебра и дискретная математика», Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Яковлев Владислав Андреевич - студент, Институт математики, механики и компьютерных наук имени И.И. Воровича, Южный федеральный университет, г. Ростов-на-Дону, Россия. E-mail: [email protected]
Alymova Elena Vladimirovna - Candidate of Technical Sciences, Senior lecturer, department «Algebra and discrete mathematics», Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Bagliy Anton Pavlovich - scientific officer, I.I. Vorovich Institute of Mathematics, Mechanics, and Computer Science, Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Dubrov Denis Vladimirovich - Candidate of Physical and Mathematical Sciences, department «Informatics and Computational Experiment», Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Ibragimov Ruslan Ayarovich - student, I.I. Vorovich Institute of Mathematics, Mechanics, and Computer Science, Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Mikhailuts Yuri Vyacheslavovich - post-graduate student, Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Petrenko Victor Vladimirovich - individual entrepreneur, IE Petrenko V.V., Rostov-on-Don, Russia. E-mail: [email protected]
Steinberg Boris Yakovlevitch - Doctor of Technical Sciences senior scientific researcher, head of department «Algebra and discrete mathematics», Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Steinberg Roman Borisovitch - Candidate of Physical and Mathematical Sciences, department «Algebra and discrete mathematics», Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
Yakovlev Vladislav Andreyevich - student, I.I. Vorovich Institute of Mathematics, Mechanics, and Computer Science, Southern Federal University, Rostov-on-Don, Russia. E-mail: [email protected]
ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.
TECHNICAL SCIENCE. 2017. No 3
Рассматриваются аспекты реализации компилятора языка С на процессор с программируемой архитектурой. Такой компилятор включает в себя конвертор языка С в язык описания электронных схем и библиотеку (или генератор) драйверов. Компилятор разрабатывается на основе Оптимизирующей распараллеливающей системы. Описаны основные элементы структуры промежуточного представления компилятора для генерации конвейерного ускорителя. Для тестирования производительности получаемого кода разработан генератор тестовых программ, вычисляющих свертки.
Ключевые слова: оптимизирующий компилятор; высокоуровневый синтез; язык описания электронных схем; свертки.
The paper considers some aspects of implementing the C compiler on a processor with a programmable architecture. The proposed compiler includes a C language converter, which generates a functional equivalent hardware description, and a library (or generator) of drivers. The compiler is based on Optimizing Parallelizing System. The paper gives detailed description for basic elements of compiler intermediate representation, which is used for computational pipelined accelerators. To test resulting code performance, a generator of convolution computing programs has been developed.
Keywords: optimizing compiler; high-level synthesis; hardware description language; convolutions.
Введение
Данная работа является развитием прежних работ группы авторов по созданию компилятора на процессор с программируемой архитектурой [1, 2]. Разработка ведется на основе Оптимизирующей распараллеливающей системы [3], имеющей высокоуровневое внутреннее представление [4].
В настоящее время существуют и разрабатываются инструменты, которые позволяют из программы на языке высокого уровня генерировать описания электронных схем (высокоуровневый синтез, high-level synthesis). Такие инструменты можно условно разделить на два типа: одни нацелены на создание отдельного устройства, другие позволяют создавать программу для устройства традиционной архитектуры с подключённым реконфигурируемым ускорителем (ускорителями). Инструменты, которые относятся к первому типу, преобразуют входную программу на языке высокого уровня целиком в описание устройства (или его части). Примерами таких инструментов являются Vivado HLS [5], Catapult HLS [6], Bambu [7] и другие. Инструменты второго типа разбивают исходную программу на части, предназначенные для вычисления на центральном процессоре и ускорителях. Примерами являются C2H [8] и HaSCoL [9].
Компилятор C2H совместно с инструментами разработки Altera позволяет генерировать дизайн процессора Nios II для ПЛИС вместе с компиляцией для него программы на языке C. При этом выделяемые разработчиком вручную функции исходной программы преобразуются инструментом C2H в аппаратные схемы на ПЛИС, взаимодействие с которыми осущест-
вляется ядром Nios II. Остальная часть программы компилируется для этого ядра, при этом отображённые в аппаратуру функции заменяются в коде специальными обёртками, устанавливающими взаимодействие с соответствующими ускорителями.
В обрабатываемой функции после некоторых оптимизаций каждый элемент синтаксиса языка C отображается в эквивалентную аппаратную структуру. Последовательность выполнения операций управляется одним или несколькими конечными автоматами. Независимые по данным операции планируются на параллельное выполнение. Если информационные зависимости позволяют, цикл внутри функции или вся функция может сгенерировать конвейерную схему своего исполнения.
Компилятор C2H имеет ряд ограничений на обрабатываемые функции. В частности, не поддерживаются операции с плавающей точкой, рекурсивные вызовы, операция получения адреса, битовые поля структур, оператор goto. В нарушение семантики языка C логические выражения всегда вычисляются полностью. В качестве особенности работы компилятора можно отметить то, что в генерируемых схемах размеры данных всегда соответствуют их размерам в основной программе. Таким образом, оптимизацию размеров промежуточных данных инструмент не выполняет. Также стоит отметить, что, помимо выбранных пользователем функций, синтез аппаратных ускорителей также выполняется для всех других вызываемых ими функций.
В целом инструмент C2H позволяет организовывать эффективные вычисления при помощи правильно подобранных разработчиком функций для ускорения. Также для взаимодейс-
твия с оперативной памятью могут понадобиться специализированные прагмы. Как показывает опыт практического использования инструмента C2H, помимо этого, для значительного ускорения вычислений может также потребоваться существенное переписывание алгоритмов [10].
Основная цель проекта PANDA заключается в разработке полезной основы, которая позволит проводить исследования новых идей в области HW-SW Co-Design. Структура PANDA включает в себя методики, поддерживающие исследования высокоуровнего синтеза для аппаратных ускорителей, разработку параллелизма для встраиваемых систем, аппаратное / программное обеспечение для оценки производительности на встраиваемых программных приложениях и динамически реконфигурируемых устройствах. PANDA выпущена под лицензией версии GNU General Public 3 и разрабатывается в Politécnico di Milano (Италия).
Bambu направлена на оказание помощи разработчику в процессе высокоуровневого синтеза сложных приложений, поддерживающих большинство конструкций C (например, вызовы функций и совместное использование модулей, арифметика указателей и динамическое разрешение доступа к памяти, доступ к массиву и структуры, передача параметров либо с использованием ссылки или копирования и т.п.). Bambu разработана для систем Linux, она написана на C++, и её можно свободно скачать по лицензии GPL. Bambu обеспечивает интерфейс GNU Compiler Collection (GCC) (версии 4.5, 4.6, 4.7, 4.8, 4.9 и 5 в настоящее время поддерживаются) с помощью плагинов GCC, чтобы извлечь его внутреннее представление в статическом виде единого исходного кода C. После извлечения данное представление конвертируется в удобное для системы промежуточное представление. Однако конвертация происходит только после того, как GCC проведет все необходимые оптимизации исходного кода. Исходя из промежуточного представления, извлеченного из GCC, Bambu выполняет дальнейший анализ и строит дополнительные внутренние представления, такие как граф вызовов, граф потока управления, потока данных и графиков, граф зависимостей. Затем он применяет множество анализов и преобразований независимо от целевого устройства. Одной из важных специфических оптимизаций, выполняемых Bambu во время этой фазы, является оптимизация умножений и делений константой. Эти операции, как правило,
превращаются в операции, которые используют только сдвиги и сложения. Другой анализ, проведенный на данном этапе, представляет собой анализ битовой ширины данных, который стремится уменьшить число битов, требуемых для операторов пути к данным. При выполнении конечного синтеза полученная архитектура имеет модульную структуру, что отражает структура графа вызовов. Модули, реализующие отдельные функции, включают в себя две различные части: логику управления и путь к данным.
Представляемый в данной статье компилятор отличается от известных тем, что разрабатывается на основе распараллеливающей системы с высокоуровневым внутренним представлением (ВП), что упрощает генерацию конвейерного кода и даёт возможность использовать преобразования ОРС. Наличие конвертора из ВП ОРС в ЬЬУМ позволяет генерировать код на ЦПУ из той части исходной программы, которая не конвейеризуется.
Внутреннее представление конвейера
Внутреннее представление конвейера (ВПК) - абстрактная модель, хранящая и представляющая вычислительный конвейер удобным образом для построения и обработки. Основной задачей ВПК является компактное и структурированное хранение всей информации, необходимой для генерации ИБЬ-кода. Основной структурной единицей представления является узел -элемент конвейера, ответственный за обработку или хранение данных. Узлы реализованы в рамках иерархии классов С++. На рис. 1 представлен отдельный узел конвейера в ВПК, где PLNodeBase - базовый класс узла; PLNodeCore -класс, представляющий вычислитель (узел); PLNodeBuffer - класс, представляющий буфер (узел); PLNodeVarBuffer - класс, представляющий буфер для хранения переменных значений; PLNodeConstBuffer - класс, представляющий буфер для хранения констант.
Здесь под вычислителем понимается модуль, способный произвести установленную операцию над переданными ему данными и предоставить доступ к результату. Поддерживаемыми операциями на данный момент являются:
1) арифметические: сложение, вычитание, умножение, деление;
2) логические: И, ИЛИ, НЕ;
3) битовые: конкатенация.
ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.
TECHNICAL SCIENCE. 2017. No 3
Рис. 1. Иерархия классов C++ для отдельного узла конвейера в ВПК / Fig. 1. C ++ class hierarchy for an individual pipeline node in the internal representation
Под буфером понимается модуль, способный хранить заданное количество данных и предоставлять к ним доступ на чтение и запись.
Данные, с которыми оперирует узел, имеют разрядность. Информация о разрядности данных отражена в базовом классе иерархии.
Класс вычислителя содержит дополнительную информацию о реализуемой операции и количестве операндов (арности).
Класс буфера, за счет разнообразия вариантов хранения и передачи данных, несет много дополнительной информации и заслуживает отдельного рассмотрения. Структура буфера отражена на рис. 2.
Рис. 2. Структура буфера: тёмный прямоугольник - буфер;
светлые прямоугольники - ячейки памяти; стрелки -направление передачи данных / Fig. 2. Buffer structure: dark rectangle - buffer; light rectangles - memory cells; arrows - data transfer direction
Буфер имеет два режима работы: потоковое и фиксированное хранение данных. Буфер, реализующий потоковое хранение, представляет собой совокупность ячеек памяти, которые образуют исходящее ориентированное дерево. В таком буфере элемент данных в каждой ячейке сохраняется ровно один такт. Каждый такт данные перемещаются в смежные ячейки. Данные в листах один раз используются вычислителем (после использования теряются). В противоположность этому, в режиме фиксированного хранения запрещается перезапись данных в ячейках, что позволяет вычислителям обращаться к ним неограниченное число раз.
Буфер может снабжать данными неограниченное количество вычислителей, работающих, вообще говоря, разное количество тактов.
Таким образом, буфер содержит информацию о размере своего основного блока, размерах всех подбуферов-задержек и о режиме работы. Буфер констант также содержит информацию о хранимой им константе и по умолчанию работает в режиме постоянной памяти.
Отдельной сущностью представления является порт, содержащий информацию о входных/выходных данных конвейера, их размерах, адресах чтения и записи. Порты определяют интерфейс взаимодействия конвейера и окружения и позволяют окружению воспринимать конвейер как черный ящик. В данной реализации порт содержит информацию о передаваемом объекте (массив, переменная, константа), ссылку
на буфер, с которым связан данный порт и направление передачи (из порта в буфер или наоборот).
Сам класс промежуточного представления PipelineBase наследуется от StatementBase в дереве Reprise (ВП ОРС). Это обеспечивает целостное и независимое представление преобразованной программы в Reprise и открывает возможности для дальнейших преобразований, в которых обращение к конвейеру будет представлено как равноправный оператор языка. Структурно класс PipelineBase содержит список узлов, список портов, а также конкретную архитектуру конвейера в виде списка смежности графа узлов. Он обеспечивает удобный интерфейс для построения конвейера, а также позволяет обходить конвейер как в прямую, так и в обратную сторону.
Рассмотрим подробнее некоторые функции:
1. Функция AddCore добавляет вычислитель нужного типа и разрядности и организует прием данных из переданных буферов, добавляя им «ветви» соответствующих задержек.
2. Функция AddBuffer добавляет буфер нужной разрядности и размера основного блока, обозначает его режим работы и, если таковой имеется, определяет вычислитель - источник данных для буфера.
3. Функция AddLiteral добавляет буфер в режиме постоянной памяти, хранящий переданную константу.
4. Функция MapPort создает новый входной/выходной порт, добавляет в него информацию об объекте и связывает его с переданным буфером.
5. Функции getNodeDescList и getNodeAncestList возращают список непосредственных потомков и предков соответственно для переданного узла и используются для прямого и обратного обхода графа узлов конвейера.
Реализация прочих функций требуется для интеграции класса PipelineBase в дерево Reprise.
Автоматическое тестирование компилятора
Компилятор программ на реконфигури-руемую архитектуру на вход получает синтаксически и семантически корректную программу на языке C вместе с набором входных данных к ней. На выходе фрагмент программы заменяется вызовом сопроцессора на FPGA, реализующего действия выделенного фрагмента. В результате
преобразования программы возможны ошибки следующих классов:
- нарушение синтаксиса результирующей программы;
- нарушение правил семантики результирующей программы;
- нарушение функциональной эквивалентности исходной и результирующей программ;
- замедление времени выполнения результирующей программы;
- временные затраты на обмен данных в памяти превышает время работы сопроцессора.
Тестом для компилятора является программа на языке C, прошедшая компиляцию, и набор входных данных к ней.
Задача тестирования - проверка работы компилятора на тестовых наборах, удовлетворяющих критерию достаточности [11], и выявление ошибок перечисленных классов.
Параметризуемый генератор тестов
Генератор тестов на вход получает контекстно-свободную грамматику целевого языка программирования и конфигурационный файл в формате XML. Конфигурация определяет следующие параметры генерации:
- шаблон программы - виды и допустимые комбинации вложенности операторов, определяющие уровень сложности программы;
- допустимые информационные связи в выделенных блоках программы и между ними;
- критерий достаточности набора тестов -виды и количество операторов для составления конечного числа комбинаций операторов, которые должны появиться в наборе тестов хотя бы один раз.
Генерация наборов тестов производительности: свёртки
В общем виде программа, реализующая свёртку, может быть представлена следующим образом:
void main() {
int a[n-k]; int b[k]; int c[n]; int i, j;
// Вызов функции считывания входных данных read_data(a, b);
for (i = 0; i < (n-k); ++i) {
ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION.
TECHNICAL SCIENCE. 2017. No 3
c[i] = 0;
for (j = 0; j < k; ++j) {
c[i] = c[i] + a[i+j] * b [j]
}
}
// Вызов функции сохранения выходных данных write_data(c);
}
В этом представлении массив a является последовательностью входных сигналов, массив b - ядром свёртки, а массив c - последовательностью выходных сигналов.
Реализация свёртки параметризуется следующими константами: n - длина выходного массива; k - длина ядра свёртки.
Тестовый набор специального вида будет состоять из программ с фиксированным шаблоном, но с различными параметрами и ядром свёртки, сгенерированным случайным образом. Критерий достаточности задаётся диапазоном длины массива выходных сигналов l - нижняя граница, r - верхняя граница и шагом приращения длины s. Мощность тестового набора, удовлетворяющего заданному критерию достаточности, вычисляется по формуле: (r - l) / s.
Для формирования набора тестов по шаблону в генератор вводится дополнительный режим. Вместо контекстно-свободной грамматики на вход генератору подаётся параметризованный шаблон вида:
#include <stdio.h> int a[%N% - %K%];
int b[%K%] = {%random_int_array(K, gl, g2)%}; int c[%N%]; int i, j; int main(void) {
// Вызов функции считывания входных данных read_data(a, b);
for (i = 0; i < (%N%-%K%); ++i) {
c[i] = 0;
for (j = 0; j < %K%; ++j)
{
c[i] = c[i] + a[i+j] * b[j];
}
}
// Вызов функции сохранения выходных данных write_data(c);
return 0;
}
Параметры шаблона N и K задают длину выходной последовательности сигналов и длину свертки. Вызов функции randomintarray (K, gl, g2) вернёт последовательность K
целочисленных элементов, значения которых сгенерированы случайным образом в диапазоне от §1 до §2.
Система автоматического тестирования компилятора
Тестирование компилятора состоит из следующих этапов:
1. Генерация набора тестов производительности, удовлетворяющего критерию достаточности.
2. Генерация входных данных к каждой программе из набора.
3. Компиляция каждой тестовой программы тестируемым компилятором и получение результирующей программы.
4. Компиляция каждой тестовой программы эталонным компилятором и получение исходной программы.
5. Прогонка успешно скомпилированных пар программ на наборе входных данных.
6. Сбор выходных данных и анализ результатов.
На рис. 3 представлена схема процесса тестирования компилятора. Условия успешности прохождения теста формулируются в зависимости от целей тестирования и могут комбинироваться для проверки ошибок сразу из нескольких классов.
Рис. 3. Схема этапов тестирования конвертера / Fig. 3. Converter testing stages
Нарушение синтаксиса и правил статической семантики выявляется на этапе компиляции результирующей программы, ошибки динамической семантики - на этапе запуска программ. Если исходная и результирующая программа успешно отработали, то сравнением выходных данных устанавливается их функциональная эквивалентность.
ISSN 0321-2653 IZVESTIYA VUZOV. SEVERO-KAVKAZSKIIREGION. TECHNICAL SCIENCE. 2017. No 3
Для оценки производительности результирующей программы требуется вставка функций фиксации времени непосредственно до и после прохождения долго считаемого участка кода. Разность полученных величин определяет время обмена данными в памяти и время вычислений на сопроцессоре. Непосредственное время вычислений измеряется на FPGA при обращении к сконфигурированному модулю таймера. Результаты замера времени вычислений в сопроцессоре возвращаются вместе с выходными данными. Время обмена данными в памяти вычисляется как разность времени исполнения долго считаемого участка кода и времени выполнения вычислений в сопроцессоре.
Литература
1. Steinberg B.Ya., Dubrov D.V., Mikhailuts Yu.V., Roshal A.S., Steinberg R.B. // Automatic High-Level Programs Mapping onto Programmable Architectures. Proceedings of the 13th International Conference on Parallel Computing Technologies, August 31 - September 4, 2015, Petrozavodsk, Russia. Vol. 9251. P. 474 - 485. Springer Verlag.
2. Steinberg B.Ya., Bugliy A.P., Dubrov D.V., Michiluts Yu.V., Steinberg O.B., Steinberg R.B. A Project of Compiler for a Processor with Programmable Accelerator // «Procedia Computer Science», 5th International Young Scientist Conference
on Computational Science, YSC 2016, 26-28 October 2016, Krakow, Poland, Vol. 101, 2016, P. 435 - 438.
3. Оптимизирующая распараллеливающая система. URL: http://ops.rsu.ru/about_OPS.html (дата обращения 08.02.2017).
4. Петренко В.В. Новое внутреннее представление Открытой распараллеливающей системы. URL: http://ops.rsu.ru/download/ops/VP_diplom_05.pdf (дата обращения 08.02.2017).
5. Vivado High-Level Synthesis. URL: http://www.xilinx.com/ products/designtools/vivado/integration/esl-design.html (дата обращения 08.02.2017).
6. Catapult High-Level Synthesis. URL: https: //www.mentor.com/hls-lp/catapult-high-level-synthesis/ (дата обращения 08.02.2017)
7. Bambu. URL: http://panda.dei.polimi.it/?page_id=31 (дата обращения 08.02.2017).
8. Nios II C2H Compiler. User Guide. URL: https: //www.altera.com/en_US/pdfs/literature/ug/ug_nios2_c2h_co mpiler.pdf (дата обращения 08.02.2017).
9. HaSCoL. URL: http://oops.math.spbu.ru/projects/coolkit (дата обращения 08.02.2017).
10. Etiemble D., Piskorski S., Lacassagne L. Performance evaluation of Altera C2H compiler on image processing benchmarks. Proceedings on the Fifteenth International Conference on Parallel Architectures and Compilation Techniques, September 16 - 20. 2006. https://www.lri.fr/~lacas/ Publications/TCHA06.pdf (дата обращения 08.02.2017).
11. Алымова Е.В. Критерий полноты тестовых наборов, ориентированных на проверку распараллеливающих преобразований программ. Информационные технологии. М.: «Новые технологии». 2011. № 9. С. 19 - 22.
References
1. Boris Ya. Steinberg, Denis V. Dubrov, Yury V. Mikhailuts, Alexander S. Roshal, Roman B. Steinberg // Automatic High-Level Programs Mapping onto Programmable Architectures. Proceedings of the 13th International Conference on Parallel Computing Technologies, August 31 - September 4, 2015, Petrozavodsk, Russia. Vol. 9251. Pp. 474 - 485. Springer Verlag
2. Boris Ya. Steinberg, Anton P. Bugliy, Denis V. Dubrov, Yury V. Michiluts, Oleg B. Steinberg, Roman B. Steinberg // A Project of Compiler for a Processor with Programmable Accelerator // «Procedia Computer Science», 5th International Young Scientist Conference on Computational Science, YSC 2016, 26-28 October 2016, Krakow, Poland, 2016. Vol. 101, Pp. 435 - 438.
3. Optimiziruyushchaya rasparallelivayushchaya sistema [The optimizing parallelizing system]. Available at: http://ops.rsu.ru/about_OPS.html (accessed 08.02.2017).
4. Petrenko V.V. Novoe vnutrennee predstavlenie otkrytoi rasparallelivayushchei sistemy [New internal representation of the open parallelizing system]. Available at: http://ops.rsu.ru/download/ops/VP_diplom_05.pdf (accessed 08.02.2017)
5. Vivado High-Level Synthesis. Available at: http://www.xilinx.com/products/design-tools/vivado/integration/esl-design.html (accessed 08.02.2017)
6. Catapult High-Level Synthesis. Available at: https://www.mentor.com/hls-lp/catapult-high-level-synthesis/ (accessed 08.02.2017)
7. Bambu. Available at: http://panda.dei.polimi.it/?page_id=31 (accessed 08.02.2017)
8. Nios II C2H Compiler. User Guide. Available at: https://www.altera.com/en_US/pdfs/literature/ug/ug_nios2_c2h_compiler.pdf (accessed 08.02.2017)
9. HaSCoL. Available at: http://oops.math.spbu.ru/projects/coolkit (accessed 08.02.2017)
10. Etiemble D., Piskorski S., Lacassagne L. Performance evaluation of Altera C2H compiler on image processing benchmarks. Proceedings on the Fifteenth International Conference on Parallel Architectures and Compilation Techniques, September 16-20, 2006, https://www.lri.fr/~lacas/Publications/TCHA06.pdf (accessed 08.02.2017)
11. Alymova E.V. Kriterii polnoty testovykh naborov, orientirovannykh na proverku rasparallelivayushchikh preobrazovanii programm. Informatsionnye tekhnologii [Criterion of completeness of the test sets focused on check of the parallelizing transformations of programs. Information technologies]. Moscow, «Novye tekhnologii», 2011, no. 9, pp. 19 - 22.
Поступила в редакцию /Received_03 мая 2017 г. /May 03, 2017