Курова М. Е., Шмаков Ю. Д.

Национальный горный университет, Украина

Анализ средств разработки программного обеспечения для задач  параллельного программирования

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

До последнего времени, в связи с высокой стоимостью аппаратной части компьютеров, возможность работать с многопроцессорными системами была доступна лишь ограниченному числу разработчиков. Несколько лет назад, с появлением многоядерных процессоров появилась возможность обеспечить реальный параллелизм на базе одного процессора, что вызвало огромный интерес к этим задачам широких кругов разработчиков программного обеспечения (ПО). Многоядерные процессоры, распределяя работу и задачи между независимыми ядрами, обеспечивают более высокую производительность при меньшем энергопотреблении. С точки зрения разработчика ПО, для реализации параллельных алгоритмов вычислений необходимо выполнить декомпозицию поставленной задачи на отдельные процессы (потоки). Такая процедура получила название распараллеливания алгоритмов.

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

Основные характеристики наиболее распространенных средств разработки параллельных приложений представлены в таблице 1.

Таблица 1

Средства разработки параллельных приложений

Библиотека\

Пакет

(Реализация)

Аппаратная платформа

Программная платформа

Среда разработки

Доступность

Open MP(Architecture Review Board (ARB))

Sun, HP, DEC, SGI, IBM PC и др.

Разные

Fortran и C/C++, VC++

Бесплатная

PVM(Окридж-ская нац. лаб., Атланта)

IBM, Cray, DEC, HP, Sun, SGI

Разные

Языки С, С++, VC++, Fortran77

Бесплатная

PThreads

(IEEE)

Разные

Unix, Linux, Solaris, Microsoft Windows

Языки С, С++, VC++

Бесплатная

DVM-система (ИПМ им. М.В.Келдыша)

Обычные (последователь-ные ЭВМ) ;

параллельные ЭВМ (МВС-100, HP Convex SPP-1000)

GNS или ОС Router +

Фортран /Си-DVM, Фортран-77/Си, Фортран/Си, C-DVM и Fortran-DVM

Бесплатная

Java FJTask(SunMic-rosystems)

Разные

Windows 95 и выше

Java начиная с версии 1.5

Бесплатная

2KLIB

IBM PC

MSDOS

Borland C++ 3.1

Бесплатная

MPI(MPI Software Technology)

Разные

Linux, Solaris, Windows

Языки С, С++, VC++, Фортран 90

Коммерческая

/бесплатная

MPICH/ MPICH2(Ара-гонская лаб., США)

IBM, Cray, SiCortex, Microsoft, Intel, NetEffect, Qlogic, Myricom, UBC

Linux, Solaris, Windows

Языки С, С++, VC++, BC++ Builder, Фортран 90

 

Бесплатная

Одним из наиболее популярных средств программирования на компьютерах с общей памятью, базирующихся на традиционных языках программирования и использовании специальных комментариев является интерфейс Open MP [1]. Он задуман как стандарт для программирования на масштабируемых SMP-системах (симметричных мультипроцессорных архитектурах), таких как SSMP, ccNUMA, и т.д. в модели общей памяти (shared memory model). Open MP отличает относительная простота использования (не нужно вникать в передачу сообщений), способность автоматического распределения данных в памяти при помощи директив, возможность поддержки инкрементального параллелизма (работать можно над одной частью программы, не заботясь о других частях), снижение вероятности возникновения ошибки за счет последовательных участков кода, не нуждающихся в переделке. Он обеспечивает как детальный, так и более грубый параллелизм, и не требует наличия отдельного ПО (все вызовы реализованы в библиотеке, подключаемой статически либо динамически). Однако он может работать только на платформах с разделенной памятью и требует необходимости наличия OpenMP-совместимого компилятора. К его недостаткам следует отнести и ограничение расширяемости архитектурой памяти, а также отсутствие удобной обработки ошибок и четкого механизма распределения нитей по процессорам. Кроме того, Open MP свойствен запрет синхронизации подмножества нитей - из всего множества примитивов синхронизации присутствует только барьер (примитив синхронизации, применяемый главным образом в вычислительных задачах MPI/OpenMP).

Особенностью стандарта PVM (Parallel Virtual Machine) является возможность совместного использования группы компьютеров для взаимосвязанных или параллельных вычислений. PVM реализована в виде программного пакета, позволяющего связывать гетерогенную (неоднородную) коллекцию компьютеров в сеть для использования ее в качестве единого мощного параллельного компьютера [1,3]. Этот пакет имеет ряд достоинств, к которым относят простота в освоении и гибкость в использовании (по сравнению с OpenMP и MPI соответственно), способность работы в гетерогенных средах, наличие привязки к языкам С, Fortran [1]. К недостаткам можно отнести относительно сложный интерфейс прикладной программы API, необходимость конфигурации процессов во время написания программы и установки на все клиенты вычислительного комплекса специализированного ПО. Следует отметить, что этот пакет сравнительно мало распространен.

Возможность переноса средств разработки ПО для параллельных вычислений на различные аппаратные платформы наиболее удобно реализована в стандарте Pthreads. Он представляет собой набор интерфейсов поточной обработки, разработанный комитетами Института инженеров по электротехнике и электронике (IEEE), отвечающими за спецификацию интерфейса POSIX [1,4]. Стандарт обладает рядом преимуществ, главным из которых является возможность поддержки практически в каждой UNIX-подобной системе [1]. Он также подразумевает наличие в системе библиотек и поддержку различных примитивов синхронизации. К недостаткам следует отнести наличие максимальной эффективности только на SMP-архитектурах, низкоуровневость, сложность в обращении и отсутствие простых привязок к FORTRAN, а также недостаточная оптимизация в ОС Linux.

Из разработок, выполненных в странах СНГ следует отметить DVM – систему, разработанную в ИПМ им.Келдыша. Она предназначена для создания переносимых и эффективных вычислительных приложений на языках C-DVM и Fortran-DVM для параллельных компьютеров с различной архитектурой [2]. DVM-система обеспечивает повышение эффективности работы приложений параллельного программирования и объединяет достоинства моделей параллелизма как по данным, так и по управлению. Она обладает рядом преимуществ, основными из которых являются простота разработки параллельных программ, мобильность среди различных архитектур ЭВМ (последовательных и параллельных), высокая эффективность выполнения программы, повторное использование (композиция параллельных приложений из нескольких модулей), единая модель параллелизма для языков Си и Фортран 77. Существенным ограничением данной системы является предоставление параллельных расширений только для  языков Фортран 77 и Си , в то время как расширения языков Фортран 90/95 и Си++ отсутствуют.

Существует  множество высокоуровневых библиотек распараллеливания, которые предназначены как для расширения базовых возможностей многопоточности в различных языках программирования, так и для добавления решений для некоторых часто встречающихся задач. Одним из наиболее важных компонентов, который  в настоящее время доступен в виде отдельной библиотеки, является среда Java FJTask, реализующая концепцию параллелизма "разветвление-объединение" для Java [7]. Эта среда предназначена, в первую очередь, для распараллеливания сложных вычислений, таких как численное интегрирование или перемножение матриц. Главным преимуществом является наличие "параллелизма на основе задач" (не поддерживают блокировку операций любого рода). Основным недостатком является то, что задачи FJTask не предназначены для поддержки произвольной синхронизации, поскольку не существует способа приостановить, а затем продолжить выполнение отдельных задач после того, как они были запущены. Кроме того, время выполнения задач FJTask должно быть ограничено, и они не должны содержать бесконечных циклов.

Менее распространенной библиотекой параллельного программирования считается 2KLIB - разрабатывалась как средство программирования систем реального времени [6], представляющее собой параллельное расширение языка Си++, которое дает программисту набор понятий-классов, позволяющих строить программу в терминах параллельных процессов и их взаимодействий. К достоинствам 2KLIB относят возможность разделения времени процессора за счет квази-параллельных процессов в DOS-программе, а также способность предоставления этой программе надстроечную многозадачную операционную среду. Существенной особенностью, ограничивающей использование этой библиотеки является то, что она предназначена только для программирования встроенных микро-ЭВМ, используемых для автоматизации технологических процессов и работающих под управлением MSDOS.

Одним из наиболее известных инструментов для разработки параллельного ПО является MPI (Message Passing Interface) — интерфейс  обмена сообщениями (информацией) между одновременно работающими вычислительными процессами [5]. Он является одним из старейших стандартов и широко используется для создания параллельных программ для вычислительных систем с распределённой памятью (кластеров) [1]. К его преимуществам можно отнести чрезвычайно высокую производительность, открытость его стандарта,  наличие множества реализаций для различных языков программирования и архитектур, а также поддержка многих примитивов синхронизации. К его недостаткам относятся сложность в освоении и использовании,  а также сложность портирования отдельных существующих реализаций под новую архитектуру в силу низкоуровневости стандарта. Кроме того, необходима установка библиотеки MPI на все составляющие программного комплекса для запуска приложений с параллельными алгоритмами.

Для MPI  разработаны пакеты, обеспечивающие более удобную реализацию параллельного программирования. В настоящее время наиболее раcпространены два таких пакета: MPICH и MPICH2.

Одной из самых первых разработанных для интерфейса MPI библиотек является пакет MPICH («MPI Chameleon»). Основным преимуществом MPICH, по сравнению с другими пакетами, является то, что интерфейс может работать как на сети ПК, так и на компьютерах с процессорами на общей памяти. Кроме того, MPICH содержит огромный набор функций для передачи сообщений (порядка нескольких сотен) и поддерживается многими платформами. Дополнительное преимущество состоит в том, что это программное обеспечение свободно распространяемое [8].

MPICH2 — это быстродействующий и широко портируемый пакет, реализующий стандарт MPI [5]. К его преимуществам относят эффективную поддержку различных вычислительных и коммуникационных платформ, включая общедоступные кластеры (настольные системы, системы с общей памятью, многоядерные архитектуры), высокоскоростные сети (Ethernet 10 ГБит/с, InfiniBand, Myrinet, Quadrics) и эксклюзивные вычислительные системы (Blue Gene, Cray, SiCortex).

Пакетам MPICH и MPICH2 свойственны те же недостатки, что и библиотеке MPI в целом.

На основании выполненного выше анализа можно сделать вывод, что наиболее достойным средством разработки для задач параллельного программирования является MPI в силу его работоспособности практически на всех вычислительных системах. На базе MPI существует несколько десятков технологий параллельного программирования (наиболее популярной из них является DVM). А также, модель программирования MPI обеспечивает высокую эффективность ввода-вывода и позволяет задействовать преимущества разделяемой памяти и быстродействующих соединений. В отличие от прочих средств разработки, является максимально портируемым (работаюшим на любой аппаратной платформе), базовым (на нем основано большинство параллельных программ) и удобным инструментом.

Литература:

1.                http://konstantin.solnushkin.ru/teaching/reports/supercomp_arch/2007/mpi_openmp_pvm_pthreads.pdf

2.                http://www.keldysh.ru/dvm/dvmhtm1107/rus/index.html

3.                  Хьюз К., Хьюз Т. Параллельное и распределенное программирование с использованием c++.: – Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 672 с.: ил. – Парал. тит. англ.

4.                http://software.intel.com/ru-ru/articles/threading-models-for-high-performance-computing-pthreads-or-openmp/

5.                http://iproc.ru/programming/mpich-windows/

6.                http://gurin.tomsknet.ru/2klib.html

7.                http://software.intel.com/ru-ru/articles/writing-parallel-programs-a-multi-language-tutorial-introduction/

8.                http://oldunesco.kemsu.ru/mps/html/node2.htm