Р. И. Идрисов
ОБЛАЧНЫЙ СЕРВИС ДЛЯ НАУЧНЫХ ВЫЧИСЛЕНИЙ
И ОБРАЗОВАНИЯ 1
ВВЕДЕНИЕ
На сегодняшний день всё большую популярность набирают облачные
сервисы. Конечно, зачастую под активно употребляемым словом «облачный» скрываются обычные вещи, которые просто были названы по-новому.
Согласно последней редакции российской Википедии2, на момент написания статьи облачный сервис – это просто некоторый доступный ресурс в сети, который может быть использован без знания его внутренней структуры.
Статистика поисковых запросов в некотором смысле отражает интересы общества. Если проследить статистику Google3 по двум терминам – «parallel» и «cloud», можно увидеть, что популярность «cloud» c 2004 года выросла вдвое и продолжает расти, а популярность «parallel», наоборот, неуклонно падает и с 2004 года сократилась вдвое. Рост популярности этого термина обусловлен тем, что облачность представляет пользовательский интерфейс для использования какого-то ресурса. Сам термин «облачный»
по одной из версий образовался из того, что Интернет изображался в виде облака: скрытая от пользователя структура, находящаяся в сети и является этим самым облаком. И хотя концепция появилась уже давно, но, как и с функциональными языками программирования, которые были описаны задолго до их популярности, массовое применение облачности стало возможным с развитием соответствующих технологий.
Продолжают набирать популярность облачные хостинги Amazon, cloud9, которые предоставляют вычислительные ресурсы. В частности, они позволяют выполнять код на V8 (JavaScript от Mozilla). Этот язык во многом совместим с браузерным JavaScript, что позволяет создавать переносимый код. Одна и та же программа может быть исполнена как на персональной рабочей станции, так и на потенциально мощном облачном вычислитеРабота поддержана грантом РФФИ № 12-07-31060 мол_а.
http://ru.wikipedia.org http://www.google.com/insights/search/ 58 Информатика в науке и образовании ле. При этом переносимость в данном случае совсем не такая, как в случае Java. Программное обеспечение не требует дополнительной установки библиотек поддержки времени исполнения, а выполняется внутри браузера.
Кроме того, это исполнение предполагается безопасным для пользователя.
Растущее количество сервисов в сети Интернет, предоставляющих различные услуги, прямо или косвенно связанные с вычислениями, говорит о популярности такого подхода. Возможность в любой момент зайти на соответствующую страницу в сети и выполнить интересующий код, не имея компилятора, очень привлекательна. Подобные сервисы варьируют от совершенно аскетичных, рассчитанных на исключительно короткие программы4, до предоставляющих среду разработки с группировкой по проектам, подсветкой синтаксиса5 и т.д.
Несмотря на большое количество таких ресурсов, определённая ниша всё же остаётся незаполненной. В частности, нет таких ресурсов, которые предоставляли бы возможность отладить и запустить научную задачу с массивным параллелизмом.
Следует отметить, что такой подход не является чем-то абсолютно новым, из-за большого количества разных параллельных систем разработчики стараются использовать переносимые варианты, которые могут быть исполнены в различных условиях, в тех случаях, когда речь не идёт о специальном программном обеспечении для конкретного вычислителя.
В этой статье мы опишем систему поддержки параллельного программирования для облачных вычислений, разрабатываемую в ИСИ СО РАН.
Дальнейшее изложение организованно следующим образом: в первой главе обсуждается входной язык для системы; во второй главе мы рассмотрим возможности системы с точки зрения пользователя и то, как образовательные задачи могут сочетаться с научными. В заключении будет приведён текущий статус разрабатываемой системы.
ИСПОЛЬЗУЕМЫЙ ЯЗЫК
Разрабатываемая система ставит перед собой две цели: научную и образовательную. С нашей точки зрения, для научной цели более важна масштабируемость, а для образовательной – доступность. Кроме того, было бы неправильно ориентироваться только на один язык программирования, поскольку не существует единого мнения о наилучшем учебном языке. Для http://codepad.org http://c9.io – Cloud Идрисов Р.И. Облачный сервис для научных вычислений и образования масштабируемости требуется универсальность описания параллелизма: это значит, что программа не должна быть адаптирована для структуры конкретной вычислительной системы. Согласно работам А. П. Ершова это достигается, если язык программирования приближается к языку описания задач, а не к языку описания алгоритмов. В Институте систем информатики СО РАН мы продолжаем разработку потокового языка программирования Sisal [1] [2], эта работа ставит перед собой именно такие цели. Рассмотрим некоторые возможности Sisal в сравнении с другими языками для параллельного программирования.Однократное присваивание Как и многие функциональные языки программирования, Sisal использует однократное присваивание. Этот подход в программировании требует, чтобы каждое значение описывалось в программе только один раз и не изменялось (не присваивалось повторно). Некоторые могут сказать, что любая императивная программа может быть приведена к форме с однократным присваиванием, и что использование подобных ограничений не имеет смысла. Рассмотрим следующий пример на языке Си:
int g=0;
void foo(void) { g=1; } В этом случае для приведения программы к форме с однократным присваиванием требуется обозначить новую копию глобальной переменной g в момент определения, но этого нельзя сделать внутри функции, а это было бы удобно, поскольку функция может быть не вызвана. Конечно, если записать программу полностью, то такая ситуация будет разрешимой, но для этого потребуется привлечение дополнительных методик анализа и проверок. Идея заключается в том, что программирование в рамках семантики однократного присваивания это нечто вроде исключения оператора goto, которое не только упрощает анализ, но и положительным образом сказывается на описании алгоритма.
Массивы и потоки Использование этих типов данных не является обычным для функциональных языков программирования, где, как практически всё по возможности выражается в терминах списков и рекурсии. Но массивы существенно упрощают некоторые задачи вычислительного программирования, в частности, с массивами существенно понятней становится описание матрицы.
При этом массивы сами по себе не являются императивным или последоваИнформатика в науке и образовании тельным элементом. Покомпонентное перемножение векторов на языке Sisal можно определить следующим образом:
for i in 1, N repeat R := A[i] * B[k] returns array of R Многословный синтаксис Это свойство делает программы более читаемыми (проще для человеческого восприятия), и, как результат, долгосрочная поддержка таких программ упрощается. Большинство функциональных языков программирования «страдают» от слишком короткой записи, что, с одной стороны, позволяет описывать алгоритмы более коротко и выразительно, с другой – усложняет понимание этих алгоритмов. Как следствие, гораздо меньше людей в принципе способны на такое программирование. В качестве примера приведём известную программу быстрой сортировки на языке Haskell:
qsort :: Ord a => [a] -> [a] qsort (x:xs) = qsort [y | y 2 then let L, Middle, R := for E in Data returns array of E when E < Data[ 1 ] array of E when E = Data[ 1 ] array of E when E > Data[ 1 ] end for qsort( L ) || Middle || qsort( R ) end let else Data end if end function На сегодняшний день достаточно популярен механизм try-catch, но он не является естественным для параллельных программ, поскольку требует досрочного завершения определённого участка кода при возникновении ошибки, что приводит к откату части параллельных вычислений, выполИдрисов Р.И. Облачный сервис для научных вычислений и образования няемых в данный момент, либо к потере детерминизма программы. Рассмотрим пример на языке Java: