Интерфейс на основе передачи сообщений (MPI - Message Passing Interface) является стандартной моделью программирования для разработки приложений с явным параллелизмом (т.е., параллельные части программы определяет программист), в которых параллельные процессы взаимодействуют между собой путем передачи сообщений.
Для различных операционных систем и разнообразных сетей передачи данных, используемых в кластерах, разработаны и продолжают разрабатываться специальные реализации MPI. MS MPI (Microsoft MPI) есть стандартная реализация
MS MPI может использоваться в программах, написанных на языках Fortan-77, Fortran-90, C и C++. Пакет
Цель разработки MPI заключалась в создании переносимого, эффективного и гибкого стандарта для параллельных программ, использующих модель на основе передачи сообщений.
Стандарт MPI-1 включает в себя следующие базовые функции:
Отличительной особенностью программ, написанных с использованием стандарта MPI-1, состоит в том, что в них допускается только статическое распараллеливание, т.е., количество параллельных процессов во время запуска и исполнения программы фиксировано.
Стандарт MPI-2, помимо функциональности стандарта MPI-1, включает в себя функции:
Кроме реализаций MPICH и MPICH-2 Аргонской национальной лаборатории, на которых базируется MS MPI, имеется еще множество других реализаций стандарта MPI, как коммерческих, так и свободно доступных. Примером коммерческой версии является система ScaMPI фирмы Scali, ориентированная, в частности, на поддержку быстрого интерконнекта
В последующих разделах будут изложены основные функции стандарта MPI-1 и способы их применения, а также будут даны сведения об отладке MPI-программ c использованием Visual Studio 2005.
Команды (функции) управления вычислительным окружением стандарта MPI используются для целого ряда целей, таких как инициализация и завершение работы MPI-окружения, получение информации о свойствах и параметрах этого окружения и др.
Наиболее часто используемые функции (в формате языка С) перечисляются ниже.
Эта функция инициализирует MPI-окружение. Она должна вызываться в каждой MPI-программе до вызова любых других MPI-функций, и, кроме того, она должна вызываться только один раз. В С-программах, эта функция обычно используется для передачи аргументов командной строки каждому из параллельных процессов, хотя это не требуется стандартом MPI и зависит от реализации стандарта.
Формат вызова:
MPI_Init ( argc, argv)
Эта функция определяет вызывалась ли функция инициализации MPI_Init, и возвращает флаг в виде логической истины (1) или логической лжи(0). Необходимость этой функции обусловлена тем, что в сложных программах разные модули могут требовать использования MPI и, так как функция MPI_Init может быть вызвана один раз и только раз каждым процессом, то указанная функция помогает модулю решить нужно ли вызывать MPI_Init или же окружение MPI уже было проинициализировано другим модулем.
Формат вызова:
MPI_Initialized ( flag )
Эта функция завершает работу вычислительного окружения MPI. Вызов этой функции должен быть последним обращением к какой-либо MPI-функции в программе: после нее никакая другая MPI-функция вызвана быть не может.
Формат вызова:
MPI_Finalize()
Все параллельные процессы, из которых состоит MPI-программа, объединяются в группы, которые управляются так называемыми коммуникаторами (communicators). Именно коммуникаторы обеспечивают взаимодействие параллельных процессов внутри группы.
Функция MPI_Comm_size определяет количество процессов в группе, связанной с данным коммуникатором. Специальный встроенный коммуникатор с именем MPI_COMM_WORLD управляет всеми MPI-процессами в приложении, и потому чаще всего используется в качестве аргумента в данной функции:

Формат вызова:
MPI_Comm_size ( comm., size )
В рамках группы, связанной с данным коммуникатором, каждый процесс имеет свой уникальный номер, который присваивается процессу системой при инициализации, и который называется рангом процесса. Ранг процесса часто используется для управления исполнением программы, а также для указания отправителя и получателя сообщений, пересылаемых между MPI-процессами.
Данная функция определяет ранг вызывающего процесса внутри группы, связанной с заданным коммуникатором. В разных коммуникаторах, в общем случае, MPI-процесс имеет различные ранги.
Формат вызова:
MPI_Comm-rank ( comm., rank )

Операции передачи данных в MPI типа "точка-точка" представляют собой передачу сообщений между, в точности, двумя MPI-процессами. Один процесс, при этом, выполняет команду Send (послать), тогда как другой процесс выполняет команду Receive (принять).
Выполнение команд Send и Receive осуществляется посредством вызова соответствующих MPI-функций, которые имеют различные типы, или, другими словами, различное назначение:
Send / блокирующий ReceiveSend / неблокирующий ReceiveSendSendSend / Receive"ready" Send ).С любым типом операции Send может состоять в паре любой тип операции Receive.
Функции передачи данных типа "точка-точка" имеют список аргументов одного из следующих форматов:
Send:MPI_Send ( buffer, count, type, dest, tag, comm )
Send:MPI_Isend ( buffer, count, type, dest, tag, comm, request )
Receive:MPI_Recv ( buffer, count, type, source, tag, comm., status )
Receive:MPI_Irecv ( buffer, count, type, source, tag, comm., request )
Аргументы в этих функциях имеют следующее назначение:
buffer - место хранения данных, которые посылаются или принимаются;count - количество элементов данных конкретного типа, которые посылаются или принимаются;type - тип элементарных данных, задаваемый через встроенные MPI-типы, такие как (для языка С): MPI_CHAR, MPI_SHORT, MPI_INT, MPI_LONG, MPI_FLOAT, MPI_DOUBLE, MPI_BYTE, MPI_PACKED и др.dest - указывает процесс, которому должно быть доставлено сообщение - задается через ранг принимающего процесса;source - аргумент функций приема сообщений, указывающий номер посылающего процесса; указание значения MPI_ANY_SOURCE означает прием сообщения от любого процесса;tag - произвольное неотрицательное целое число, присваиваемое программистом для однозначной идентификации сообщения; у парных операций Send и Reсeive эти числа должны совпадать; указание у операции Receive значения MPI_ANY_TAG может быть использовано для приема любого сообщения, независимо от значения tag ;comm - указывает на коммуникатор, в рамках которого трактуются значения аргументов dest и source ; чаще всего используется встроенный коммуникатор MPI_COMM_WORLD ;status - для операции Receive, указывает источник (source) сообщения и его тег ( tag ); в языке С, этот аргумент есть указатель на MPI_Status ; из этой же структуры может быть получено количество принятых байт посредством функции MPI_Get_count ;request - используется в неблокирующих операциях Send и Receive, и задает уникальный "номер запроса"; в языке С, этот аргумент является указателем на MPI_Request.К наиболее часто используемым блокирующим функциям передачи сообщений относятся следующие функции:
MPI_Send
Базовая блокирующая операция посылки сообщения. Заканчивает свою работу только тогда, когда программный буфер, из которого берутся данные для посылки, готов для повторного использования.
Формат вызова:
MPI_Send ( buf, count, datatype, dest, tag, comm. )
MPI_Recv
Принимает сообщения и блокирует вызывающий эту функцию процесс до тех пор, пока в программном буфере не станут доступными принятые данные.
Формат вызова:
MPI_Recv ( buf, count, datatype, source, tag, comm, status )
MPI_Ssend
Синхронная блокирующая операция посылки сообщения: посылает сообщение и блокирует вызвавший эту функцию процесс, пока программный буфер не будет готов к повторному использованию и пока процесс-получатель не начал принимать посылаемые сообщения.
Формат вызова:
MPI_Ssend ( buf, count, datatype, dest, tag, comm )
MPI_Bsend, MPI_Buffer_attach
Перед вызовом MPI_BSend, программист должен вызвать функцию MPI_Buffer_attach для размещения буфера, используемого в MPI_Bsend. Буферированная блокирующая операция посылки сообщения заканчивает свою работу, когда данные из программного буфера скопированы в буфер посылки.
Форматы вызовов:
MPI_Buffer_attach ( buffer, size ) MPI_Bsend ( buf, count, datatype, dest, tag, comm )
В нижеследующем примере, процесс 0 посылает однобайтовое сообщение процессу 1, и ждет от него аналогичного сообщения.

Основные особенности и отличия радиовещательных (коллективных) обменов данными от обменов типа "точка-точка" состоят в следующем:
MPI_Bcast
Посылает сообщение от процесса с рангом "root" (обычно, это процесс с рангом 0) всем другим процессам в группе.
Формат вызова:
MPI_Bcast ( buffer, count, datatype, root, comm )
MPI_Gather
Собирает сообщения от каждого из процессов в группе в приемный буфер процесса с рангом 'root".
Формат вызова:
MPI_Gather ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, root, comm )
Cледует заметить, что
sendtype и recvtype, в общем случае, могут различаться, а потому будут задавать разную интерпретацию данных на приемной и передающей стороне;root также отправляет данные, но в свой же приемный буфер.MPI_Scatter
Эта функция является обратной к функции MPI_Gather: отдельные части передающего буфера процесса с рангом 'root распределяются по приемным буферам всех других процессов в группе.
Формат вызова:
MPI_Scatter ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, root, comm )
MPI_Allgather
Эта функция аналогична функции MPI_Gather, за исключением того, что прием данных осуществляет не один процесс, а все процессы: каждый процесс имеет специфическое содержимое в передающем буфере, но все процессы получают в итоге одинаковое содержимое в приемном буфере.
Формат вызова:
MPI_Allgather ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, comm )
MPI_Alltoall
Каждый процесс отдельные части своего передающего буфера рассылает всем остальным процессам; каждый процесс получает эти части от всех остальных и размещает их по порядку рангов процессов, от которых они получены.
Формат вызова:
MPI_Alltoall ( sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, comm )
В нижеследующем примере, с помощью функции MPI_Scatter строки массива рассылаются отдельным процессам:

Вывод на консоль данной программы будет таким:
rank= 0 Results: 1.000000 2.000000 3.000000 4.000000 rank= 1 Results: 5.000000 6.000000 7.000000 8.000000 rank= 2 Results: 9.000000 10.000000 11.000000 12.000000 rank= 3 Results: 13.000000 14.000000 15.000000 16.000000
Коллективные операции в MPI выполняют следующие функции:
MPI_Reduce,MPI_Allreduce,MPI_Reduce_scatter иMPI_Scan.Помимо встроенных, пользователь может определять использовать свои собственные коллективные операции. Для этого служат функции MPI_Op_create и MPI_Op_free, а также специальный тип данных MPI_Usr_function.
Алгоритм исполнения всех коллективных функций одинаков: в каждом процессе имеется массив с данными и над элементами с одинаковым номеров в каждом из процессов производится одна и та же операция (сложение, произведение, вычисление максимума/минимума и т.п.). Встроенные коллективные функции отличаются друг от друга способом размещения результатов в процессах.
MPI_Reduce
Данная функция выполняет коллективную операцию во всех процессах группы и помещает результат в процесс с рангом root.
Формат вызова:
MPI_Reduce ( sendbuf, recvbuf, count, datatype, op, root, comm )
Пример поэлементного суммирования массивов:

Встроенных коллективных операций в MPI насчитывается 12:
MPI_MAX и MPI_MIN - поэлементные максимум и минимумMPI_SUM - сумма векторовMPI_PROD - произведение векторовMPI_LAND, MPI_BAND, MPI_LOR, MPI_BOR, MPI_LXOR, MPI_BXOR - логические и двоичные (бинарные) операции И, ИЛИ, исключающее ИЛИMPI_MAXLOC, MPI_MINLOC - поиск индекса процесса с максимумом/минимумом значения и самого этого значенияЭти функции могут работать только со следующими типами данных (и только ними):
MPI_MAX, MPI_MIN - целые и вещественныеMPI_SUM, MPI_PROD - целые, вещественные (комплексные - для Фортрана)MPI_LAND, MPI_LOR, MPI_LXOR - целыеMPI_BAND, MPI_BOR, MPI_BXOR - целые и типа MPI_BYTEMPI_MAXLOC, MPI_MINLOC - вещественныеMPI_Allreduce
Применяет коллективную операцию и рассылает результат всем процессам в группе.
Формат вызова:
MPI_Allreduce (sendbuf, recvbuf, count, datatype, op, comm)
MPI_Reduce_scatter
Функция применяет вначале коллективную операцию к векторам всех процессов в группе, а затем результирующий вектор разбивается на непересекающиеся сегменты, которые распределяются по процессам. Данная операция эквивалентна вызову функции MPI_Reduce, за которым производится вызов MPI_Scatter.
Формат вызова:
MPI_Reduce_scatter (sendbuf, recvbuf, recvcount, datatype, op, comm)
MPI_Scan
Данная операция аналогична функции MPI_Allreduce в том отношении, что после ее выполнения каждый процесс получает результирующий массив. Главное отличие данной функции состоит в том, что содержимое результирующего массива в процессе i является результатом выполнения коллективной операции над массивами из процессов с номерами от 0 до i включительно.
Формат вызова:
MPI_Scan ( sendbuf, recvbuf, count, datatype, op, comm )
Управление процессами в MPI происходит посредством организации их в группы, управляемые коммуникаторами
Группа есть упорядоченное множество процессов. Каждому процессу в группе присваивается уникальный целочисленный номер - ранг. Значения ранга изменяются от 0 до N - 1, где N есть количество процессов в группе. В MPI, группа представляется в памяти компьютера в виде объекта, доступ к которому программист осуществляет с помощью "обработчика" (handle) MPI_Group. С группой всегда связывается коммуникатор, также представляемый в виде объекта.
Коммуникатор обеспечивает взаимодействие между процессами, относящимися к одной и той же группе. Поэтому, во всех MPI-сообщениях одним из аргументов задается коммуникатор. Коммуникаторы как объекты также доступны программисту с помощью обработчиков. В частности, обработчик коммуникатора, который включает в себя все процессы задачи, называется MPI_COMM_WORLD.
Основные цели средств организации процессов в группы:
Группы/коммуникаторы являются динамическими - они могут создаваться и уничтожаться во время исполнения программы.
Процессы могут относиться к более, чем одной группе/коммуникатору. В каждой группе/коммуникаторе, каждый процесс имеет уникальный номер (ранг).
MPI обладает богатой библиотекой функций, относящихся к группам, коммуникаторам и
MPI_COMM_WORLD, используя функцию MPI_Comm_group.MPI_Group_incl.MPI_Comm_create.MPI_Comm_rank.MPI_Group_free и MPPI_Comm_free.Пример, показанный ниже, демонстрирует создание двух отдельных групп процессов для выполнения коллективных операций внутри каждой из них.

Вывод программы на консоль будет таким:
rank= 7 newrank= 3 recvbuf= 22 rank= 0 newrank= 0 recvbuf= 6 rank= 1 newrank= 1 recvbuf= 6 rank= 2 newrank= 2 recvbuf= 6 rank= 6 newrank= 2 recvbuf= 22 rank= 3 newrank= 3 recvbuf= 6 rank= 4 newrank= 0 recvbuf= 22 rank= 5 newrank= 1 recvbuf= 22
В терминах MPI, виртуальная топология описывает отображение MPI процессов на некоторую геометрическую конфигурацию процессоров.
В MPI поддерживается два основных типа топологий - декартовые (решеточные) топологии и топологии в виде графа.
MPI-топологии являются виртуальными - связь между физической структурой параллельной машины и топологией MPI-процессов может и отсутствовать.
Смысл использования виртуальных топологий заключается в том, что они в некоторых случаях удобны для задач со специфической коммуникационной структурой. Например, декартова топология удобна для задач, в которых обрабатывающие элементы в процессе вычислений обмениваются данными только со своими 4-мя непосредственными соседями. В конкретных реализациях, возможна оптимизация отображения MPI-процессов на физическую структуру заданной параллельной машины.
В примере, показанном ниже, создается декартова топология 4 х 4 из 16 процессов, и каждый процесс сообщает свой ранг своим соседям, получая от них их собственные ранги.

Вывод данной программы на консоль будет следующим:
rank= 0 coords= 0 0 neighbors(u,d,l,r)= -3 4 -3 1
rank= 0 inbuf(u,d,l,r)= -3 4 -3 1
rank= 1 coords= 0 1 neighbors(u,d,l,r)= -3 5 0 2
rank= 1 inbuf(u,d,l,r)= -3 5 0 2
rank= 2 coords= 0 2 neighbors(u,d,l,r)= -3 6 1 3
rank= 2 inbuf(u,d,l,r)= -3 6 1 3
. . . . .
rank= 14 coords= 3 2 neighbors(u,d,l,r)= 10 -3 13 15
rank= 14 inbuf(u,d,l,r)= 10 -3 13 15
rank= 15 coords= 3 3 neighbors(u,d,l,r)= 11 -3 14 -3
rank= 15 inbuf(u,d,l,r)= 11 -3 14 -3
Visual Studio 2005 включает в себя важные функции, которые позволяют отлаживать параллельные приложения в удаленном режиме.
MPI-отладчик из Visual Studio использует файл Mpishim.exe для автоматического присоединения отладочных средств к MPI-процессам, исполняющимся на узлах кластера. Совокупность стандартных средств отладки, уже имевшееся в составе Visual Studio 2005, расширено на параллельные приложения, и обеспечивает точки останова и пошаговое выполнение на уровне процессов и на уровне потоков. С помощью этих средств, возможно отладить приложения, в которых имеются несоответствия в передаче и приеме сообщений, дедлоки и условия для возникновения гонок.
Visual Studio 2005 Professional Edition и Visual Studio 2005 Team System позволяют отлаживать приложения, включая и параллельные приложения, в удаленном режиме. При отладке MPI-приложений в рамках Visual Studio используются следующие средства:
Общие шаги по установке и конфигурированию средств отладки MPI приложений в рамках Visual Studio состоят в следующем:
Чтобы установить все требуемые компоненты для
Дополнительные замечания:
Visual Studio 2005 имеет средства, которые делают ее эффективным инструментом отладки MPI-приложений. Пользователь может выполнять MPI-приложения непосредственно в рамках сессии из Visual Studio в двух режимах:
При задании точек остановки (breakpoints) в приложении, пользователь может указать применение этих точек
Чтобы установить конфигурационные параметры для MPI-приложения, для которого будет производиться отладка, необходимо выполнить следующие шаги:
Замечание.
Важное свойство отладки параллельных приложений в Visual Studio 2005 состоит в том, что в ней возможно устанавливать точки остановки отдельно для каждого процесса. Например, можно установить точку остановки только для процесса с конкретным Windows Process ID (PID) или же для множества процессов с выбранными PID.
После того, как для приложения установлены конфигурационные параметры в Visual Studio, запустить приложение в режиме отладки можно, нажав клавишу F5. В результате этого, приложение запустится с использованием mpiexec, а отладчик из Visual Studio будет запущен на узлах, где исполняются процессы приложения. Когда процесс приложения на некотором узле достигнет точки остановки, то его выполнение прервется.
Чтобы просмотреть процессы приложения, необходимо нажать Ctrl-Alt-Z, чтобы открыть окно Processes, пример которого показан на Рис 2.3.
(рис 2.3) Окно ProcessesОтметим, что в поле ID этого окна отображается Windows Process ID (PID), а не ранг процесса в смысле MPI.
Как уже говорилось выше, установка фильтров для точек остановки позволяет иметь активные точки остановки только для некоторых процессов.
При выборе определенных процессов в окне Processes, в других окнах отображается информация о них, что позволяет провести их детальное исследование.
Замечание.
Для пошагового исполнения, начиная с точки остановки, необходимо всегда использовать соответствующие кнопки, отмеченные овалом на Рис 2.3. В этом случае, нельзя использовать комбинации клавиш.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.