Применение предметных языков и акторной модели для автоматизации высокопроизводительных вычислений

Автор: Востокин Сергей Владимирович, Скорюпина Екатерина Григорьевна, Наширванов Дамир Маратович

Журнал: Известия Самарского научного центра Российской академии наук @izvestiya-ssc

Рубрика: Информатика, вычислительная техника и управление

Статья в выпуске: 4-4 т.18, 2016 года.

Бесплатный доступ

В данной работе рассматривается сочетание предметных языков и языков общего назначения для автоматизации высокопроизводительных научных вычислений на базе облачного сервиса Templet Web. Автоматизация программирования при составлении задачи в системе Templet Web основана на концепциях скелетного программирования, предметных языков и использовании специализированных визуальных редакторов предметных языков в составе интегрированной среды разработки. Для предметного языка, использующего акторную модель, был разработан пример тестовой программы. Пример подобран таким образом, чтобы быть достаточно простым (проверка выполнения тригонометрического тождества для заданного значения) и в тоже время использовать все возможности предметного языка. Высокоуровневое описание задачи на предметном языке преобразуется в код, который использует систему времени выполнения. Для рассматриваемой системы времени выполнения, основанной на акторной модели, приводится заключение о степени автоматизации предлагаемого метода программирования на основании анализа относительных размеров библиотечного, сгенерированного и рукописного кода. В качестве критерия сложности и степени автоматизации рассматриваются относительные размеры кода разных частей программы. Код примера размещен на сервисе GitHub по адресу: https://github.com/templet-language/newtemplet. Высокая степень автоматизации достигается благодаря простоте используемой модели акторов, а также способу сопряжения библиотеки времени выполнения с программой пользователя: код сопряжения строится автоматически по описанию на предметном языке. В текущей версии системы Templet Web, развернутой по адресу http://templet.ssau.ru/app на базе вычислительного кластера «Сергей Королёв» Самарского университета, в настоящее время поддерживаются предметный язык, использующий акторную модель вычислений Templet, и скелеты программ «портфель задач», «конвейер». Данная технология показала свою эффективность для решения прикладных задач анализа многомерных динамических систем и процессов при исследовании гироскопических систем ориентации космических аппаратов, а также при обучении студентов принципам работы на суперкомпьютере.

Еще

Параллельное программирование, автоматизация программирования, акторная модель вычислений, предметно-ориентированный язык, скелетное программирование, аutomatic programming

Короткий адрес: https://sciup.org/148204753

IDR: 148204753

Текст научной статьи Применение предметных языков и акторной модели для автоматизации высокопроизводительных вычислений

В данной работе рассматривается сочетание предметных языков и языков общего назначения для автоматизации высокопроизводительных научных вычислений на базе облачного сервиса Templet Web. Автоматизация программирования при составлении задачи в системе Templet Web основана на концепциях скелетного программирования, предметных языков и использовании специализированных визуальных редакторов предметных языков в составе интегрированной среды разработки. Для предметного языка, использующего акторную модель, был разработан пример тестовой программы. Пример подобран таким образом, чтобы быть достаточно простым (проверка выполнения тригонометрического тождества для заданного значения) и в тоже время использовать все возможности предметного языка. Высокоуровневое описание задачи на предметном языке преобразуется в код, который использует систему времени выполнения. Для рассматриваемой системы времени выполнения, основанной на акторной модели, приводится заключение о степени автоматизации предлагаемого метода программирования на основании анализа относительных размеров библиотечного, сгенерированного и рукописного кода. В качестве критерия сложности и степени автоматизации рассматриваются относительные размеры кода разных частей программы. Код примера размещен на сервисе GitHub по адресу: https://github. com/templet-language/newtemplet. Высокая степень автоматизации достигается благодаря простоте используемой модели акторов, а также способу сопряжения библиотеки времени выполнения с программой пользователя: код сопряжения строится автоматически по описанию на предметном языке. В текущей версии системы Templet Web, развернутой по адресу на базе вычислительного кластера «Сергей Королёв» Самарского университета, в настоящее время поддерживаются предметный язык, использующий акторную модель вычислений Templet, и скелеты программ «портфель задач», «конвейер». Данная технология показала свою эффективность для решения прикладных задач анализа многомерных динамических систем и процессов при исследовании гироскопических систем ориентации космических аппаратов, а также при обучении студентов принципам работы на суперкомпьютере.

Предметные языки (domain-specific language, DSL) широко применяются для автоматизации научных расчетов. Наиболее известные из них: MATLAB (векторные вычисления), Wolfram Language (комбинация символьной и численной математики), Maple (символьные вычисления), Mathcad (интерактивные вычисления, визуализация). Преимущество данных языков в предмет-

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

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

Для ускоренной разработки программного обеспечения были предложены методики, позволяющие сочетать предметные языки и языки общего назначения в одном проекте [1, 2]. В данной работе рассматривается применение этого подхо- да для автоматизации высокопроизводительных научных вычислений на базе облачного сервиса Templet Web [3]. Предварительные результаты данного исследования были представлены на конференции ПИТ-2016 в работе [4].

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

В основе акторной модели вместо параллельных потоков, взаимодействующих при помощи общей памяти и блокировок, лежат так называемые «акторы», которые обмениваются асинхронными сообщениями при помощи специальных почтовых ящиков. В ответ на полученные сообщения, актор может принимать локальные решения, создавать акторов, посылать сообщения, а также устанавливать, как следует реагировать на последующие сообщения [5].

В работе рассматривается основанная на акторной модели система времени выполнения, и проводится исследование степени автоматизации предлагаемого метода программирования на основании анализа относительных размеров библиотечного, cгенерированного и рукописного кода. Анализ реализации акторной модели программирования на платформе Java, а также с использованием технологии MPI, был впервые представлен в работах авторов на конференции ПИТ-2016 [6, 7].

ОСОБЕННОСТИ ПРИМЕНЕНИЯ ПРЕДМЕТНОГО ЯЗЫКА

Автоматизация программирования при составлении задачи в системе Templet Web основана на концепциях скелетного программирования [8, 9], предметных языков и использовании специализированных визуальных редакторов предметных языков в составе интегрированной среды разработки (IDE).

В системе Templet Web используются несколько предметных языков для решения перечисленных ниже задач автоматизации научных вычислений: организации вычислений в парадигме «портфель задач» [10]; применения акторной модели вычислений, реализованной в общей и распределенной памяти [11]; ввода данных; вывода данных; вызова функций стандартных математических библиотек; описания серий экспериментов.

Для пояснения назначения предметных языков в системе Templet Web ниже приведен скелет программы параллельного умножения матриц в распределенной и разделяемой памяти.

Под скелетом программы понимается ее схематичное описание, по форме напоминающее псевдокод. В отличие от псевдокода, код скелета пишется на языке программирования высокого уровня (в данной системе – на С/С++) и компилируется. Однако, код скелета не компонуется и не исполняется потому, что в нем не содержится необходимая компоновщику информация. Этим скелет отличается от обычной программы.

Роль предметного языка в заключается в передаче той информации, которая отсутствует в скелете. То есть предметные языки в исследуемой технологии автоматизации необходимы, чтобы доопределить объекты в скелете программы. Передаваемая на предметном языке информация используется для того, чтобы выполнить автоматическое преобразование скелета в исполняемую программу.

const int N=10;

double a[N][N],b[N][N],c[N][N];

struct Result{ void save(ostream for(int j=0;j>c[num][j]; } int num;// номер вычисленной строки

};

struct Task{ void save(ostream&s){ s<>num; } int num;// номер вычисляемой строки

};

void Proc(Task// параллельное вычисление строки матрицы C for(int j=0;j

c[i][j]=0.0;

for(int k=0;k

} r.num=i;

} struct Bag{

Bag(int argc, char* argv[]);

void run();

bool isTask(){return cur

int main(int argc, char* argv[])

{

Bag bag(argc,argv);

// инициализация input(a,b);

// вывод результата параллельного умножения output(c);

start_time();

strassen(a,b,c); // теперь умножаем методом Штрассена end_time(); return 0;

}

В приведенном примере структуры Result, Task, Bag и функция Proc являются составными частями реализации метода организации вычислений «портфель задач». Это указано в аннотации на предметном языке, которая сопровождает приведенный код скелета программы умножения матриц (форма описания скелетов на DSL в данной статье не рассматривается).

Описание скелета программы содержит способ именования составных элементов метода «портфель задач», способ реализации в общей или распределенной памяти, количество используемых узлов и/или потоков выполнения и другие детали.

Скелет программы также содержит неопределенные процедуры input, output для ввода и вывода данных. Аннотация на предметном языке описывает привязку этих процедур к имеющимся в системе Templet Web пользовательским интерфейсам ввода-вывода данных.

В коде скелета программы имеется неопределенная процедура strassen. Это ссылка на реализацию соответствующего алгоритма умножения матриц Штрассена. Пользователь на предметном языке в визуальном редакторе может выбрать конкретную библиотечную реализацию алгоритма. При этом ему не требуется знать сигнатуру реальной функции в библиотеке и способ связи с этой библиотекой. Аналогично можно сделать привязку к другим библиотечным процедурам. Например, в задаче анализа хаотического движения гироскопов [12], решаемой с использованием описываемого метода, используются разные варианты численного интегрирования пользовательских функций.

Предметный язык описания серий экспериментов в системе Templet Web предназначен для автоматического построения кода серии экспериментов на основе программы для единичного эксперимента. Например, в коде скелета программы умножения матриц параметр N может изменяться в пределах, описанных на DSL. Также можно автоматически выполнять статистическую обработку результатов при замере производительности. Например, пара функций start_time(), end_time() может обозначать секцию кода с замером времени. Полученное в серии время можно автоматически усреднить, определить минимум и максимум, СКО, построить гистограмму функции распределения вероятности времени исполнения.

ОЦЕНКА СЛОЖНОСТИ ПРОГРАММНОЙ РЕАЛИЗАЦИИ

Для предметного языка, использующего акторную модель, был разработан пример тестовой программы. Пример подобран таким образом, чтобы быть достаточно простым (проверка выполнения тригонометрического тождества для заданного значения) и в тоже время использовать все возможности предметного языка. В качестве критерия сложности и степени автоматизации рассматриваются относительные размеры кода разных частей программы. Код примера размещен на сервисе GitHub по адресу: https://github. com/templet-language/newtemplet.

Содержательная часть примера состоит в следующем. Имеется три актора. Управляющий актор получает некоторое число x и передает его в двух сообщениях двум другим «рабочим» акторам. Первый из рабочих акторов вычисляет квадрат синуса полученного в сообщении числа, второй – квадрат косинуса. Вычисленные значения передаются управляющему актору. Получив ответы от двух рабочих акторов, управляющий актор складывает содержащиеся в ответных сообщениях числа. Таким образом, признаком корректного завершения алгоритма является значение 1, полученное в результате сложения управляющим актором значений sin2x и cos2x.

На предметном языке в данном случае аннотированы следующие классы: my_engine – класс системы времени выполнения; value_message – класс сообщения, содержащий вещественное число и тип сообщения; master – класс управляющего актора; worker – класс для двух рабочих акторов. Предметный язык предписывает, какие интерфейсы реализованы в перечисленных классах. Основные используемые в примере интерфейсы: интерфейс сохранения-восстановления состояния актора и сообщения, интерфейс для задания положения актора на вычислительном узле (необходимы в распределенной реализации), интерфейс для обработки поступающих сообщений от конкретного актора (2 интерфейса у управляющего и по 1 интерфейсу у рабочих акторов), интерфейсы для связывания акторов между собой для обмена сообщениями.

Код, реализующий пример, содержится в трех файлах. Файл lib/templet.hpp содержит систему времени выполнения для акторной модели вычислений. В примере имеются пять вариантов выполнения. Отладочное выполнение позволяет отладить логику работы программы на последовательной ЭВМ. В нем имитируются различные возможные последовательности отправки и доставки сообщений с использованием генератора случайных чисел. Также тестируется корректность сохранения-восстановления состояния акторов и сообщений.

Последовательное выполнение оптимизировано для вычислений на одном процессоре. Оно реализовано аналогично отладочному, за исключением кода для сохранения-восстановления и случайного выполнения программы.

Параллельное выполнение в общей памяти реализовано с использованием техники потокового пула и использует стандартные потоки версии ISO/IEC 14882:2011 языка С++. В работе используется пул фиксированного размера, количество потоков пула задается, исходя из аппаратных возможностей конкретной системы. В данной реализации произвольный актор может обслуживаться произвольным потоком из пула и наоборот.

Акторные библиотеки времени выполнения широко используются также на платформе Java. Функциональность рассматриваемой в работе акторной модели можно реализовать с использованием стандартной модели потоков Java, основанной на классе Thread. Дальнейшее исследование предполагает проверку трудоемкости и сравнительной эффективности акторного кода при исполнении нагрузочных тестов по сравнению с библиотеками Kilim [13, 14], Actors Guild [15], ActorFoundry [16], Akka [17]. В качестве технологии преобразования API потоков в акторную модель будет рассмотрена технология, применяемая в библиотеке templet.hpp. Вопросы эффективности параллельной реализации вычислений в данной работе не рассматриваются.

Библиотека templet.hpp также реализует дискретно событийное имитационное выполнение вычислений. Этот метод позволяет измерить потенциал распараллеливания программы на идеальном вычислителе, обладающим произвольным числом процессоров (т. н. паракомпью- тере). В результате имитационного выполнение вычисляются: максимальное число процессоров, которое может задействовать исследуемая программа; ускорение на паракомпьютере; ускорение на системе с заданным числом процессоров, оцененное с использованием закона Амдала.

Распределенная реализация акторной модели в библиотеке templet.hpp основана на разделении вычислений в программе на следующие этапы: (1) создание акторов в виде объектов/структур языка C++; (2) построение коммуникационной топологии путем связывания акторов каналами передачи сообщений; (3) определение привязки конкретных акторов к процессам MPI; (4) ввод исходных данных в программу; (5) выполнение вычислений; (6) вывод/сохранение результатов работы.

Этапы (4) и (6) выполняются исключительно на мастер-процессе MPI, этап выполнения вычислений (5) обычно выполняется на рабочих процессах, но так же можно использовать и мастер-процесс. Остальные этапы протекают для всех процессов. Алгоритм управления вычислениями основан на технике потокового пула в разделяемой памяти. Он предполагает, что акторный алгоритм является статическим в том смысле, что количество акторов и сообщений известно и не изменяется во время вычислений.

В табл. 1 представлены размеры частей кода библиотеки времени выполнения для рассматриваемого примера. Можно заметить крайне малый абсолютный и относительный размер кода интерфейса (759 байт, 4,5 %), связывающего библиотеку с остальным кодом. Это достигается благодаря простоте используемой модели акторов, а также способу сопряжения библиотеки с программой пользователя: код сопряжения строится автоматически по описанию на предметном

Часть кода

Размер части

байты

%

Объявление интерфейса системы времени выполнения

759

4,5

Отладочное выполнение (без сохранения/восстановления)

1362

8,1

Последовательное выполнение

1377

8,2

Параллельное выполнение

2091

12,4

Имитационное выполнение

2620

15,6

Распределенное выполнение (без сохранения/восстановления)

5739

34,1

Операции сохранения/восстановления

699

10,1

Прочий код (инструкции препроцессора языка C++)

1169

7,0

Всего (без разделителей и комментариев)

15816

100

Размер файла templet.hpp

22616

Таблица 2. Размеры частей кода примера программы проверки тригонометрического тождества (в байтах)

Часть кода Размер части байты % Код пользователя,всего 1143 100 В том числе: - логика вычислений, объявления данных 545 47,7 - описание связей между акторами, ввод/вывод 412 36,0 - анализ производительности при имитационном выполнении 186 16,3 Скелет программы, построенный по описанию на предметном языке 621 – Исполняемый код, построенный по описанию на предметном языке 2166 – языке. Поэтому детали сопряжения, например, инкапсуляция кода библиотеки внутри библиотеки не учитываются. За них отвечают подсистемы, связанные с обработкой предметного языка.

Варианты последовательного и отладочного выполнения реализуются относительно простым способом. Примерно в пять раз (по размеру кода) сложнее вариант распределенного выполнения. Имитационное и отладочное выполнение сложнее последовательного примерно в 1,5 раза. Однако код распределенного выполнения достаточно компактен (5739 байт).

В табл. 2 приведено сравнение частей кода, относящихся к логике взаимодействия акторов и логике вычислений тестовой задачи. Заметим, что доля вычислений по задаче, в силу ее простоты, незначительна (545 байт, 47,7 % процентов рукописного кода). Размер этой части кода практически не зависит от метода реализации: последовательного, параллельного с использованием OpenMP, распределенного с использованием MPI, рассматриваемого в работе метода на основе акторов. Поэтому пропорции кода пользователя в реальных примерах будут примерно соответствовать приведенным или изменяться в сторону увеличения части логики вычислений и объявления данных.

Размер скелета программы примерно в 3,5 раза меньше размера генерируемого из него исполняемого кода. Это наглядно показывает, что скелетное описание упрощает программирование. Полностью рукописная реализация примера на С++ с использованием стандартной библиотеки в акторном стиле потребовала бы 2166 + 15816 + 1143 = 19125 байт кода, в то время как пользователь в описываемой технологии вручную реализует лишь 1143 байта или около 6% от общего кода. Разумеется, сложность реализации сильно зависит от того, насколько метод распараллеливания решаемой задачи соответствует акторной модели. Однако, как показывает практика, большое число практически значимых задач хорошо отображаются на акторную модель вычислений.

ЗАКЛЮЧЕНИЕ

В текущей версии системы Templet Web, развернутой по адресу templet.ssau.ru/app на базе вычислительного кластера «Сергей Королёв» Самарского университета, в настоящее время поддерживаются предметный язык, использующий акторную модель вычислений Templet, и скелеты программ «портфель задач», «конвейер». Данная технология показала свою эффективность для решения прикладных задач анализа многомерных динамических систем и процессов при исследовании гироскопических систем ориентации космических аппаратов [12], а также при обучении студентов принципам работы на суперкомпьютере [3]. В дальнейшем планируется развивать данную технологию на основе подсистемы интегрированной среды разработки (IDE), встроенной в сервис Templet Web [18].

Список литературы Применение предметных языков и акторной модели для автоматизации высокопроизводительных вычислений

  • Ward M.P. Language-oriented programming//Software-Concepts and Tools, vol. 15, no. 4, pp. 147-161, 1994.
  • Dmitriev S. Language oriented programming: The next programming paradigm//JetBrains onBoard, vol. 1, no. 2, pp. 1-13, 2004.
  • Артамонов Ю.С., Востокин С.В. Применение облачного сервиса Templet Web при проведении лабораторных практикумов на суперкомпьютере «Сергей Королев» //Х Международная научно-практическая конференция «Современные информационные технологии и ИТ-образование», МГУ, Москва, 2015. Том 2. -С. 409-414.
  • Востокин С.В. Применение предметных языков для автоматизации высокопроизводительных вычислений//Перспективные информационные технологии (ПИТ 2016): труды Международной научно-технической конференции/под ред. С.А. Прохорова. -Самара: Издательство Самарского научного центра РАН, 2016. С. 490-493.
  • Ага Г., Мейсон И., Смит С., Талкотт К. Основания для вычислений акторов//Journal of Functional Programming, 1993.
  • Скорюпина Е.Г, Востокин С.В. Анализ реализаций акторной модели на платформе Java//Перспективные информационные технологии (ПИТ 2016): труды Международной научно-технической конференции/под ред. С.А. Прохорова. -Самара: Издательство Самарского научного центра РАН, 2016. С. 532-534.
  • Наширванов Д.М., Востокин С.В. Акторная модель для статических алгоритмов в распределенных системах с использованием интерфейса передачи сообщений MPI//Перспективные информационные технологии (ПИТ 2016): труды Международной научно-технической конференции/под ред. С.А. Прохорова. -Самара: Издательство Самарского научного центра РАН, 2016. С. 515-517.
  • Cole M. Bringing skeletons out of the closet: a pragmatic manifesto for skeletal parallel programming//Parallel computing, vol. 30, no. 3, pp. 389-406, 2004.
  • González-Vélez H., Leyton M. A survey of algorithmic skeleton frameworks: high-level structured parallel programming enablers//Software: Practice and Experience, vol. 40, no. 12, pp. 1135-1160, 2010.
  • Литвинов В.Г. Разработка и применение вычислительной модели типовых решений. Пример использования «портфеля задач» для обучения нейронной сети HRBF//Вестн. Сам. гос. техн. ун-та. Сер. Физ.-мат. Науки, 3(36) (2014). С. 183-195.
  • Востокин С.В. Templet: язык разметки для параллельного программирования//Известия Самарского научного центра РАН. Том 17, №2(5), 2015. С. 947-955.
  • Программный комплекс анализа многомерных динамических систем и процессов на суперкомпьютере «Сергей Королёв»/С.В. Востокин, А.В. Дорошин, Ю.С. Артамонов, Ю.П. Назаров//Управление движением и навигация летательных аппаратов: сборник трудов XVI Всероссийского семинара по управлению движением и навигацией летательных аппаратов. -Самара: Издательство СНЦ РАН, 2013. С. 60-63.
  • Вторая волна разработки Java-приложений: Представляем Kilim. URL: https://www.ibm.com/developerworks/ru/library/j-javadev2-7/(дата обращения 27.08.2016).
  • Srinivasan S., Mycroft A. Kilim: Isolation-Typed Actors for Java (A Million Actors, Safe Zero-Copy Communication), University of Cambridge Computer Laboratory. URL: https://www.cl.cam.ac.uk/research/srg/opera/publications/papers/kilim_ecoop08.pdf (дата обращения 27.08.2016).
  • Официальный сайт Actors Guild. URL: https://github.com/timjansen/actorsguild (дата обращения 27.08.2016).
  • Официальный сайт ActorFoundry. URL: http://osl.cs.illinois.edu/software/actor-foundry/(дата обращения 27.08.2016).
  • Официальный сайт Akka. URL: http://akka.io/(дата обращения 27.08.2016).
  • Царёв Д.А., Артамонов Ю.С. Сравнение основных возможностей и классификация облачных инструментов разработки//Перспективные информационные технологии (ПИТ 2016): труды Международной научно-технической конференции/под ред. С.А. Прохорова. -Самара: Издательство Самарского научного центра РАН, 2016. С. 539-542.
Еще
Статья научная