Смекни!
smekni.com

Алгоритмы параллельных процессов при исследовании устойчивости подкрепленных пологих оболочек (стр. 5 из 10)

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

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

Еще одной проблемой, связанной с использованием параллельных алгоритмов, является балансировка нагрузки. Например, поиск простых чисел в диапазоне от 1 до 100000 легко распределить между имеющимися процессорами, однако некоторые процессоры могут получить больший объем работы, в то время как другие закончат обработку раньше и будут простаивать. Проблемы балансировки нагрузки еще больше усугубляется при использовании гетерогенных вычислительных сред, в которых вычислительные элементы существенно отличаются по производительности и доступности (например, в грид-системах).

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

В данной работе был выбран интерфейс MPI для распараллеливания процесса, так как он наиболее удобен для создаваемого программного пакета. Ведь заранее неизвестно, какие вычислительные машины и какой конфигурации будут использоваться. MPI позволяет эмулировать[3] вычислительные машины на ядрах одного процессора, что, в некоторых случаях, гораздо более эффективнее при вычислениях.

3.1 Message Passing Interface

Message Passing Interface (MPI, интерфейс передачи сообщений) - программный интерфейс (API) для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. Разработан Уильямом Гроуппом, Эвином Ласком и другими.

MPI является наиболее распространённым стандартом интерфейса обмена данными в параллельном программировании, существуют его реализации для большого числа компьютерных платформ. Используется при разработке программ для кластеров и суперкомпьютеров. Основным средством коммуникации между процессами в MPI является передача сообщений друг другу. Стандартизацией MPI занимается MPI Forum. В стандарте MPI описан интерфейс передачи сообщений, который должен поддерживаться как на платформе, так и в приложениях пользователя. В настоящее время существует большое количество бесплатных и коммерческих реализаций MPI. Существуют реализации для языков Фортран 77/90, Си и Си++.

Стандарты MPI

Большинство современных реализаций MPI поддерживают версию 1.1 Стандарт MPI версии 2.0 поддерживается большинством современных реализаций, однако некоторые функции могут быть реализованы не до конца.

В MPI 1.1 (опубликован 12 июня1995 года) поддерживаются следующие функции:

передача и получение сообщений между отдельными процессами;

коллективные взаимодействия процессов;

взаимодействия в группах процессов;

реализация топологий процессов;

В MPI 2.0 (опубликован 18 июля1997 года) дополнительно поддерживаются следующие функции:

динамическое порождение процессов и управление процессами;

односторонние коммуникации (Get/Put);

параллельный ввод и вывод;

расширенные коллективные операции (процессы могут выполнять коллективные операции не только внутри одного коммуникатора, но и в рамках нескольких коммуникаторов).

Пример программы

Ниже приведён пример программы на C с использованием MPI:

// Подключение необходимых заголовков

#include <stdio. h>

#include <math. h>

#include "mpi. h"

// Функция для промежуточных вычислений

double f (double a)

{

return (4.0/ (1.0+ a*a));

}

// Главная функция программы

int main (int argc,char**argv)

{

// Объявлениепеременных

int done = 0, n, myid, numprocs, i;

double PI25DT =3.141592653589793238462643;

double mypi, pi, h, sum, x;

double startwtime = 0.0, endwtime;

int namelen;

char processor_name [MPI_MAX_PROCESSOR_NAME] ;

// Инициализация подсистемы MPI

MPI_Init (&argc,&argv);

MPI_Comm_size (MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank (MPI_COMM_WORLD,&myid);

MPI_Get_processor_name (processor_name,&namelen);

// Вывод номера потока в общем пуле

fprintf (stdout, "Process%d of%d is on%s&bsol;n", myid,numprocs,processor_name);

fflush (stdout);

while (! done)

{

// количество интервалов

if (myid==0)

{

fprintf (stdout, "Enter the number of intervals: (0 quits)");

fflush (stdout);

if (scanf ("%d",&n) ! =1)

{

fprintf (stdout, "No number entered; quitting&bsol;n");

n =0;

}

startwtime = MPI_Wtime ();

}

// Рассылка количества интервалов всем процессам (в том числе и себе)

MPI_Bcast (&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

if (n==0)

done =1;

else

{

h = 1.0/ (double) n;

sum =0.0;

// Обсчитывание точки, закрепленной за процессом

for (i = myid + 1; (i <= n);i += numprocs)

{

x = h * ( (double) i - 0.5);

sum += f (x);

}

mypi = h * sum;

// Сброс результатов со всех процессов и сложение

MPI_Reduce (&mypi,&pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

// Если это главный процесс, вывод полученного результата

if (myid==0)

{

printf ("PI is approximately%.16f, Error is%.16f&bsol;n", pi, fabs (pi - PI25DT));

endwtime = MPI_Wtime ();

printf ("wall clock time =%f&bsol;n", endwtime-startwtime);

fflush (stdout);

}

}

}

// Освобождениеподсистемы MPI

MPI_Finalize ();

return0;

}

Реализации MPI

MPICH - самая распространённая бесплатная реализация, работает на UNIX-системах и Windows NT;

WMPI - бесплатная реализация MPI для Windows;

LAM/MPI - ещё одна бесплатная реализация MPI;

MPI/PRO for Windows NT - коммерческая реализация для Windows NT;

Intel MPI - коммерческая реализация для Windows / GNU/Linux;

HP-MPI - коммерческая реализация от HP;

SGIMPT - платная библиотека MPI от SGI;

Mvapich - бесплатная реализация MPI для Infiniband;

Open MPI - бесплатная реализация MPI, наследник LAM/MPI;

Oracle HPC ClusterTools - бесплатная реализация для SolarisSPARC/x86 и Linux на основе Open MPI.

3.2 MPICH

MPICH ("MPI Chameleon") - это одна из самых первых разработанных библиотек MPI. На ее базе было создано большое количество других библиотек как OpenSource, так и коммерческих. В настоящее время существует две ветви исходных кодов: MPICH1и MPICH2. Разработка ветви MPICH1 заморожена. Ветвь MPICH2 активно разрабатывается в Арагонской лаборатории, с участием IBM, Cray, SiCortex, Microsoft, Intel, NetEffect, Qlogic, Myricom, Ohio state university, UBC.

MPICH2 - легко портируемая быстрая реализация стандарта MPI. Отличительные особенности:

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

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

В дальнейшем будем предполагать, что имеется сеть из нескольких компьютеров (будем называть их вычислительными узлами), работающих под управлением Windows. Для учебных целей можно запускать все вычислительные процессы и на одном компьютере. Если компьютер одноядерный, то, естественно, прирост быстродействия не получится, - только замедление. В качестве среды разработки использовалась IDE Microsoft Visual Studio 2008 C++ Express Edition. Microsoft Visual Studio - линейка продуктов компании Майкрософт, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Microsoft Visual Studio 2008 C++ Express Edition - легковесная среда разработки, представляющая собой урезанную версию Visual Studio. В отличие от полной версии, такая среда предназначена для языка программирования C/C++. Она включает в себя небольшой набор инструментов, в отличие от полных версий: отсутствует дизайнер классов и многие другие инструменты, а также поддержка плагинов и удалённых баз данных в дизайнере данных. Компиляторы в 64-битный код также недоступны в Express редакциях. Microsoft позиционирует эту линейку IDE для студентов. Программу, использующую MPI, и предназначенную для запуска на нескольких вычислительных узлах, будем называть MPI-программой.

3.3 Принципы работы MPICH

MPICH для Windows состоит из следующих компонентов:

Менеджер процессов smpd. exe, который представляет собой системную службу (сервисное приложение). Менеджер процессов ведёт список вычислительных узлов системы, и запускает на этих узлах MPI-программы, предоставляя им необходимую информацию для работы и обмена сообщениями;

Заголовочные файлы (. h) и библиотеки стадии компиляции (. lib), необходимые для разработки MPI-программ;

Библиотеки времени выполнения (. dll), необходимые для работы MPI-программ;

Дополнительные утилиты (. exe), необходимые для настройки MPICH и запуска MPI-программ.

Все компоненты, кроме библиотек времени выполнения, устанавливаются по умолчанию в папку C: &bsol;Program Files&bsol;MPICH2; dll-библиотеки устанавливаются в C: &bsol;Windows&bsol;System32.

Менеджер процессов является основным компонентом, который должен быть установлен и настроен на всех компьютерах сети (библиотеки времени выполнения можно, в крайнем случае, копировать вместе с MPI-программой). Остальные файлы требуются для разработки MPI-программ и настройки "головного" компьютера, с которого будет производиться их запуск.

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

Когда один менеджер процессов обращается к другому менеджеру процессов, он передаёт ему свой пароль.

Отсюда следует, что нужно указывать один и тот же пароль при установке MPICH на компьютеры сети.

Рис.4. Схема работы MPICH на кластере.