Системы с общей памятью требуют введения дополнительных блокировок для обрабатываемых данных, налагая определенные ограничения при использовании дополнительных процессоров.
Системы передачи сообщений используют понятия каналов и блоков сообщений, что создает дополнительный трафик на шине и требует дополнительных затрат памяти для организации очередей сообщений. В дизайне современных процессоров могут быть предусмотрены специальные коммутаторы (кроссбары) с целью уменьшения влияния обмена сообщениями на время выполнения задачи.
Еще одной проблемой, связанной с использованием параллельных алгоритмов, является балансировка нагрузки. Например, поиск простых чисел в диапазоне от 1 до 100000 легко распределить между имеющимися процессорами, однако некоторые процессоры могут получить больший объем работы, в то время как другие закончат обработку раньше и будут простаивать. Проблемы балансировки нагрузки еще больше усугубляется при использовании гетерогенных вычислительных сред, в которых вычислительные элементы существенно отличаются по производительности и доступности (например, в грид-системах).
Разновидность параллельных алгоритмов, называемая распределенными алгоритмами, специально разрабатываются для применения на кластерах и в распределенных вычислительных системах с учетом ряда особенностей подобной обработки.
В данной работе был выбран интерфейс MPI для распараллеливания процесса, так как он наиболее удобен для создаваемого программного пакета. Ведь заранее неизвестно, какие вычислительные машины и какой конфигурации будут использоваться. MPI позволяет эмулировать[3] вычислительные машины на ядрах одного процессора, что, в некоторых случаях, гораздо более эффективнее при вычислениях.
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\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\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\n", pi, fabs (pi - PI25DT));
endwtime = MPI_Wtime ();
printf ("wall clock time =%f\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.
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-программой.
MPICH для Windows состоит из следующих компонентов:
Менеджер процессов smpd. exe, который представляет собой системную службу (сервисное приложение). Менеджер процессов ведёт список вычислительных узлов системы, и запускает на этих узлах MPI-программы, предоставляя им необходимую информацию для работы и обмена сообщениями;
Заголовочные файлы (. h) и библиотеки стадии компиляции (. lib), необходимые для разработки MPI-программ;
Библиотеки времени выполнения (. dll), необходимые для работы MPI-программ;
Дополнительные утилиты (. exe), необходимые для настройки MPICH и запуска MPI-программ.
Все компоненты, кроме библиотек времени выполнения, устанавливаются по умолчанию в папку C: \Program Files\MPICH2; dll-библиотеки устанавливаются в C: \Windows\System32.
Менеджер процессов является основным компонентом, который должен быть установлен и настроен на всех компьютерах сети (библиотеки времени выполнения можно, в крайнем случае, копировать вместе с MPI-программой). Остальные файлы требуются для разработки MPI-программ и настройки "головного" компьютера, с которого будет производиться их запуск.
Менеджер работает в фоновом режиме и ждёт запросов к нему из сети со стороны "головного" менеджера процессов (по умолчанию используется сетевой порт 8676). Чтобы обезопасить себя от хакеров и вирусов, менеджер требует пароль при обращении к нему.
Когда один менеджер процессов обращается к другому менеджеру процессов, он передаёт ему свой пароль.
Отсюда следует, что нужно указывать один и тот же пароль при установке MPICH на компьютеры сети.
Рис.4. Схема работы MPICH на кластере.