SPRING PPI - СИСТЕМА ПАТТЕРН – ОРИЕНТИРОВАННОГО ПАРАЛЛЕЛЬНОГО ПРОГРАММИРОВАНИЯ
(тезисы доклада)

Балтин Д.Б. Андрюхин А.И.

III Международная конференция студентов, аспирантов и молодых ученых "КОМПЬЮТЕРНЫЙ МОНИТОРИНГ И ИНФОРМАЦИОНЫЕ ТЕХНОЛОГИИ" ДонНТУ 22-24 мая 2007 г.



Принципы разработки сложных программных продуктов комплексов постоянно эволюционируют и совершенствуются. Объектно-ориентированный подход является неотъемлемой частью и главной методологией проектирования программных систем в настоящее время. Существующие сейчас библиотеки параллельного программирования, такие как, написанная на C и Fortran, MPI или, например, NESL, Charm++ и т.д. очень низкоуровневые, ориентированные только на процедурную или функциональную модель программирования и, таким образом, не совместимы с современным объектно-ориентированным стилем проектирования приложений.

Основными целями Spring PPI являются:
- создание высокоуровневой модели параллельного программирования полностью интегрированной с объектно-ориентированным стилем проектирования;
- реализация паттернов параллельного программирования, как универсального подхода к разработке качественного программного обеспечения;
- реализация отказоустойчивой среды выполнения параллельных программ, позволяющих писать программы независимые от числа и конфигурации узлов кластера;
- простота внедрения и возможность использования всех возможностей .NET Framework при создании параллельных приложений.

Spring PPI написана на C# и реализована в виде 2-х составляющих: фреймворка параллельного программирования и Run-time системы.

Фреймворк предоставляет программисту интерфейс для создания параллельных приложений. Используя интерфейс фреймворка, программист взаимодействует с Run-time системой, которая обеспечивает корректное выполнение удаленных методов на узлах кластера и поддерживает функционирование каналов, как средства обмена сообщениями между удаленными методами.

Паттерн представляет собой «высококачественное решение часто встречающейся проблемы при проектировании в определенной предметной области» [1].

Так как проектирование параллельных программ очень трудоемкий и сложный процесс. Необходима разработка методологии, позволяющей упростить и повысить надежность, понятность параллельных приложений[2]. Фреймворк Spring PPI позволяет программисту разрабатывать параллельные приложения, опираясь исключительно на паттерн - ориентированный подход к проектированию.

Spring PPI реализует работу со следующими паттернами параллельного проектирования:
1. Singleton[3] – базовый, элементарный паттерн, который инкапсулирует в себе выполнение одного удаленного метода на кластере.

2.Паттерн Pipeline применяется, когда «задача может быть разделена на последовательность задач, связанных зависимостью при использовании данных»[3].
Pipeline в Spring PPI представляет собой последовательность (цепочку) Singleton’ов, которые вызываются один за другим. Причем функциональность паттерна разработана таким образом, что выходные данные очередного элемента цепочки могут служить входными данными для обработки последующему элементу (однако это не является обязательным).

3. Паттерн Master-Slave[3] реализует отношение между удаленными методами «главный-подчиненный». Схема работы паттерна следующая: существует главный процесс – Master и несколько подчиненных процессов - Slaves. В Spring PPI паттерн реализован так, что главный процесс может взаимодействовать с подчиненными путем посылки сообщений разного типа. Каждый подчиненный процесс для каждого типа сообщения имеет соответствующий обработчик. Таким образом, взаимодействие между главным и подчиненными процессами можно сравнить с механизмом генерации и обработки событий.

4. Паттерн Divide and Conquer[4](«Разделяй и властвуй») в Spring PPI может описывать сложную древовидную иерархию задач (Singleton’ов). Задачи в дереве связаны отношением «родитель-потомок» («parent-child»). Каждый «родитель» может иметь несколько «потомков» и, что очень важно, каждый «потомок» может иметь несколько «родителей». Общее правило функционирования паттерна таково, что каждый «потомок» запускается автоматически только тогда, когда каждый его «родитель» завершил работу.

5. Repository[4] («хранилище») - паттерн описывающий логику работы процессов (удаленных методов) с общей памятью. Для доступа к хранилищу используется класс SharedMemory. Все хранилище разбивается на ячейки (cells), каждая ячейка имеет свой уникальный идентификатор (ID) строкового типа. В ячейке может храниться объект любого типа - от булевого типа до сложной иерархии разнотипных объектов. Процесс записи и чтения данных из ячейки основан на механизме сериализации.

В качестве демонстрации работоспособности и эффективности предложенной модели параллелизма основанного на паттернах, с помощью интерфейса Spring PPI были реализованы классические алгоритмы параллельного умножения матриц: Фокса, Кеннона и ленточный. При проведении тестов все три алгоритма показали достаточно высокий уровень масштабируемости, что говорит о масштабируемости самой Run-time системы Spring PPI.

Литература
1. K. Alexander et al. Pattern Language. Oxford 1977.
2. Foster I. Designing and Building Parallel Programs. — Addison Wesley.
3. Massingill, B.L., Mattson, T.G., Sanders, B.A.: A pattern language for parallel application programming. Technical Report CISE TR 99-022, University of Florida, 1999
4. Berna Massingill. Patterns for Finding Concurrency for Parallel Application Programs.: Department of Computer Science and Engineering, University of Florida, Gainesville

© Балтин Д.Б. Андрюхин А.И.
III Международная конференция студентов, аспирантов и молодых ученых "КОМПЬЮТЕРНЫЙ МОНИТОРИНГ И ИНФОРМАЦИОНЫЕ ТЕХНОЛОГИИ" ДонНТУ 22-24 мая 2007 г.