Mpi что это программа

2. Анализ задачи

Если вы всё установили и настроили, и при этом у вас даже заработал примитивный тестовый пример с первого раза, считайте, что вам уже повезло. Можете даже немного расслабиться. Но ненадолго, так как впереди ещё решение поставленной задачи и её распараллеливание.
Лучше всего рассматривать решение задачи на конкретном примере. Причём, пример должен быть не слишком простым, так как элементарных примеров и так полно в интернете. Итак, предположим, что нам нужно решить уравнение теплопроводности и ускорить решение с использованием параллельного алгоритма. В общем виде уравнение записывается следующим образом:

где k, c, d – коэффициенты, которые могут в общем случае зависеть от времени и координаты; F – функция источника (также может зависеть от времени и координаты).
Чтобы немного упростить себе жизнь, рассмотрим одномерный случай. При этом пусть с=0, k и F – константы, а на границах отрезка начальные значения нулевые. Тогда получаем следующее уравнение:

Лекция 2. Основные функции библиотеки MPI.



Обращаясь к теории численных методов, записываем решение этого уравнения (явная схема):

Или же, в другом виде:

Что можно почерпнуть из этого уравнения с точки зрения программирования? Во-первых, в нём присутствуют значения функции в двух моментах времени: прошлом и текущем. Во-вторых, необходимо хранить значения u в разных точках пространства (прямой). Итак, нам нужны 2 массива длины, равной размерности пространства. Первый – для прошлого момента времени, второй – для текущего.

Обозначим их U_old и U_new соответственно. Тогда их объявление и инициализация на языке С++ следующие:

double *U_old, *U_new;
int DIM=sizeX+1;
U_old=new double [DIM];
U_new=new double [DIM];
for(int i=0;i
U_old[i]=0;
U_new[i]=0;
>

Источник поместим в одну точку пространства (середина отрезка) и далее о нём больше вспоминать не будем:

Помимо вышесказанного, необходимо также параметризовать в коде программы значения констант уравнения и вычислить значения интервалов dx, dt:

int tmax=1, xmax=1;
int sizeT=10, sizeX=8;
double K=0.01, D=0.4, F=1000;
double dt=(double)tmax/sizeT, dx=(double)xmax/sizeX;

Далее вспомним, что в вычислениях нам нужно делить на dx 2 . Как известно, эта операция очень медленная, а значение dx при этом не меняется (не зависит от времени). Тогда уместно будет посчитать величину 1/dx 2 заранее и потом не делить, а умножать на данное значение:

С учётом всех замечаний, последовательный алгоритм решения одномерного уравнения теплопроводности имеет вид:

int main(int argc,char *argv[])
//Variables’ initialization
int tmax=1, xmax=1;
int sizeT=10, sizeX=8;
double K=0.01, D=0.4, F=1000;
double dt=(double)tmax/sizeT, dx=(double)xmax/sizeX;
double dx2inv=1/(dx*dx);
double *U_old, *U_new;
int DIM=sizeX+1;
U_old=new double [DIM];
U_new=new double [DIM];

Установка, настройка и запуск программ средствами MPI в Visual Studio 2019


for(int i=0;i
U_old[i]=0;
U_new[i]=0;
>
//Source:
U_old[sizeX/2]=F;

3. Разработка параллельного алгоритма

Итак, у нас уже есть алгоритм решения задачи. Осталось только его распараллелить. Правильнее, конечно, проектировать параллельный алгоритм сразу же, без промежуточной стадии в виде последовательной версии, но для не слишком сложных задач такой способ, я считаю, немного проще.
Начнём с того, что является необходимым в любой (или практически в любой) MPI-программе. Рассмотрим следующий код:

MPI_Init(argv);
MPI_Comm_size(MPI_COMM_WORLD,
MPI_Comm_rank(MPI_COMM_WORLD,
MPI_Finalize();

Первая и последняя функции инициализируют и завершают работу MPI, и являются обязательными для использования этого интерфейса. А вот без остальных двух функций просто нельзя обойтись. Они записывают в переменные numprocs и myid значения количества доступных процессоров (потоков) и идентификатор каждого процессора (потока). К примеру, в однопоточной системе numprocs=1, а myid=0.
Вернёмся теперь к разработанному нами последовательному алгоритму решения уравнения. Очевидно, что в нём самой сложной с точки зрения вычислений частью является следующий цикл:

Именно этот цикл мы и будем распараллеливать, то есть равномерно распределять вычисления между доступными в системе процессорами. Из-за того, что текущее значение функции сильно зависит от прошлого, распараллеливать по времени нет смысла: чтобы посчитать следующий шаг, нас необходимо дождаться расчёта предыдущего. Поэтому будем как-то распределять по процессорам итерации цикла по пространственной координате. Для этого достаточно поделить отрезок х на numprocs интервалов и, что самое главное, обеспечить обмен между потоками посчитанными значениями на границах:

Для начала, зададим границы интервалов для каждого потока с идентификатором myid:

int piece=sizeX/numprocs; //размер части отрезка
int lbound, rbound; //левая и правая границы отрезка
lbound=myid*piece+1;
rbound=lbound+piece-1;
if(myid==numprocs-1 sizeX%2==0) rbound—;

  1. сначала начинает работать поток 0 (myid=0). Посчитав значения функции на всём своём интервале, он передаёт потоку 1 сообщение со значением функции в своей правой границе;
  2. поток 1 получает сообщение от потока 0, благодаря чему может посчитать значение в своей левой границе; затем он вычисляет оставшиеся значения и отправляет 2 сообщения: потоку 0 – значение функции в левой границе, а потоку 2 – в правой и т.д. до тех пор, пока потоками не будут посчитаны значения функции на всём отрезке;
  3. повторение первых 2 пунктов для следующего момента времени.
Читайте также:
Rosetta stone что за программа

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

Если myid>0, то активируем приём сообщения от потока с идентификатором myid-1 и тегом 1 (то есть, будут приниматься сообщения только с тегом 1). Статус обмена будет записан в объявленную ранее переменную status. Это необходимо для использования функции приёма сообщения. Значение функции U, переданное в этом сообщении, записывается в массив U_new на 1 позицию «левее» текущей левой границы интервала.

Всем потокам, кроме последнего, активировать синхронную передачу сообщения (Ssend) потоку myid+1 с тегом 1. В сообщении передать значение в массиве U_new в правой границе интервала. Синхронная передача сообщения используется потому, что нам существенно, в каком порядке потоки начинают работать над расчётами. О разновидностях использованного нами двухточечного обмена можно (и желательно) почитать в других источниках.

Если момент времени не последний, то потокам с идентификатором myid>0 активировать синхронную передачу сообщения потоку myid-1 с тегом 2. В сообщении передаётся значение в массиве U_new в левой границе интервала.
Теперь все значения посчитаны, но хранятся они в разных потоках. Поэтому надо на какой-то из потоков возложить роль сборщика данных. Пусть это будет поток 0. Тогда он будет принимать от всех остальных потоков значения функции на их интервалах:

Последний штрих в коде нашей программы – это подсчёт времени работы алгоритма. Ведь мы, собственно, столько мучились с распараллеливанием ради ускорения работы. Для этого можно воспользоваться функцией MPI_Wtime():

double startwtime = 0.0, endwtime;
startwtime = MPI_Wtime();
//цикл с параллельными вычислениями
endwtime = MPI_Wtime();
cout

Код получившейся программы:

int main(int argc,char *argv[])
int myid, numprocs;
MPI_Status status;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(argv);
MPI_Comm_size(MPI_COMM_WORLD,
MPI_Comm_rank(MPI_COMM_WORLD,
MPI_Get_processor_name(processor_name,

4. Запуск программы

Чтобы разработанная нами программа заработала в многопоточном режиме, нужны дополнительные усилия. А точнее, надо запустить командную строку Windows, перейти в каталог установленного MPICH2 или msmpi, в папку bin. У меня полный путь к этой директории выглядит следующим образом:

C:Program FilesMicrosoft HPC Pack 2008 R2Bin

Далее в командной строке ввести следующую команду:

К примеру, это может выглядеть так:

start mpiexec –n 4 С:/program.exe

Внимание! Файл с результатами вычислений (results.txt) будет создан в том каталоге, где находится mpiexec, а не ваша программа. То есть, в моём случае, в директории C:Program FilesMicrosoft HPC Pack 2008 R2Bin

Если у вас всё получилось и программа работает (причём, правильно, причём, быстрее, чем последовательный алгоритм), то я вас поздравляю! Дальнейшее знакомство с MPI в ваших руках 😉

P.S. Надеюсь, кому-то этот гид поможет 🙂

Метки:

  • mpi,
  • С++,
  • параллельное программирование,
  • пример,
  • уравнение теплопроводности

Источник: jose-san.livejournal.com

Введение в технологии параллельного программирования (MPI)

Аннотация: Лекция посвящена рассмотрению технологии MPI как стандарта параллельного программирования для систем с распределенной памятью. Рассматриваются основные режимы передачи данных. Вводятся такие понятия, как группы процессов и коммуникаторы. Рассматриваются основные типы данных, операции «точка-точка», коллективные операции, операции синхронизации и измерения времени.

Цель лекции: Лекция направлена на изучение общей методики разработки параллельных алгоритмов.

5.1. MPI: основные понятия и определения

Рассмотрим ряд понятий и определений, являющихся основополагающими для стандарта MPI .

5.1.1. Понятие параллельной программы

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

Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP). Данный программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах. Исходный программный код для исполняемой программы разрабатывается на алгоритмических языках C или Fortran с использованием той или иной реализации библиотеки MPI.

Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI-программ и в ходе вычислений меняться не может (в стандарте MPI-2 предусматривается возможность динамического изменения количества процессов). Все процессы программы последовательно перенумерованы от 0 до p-1, где p есть общее количество процессов. Номер процесса именуется рангом процесса.

5.1.2. Операции передачи данных

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

Читайте также:
Nav что за программа

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

Как уже отмечалось ранее, стандарт MPI предусматривает необходимость реализации большинства основных коллективных операций передачи данных – см. подразделы 5.2 и 5.4.

5.1.3. Понятие коммуникаторов

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

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

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

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

Подробное рассмотрение возможностей MPI для работы с группами и коммуникаторами будет выполнено в подразделе 5.6.

5.1.4. Типы данных

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

Подробное рассмотрение возможностей MPI для работы с производными типами данных будет выполнено в подразделе 5.5.

5.1.5. Виртуальные топологии

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

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

В MPI имеется возможность представления множества процессов в виде решетки произвольной размерности (см. подраздел 5.7). При этом, граничные процессы решеток могут быть объявлены соседними и, тем самым, на основе решеток могут быть определены структуры типа тор.

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

И, наконец, последний ряд замечаний перед началом рассмотрения MPI:

  • Описание функций и все приводимые примеры программ будут представлены на алгоритмическом языке C; особенности использования MPI для алгоритмического языка Fortran будут даны в п. 5.8.1,
  • Краткая характеристика имеющихся реализаций библиотек MPI и общее описание среды выполнения MPI программ будут рассмотрены в п. 5.8.2,
  • Основное изложение возможностей MPI будет ориентировано на стандарт версии 1.2 (MPI-1); дополнительные свойства стандарта версии 2.0 буду представлены в п. 5.8.3.

Приступая к изучению MPI, можно отметить, что, с одной стороны, MPI достаточно сложен – в стандарте MPI предусматривается наличие более 125 функций. С другой стороны, структура MPI является тщательно продуманной – разработка параллельных программ может быть начата уже после рассмотрения всего лишь 6 функций MPI. Все дополнительные возможности MPI могут осваиваться по мере роста сложности разрабатываемых алгоритмов и программ. Именное в таком стиле – от простого к сложному – и будет далее представлен весь учебный материал по MPI.

5.2. Введение в разработку параллельных программ с использованием MPI

5.2.1. Основы MPI

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

5.2.1.1 Инициализация и завершение MPI программ

Первой вызываемой функцией MPI должна быть функция:

int MPI_Init ( int *agrc, char ***argv );

для инициализации среды выполнения MPI-программы. Параметрами функции являются количество аргументов в командной строке и текст самой командной строки.

Последней вызываемой функцией MPI обязательно должна являться функция:

int MPI_Finalize (void);

Как результат, можно отметить, что структура параллельной программы, разработанная с использованием MPI, должна иметь следующий вид:

#include «mpi.h» int main ( int argc, char *argv[] ) < MPI_Init ( argv ); MPI_Finalize(); return 0; >

  1. Файл mpi.h содержит определения именованных констант, прототипов функций и типов данных библиотеки MPI,
  2. Функции MPI_Init и MPI_Finalize являются обязательными и должны быть выполнены (и только один раз) каждым процессом параллельной программы,
  3. Перед вызовом MPI_Init может быть использована функция MPI_Initialized для определения того, был ли ранее выполнен вызов MPI_Init.

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

Читайте также:
Tripadvisor что это за программа и нужна ли она на компьютере
5.2.1.2 Определение количества и ранга процессов

Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции:

int MPI_Comm_size ( MPI_Comm comm, int *size ).

Для определения ранга процесса используется функция:

int MPI_Comm_rank ( MPI_Comm comm, int *rank ).

Как правило, вызов функций MPI_Comm_size и MPI_Comm_rank выполняется сразу после MPI_Init:

#include «mpi.h» int main ( int argc, char *argv[] ) < int ProcNum, ProcRank; MPI_Init ( argv ); MPI_Comm_size ( MPI_COMM_WORLD, MPI_Comm_rank ( MPI_COMM_WORLD, MPI_Finalize(); return 0; >

  • Коммуникатор MPI_COMM_WORLD, как отмечалось ранее, создается по умолчанию и представляет все процессы выполняемой параллельной программы,
  • Ранг, получаемый при помощи функции MPI_Comm_rank, является рангом процесса, выполнившего вызов этой функции, т.е. переменная ProcRank будет принимать различные значения в разных процессах.

Источник: intuit.ru

Лекция 14. Стандарт mpi

Наиболее распространенной библиотекой параллельного программирования в модели передачи сообщений является MPI (Message Passing Interface). Рекомендуемой бесплатной реализацией MPI является пакет MPICH, разработанный в Аргоннской национальной лаборатории.

MPI является библиотекой функций межпроцессорного обмена сообще-

ниями и содержит около 300 функций, которые делятся на следующие классы:

операции точка-точка, операции коллективного обмена, топологические опера-

ции, системные и вспомогательные операции. Поскольку MPI является стан-

дартизованной библиотекой функций, то написанная с применением MPI про-

грамма без переделок выполняется на различных параллельных ЭВМ. Принци-

пиально для написания подавляющего большинства программ достаточно не-

скольких функций, которые приведены ниже.

Функция MPI_Send является операцией точка-точка и используется для посылки данных в конкретный процесс.

Функция MPI_Recv также является точечной операцией и используется для приема данных от конкретного процесса.

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

Функция коллективного обмена MPI_REDUCE объединяет элементы входного буфера каждого процесса в группе, используя операцию op, и возвращает объединенное значение в выходной буфер процесса с номером root.

MPI_Send(address, сount, datatype, destination, tag, comm),

аddress – адрес посылаемых данных в буфере отправителя

сount – длина сообщения

datatype – тип посылаемых данных

destination – имя процесса-получателя

tag – для вспомогательной информации

comm – имя коммуникатора

MPI_Recv(address, count, datatype, source, tag, comm, status)

address – адрес получаемых данных в буфере получателя

count– длина сообщения

datatype– тип получаемых данных

source – имя посылающего процесса процесса

tag — для вспомогательной информации

comm– имя коммуникатора

status — для вспомогательной информации

MPI_BCAST (address, сount, datatype, root, comm)

root – номер рассылающего (корневого)процесса

MPI_REDUCE(sendbuf, recvbuf, count, datatype, op, root, comm)

sendbuf — адрес посылающего буфера

recvbuf — адрес принимающего буфера

count — количество элементов в посылающем буфере

datatype – тип данных

op — операция редукции

root — номер главного процесса

Кроме этого, используется несколько организующих функций.

MPI_COMM_SIZE (MPI_COMM_WORLD, numprocs)

MPI_COMM_RANK (MPI_COMM_WORLD, myid)

MPI_FINALIZE ()

Обращение к MPI_INIT присутствует в каждой MPI программе и должно

быть первым MPI – обращением. При этом в каждом выполнении программы

может выполняться только один вызов После выполнения этого оператора все

процессы параллельной программы выполняются параллельно. MPI_INIT.

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

Обращение MPI_COMM_SIZE возвращает число процессов numprocs, запущенных в этой программе пользователем.

Вызывая MPI_COMM_RANK, каждый процесс определяет свой номер в группе процессов с некоторым именем.

Строка MPI_FINALIZE () должно быть выполнена каждым процессом программы. Вследствие этого никакие MPI – операторы больше выполняться не будут. Перемсенная COM_WORLD определяет перечень процессов, назначенных для выполнения программы.

Источник: studfile.net

Microsoft MPI

Microsoft MPI (MS-MPI) — это реализация стандарта интерфейса передачи сообщений Майкрософт для разработки и запуска параллельных приложений на платформе Windows.

MS-MPI предлагает несколько преимуществ:

  • Простота переноса существующего кода, использующего MPICH.
  • Безопасность на основе доменные службы Active Directory.
  • Высокая производительность в операционной системе Windows.
  • Двоичная совместимость между различными типами параметров взаимодействия.

Исходный код MS-MPI

Исходный код Microsoft MPI доступен на сайте GitHub.

Загрузки MS-MPI

Ниже приведены текущие загрузки для MS-MPI:

  • MS-MPI версии 10.1.2 (новая!) — см. заметки о выпуске
  • Отладчик для приложений MS-MPI с пакетом HPC 2012 R2

Более ранние версии MS-MPI доступны в Центре загрузки Майкрософт.

Ресурсы сообщества

  • Форум MPI для Windows HPC
  • Обратитесь к команде MS-MPI

Высокопроизводительные вычислительные ресурсы Майкрософт

  • Рекомендуемое руководство. Компиляция и запуск простой программы MS-MPI
  • Рекомендуемое руководство. Настройка кластера Windows RDMA с помощью пакета HPC и экземпляров A8 и A9 для запуска приложений MPI
  • Высокопроизводительные вычисления Microsoft для разработчиков
  • Общие сведения о пакете Microsoft HPC 2019
  • Сценарии Azure HPC

Источник: learn.microsoft.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru