Принятая в mpi нотация записи

Краткие теоретические сведения

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

Под кластерной системой понимают набор компьютеров общего назначения, соединенных с помощью стандартных сетевых технологий (Fast/Gigabit Ethernet, Myrinet) на базе шинной архитектуры или коммутатора. Такие суперкомпьютерные системы являются самыми дешевыми, поскольку собираются на базе стандартных комплектующих элементов. Гетерогенными (неоднородными) кластерами называется объединение в кластер компьютеров разной мощности или разной архитектуры. В ОС Linux имеется все необходимое для построения кластеров стандартными средствами. Для взаимодействия процессов, принадлежащих одному приложению, но работающих на разных узлах кластера можно использовать как стандартные для Unix механизмы взаимодействия: потоки, трубы, разделяемые файлы, так и специализированные библиотеки передачи сообщений. Для Linux самыми популярными из таких библиотек являются MPI и PVM, хотя они могут обеспечивать взаимодействие компонентов, работающих под управлением разных операционных систем.

MPI - это стандарт на программный инструментарий для обеспечения связи между ветвями параллельного приложения. MPI расшифровывается как "Message passing interface" ("Взаимодействие через передачу сообщений").

Параллельное приложение состоит из нескольких ветвей, или процессов, или задач, выполняющихся одновременно. Разные процессы могут выполняться как на разных процессорах, так и на одном и том же - для программы это роли не играет, поскольку в обоих случаях механизм обмена данными одинаков. Процессы обмениваются друг с другом данными в виде сообщений. Термин "процесс" используется также в Unix, и здесь нет путаницы: в MPI ветвь запускается и работает как обычный процесс Unix, связанный через MPI с остальными процессами, входящими в приложение.

Группа - это некое множество ветвей. Одна ветвь может быть членом нескольких групп. Согласно концепции MPI, после создания группу нельзя дополнить или усечь - можно создать только новую группу под требуемый набор ветвей на базе существующей. При запуске приложения все процессы помещаются в создаваемую для приложения общую область связи (communication domains). Программе пользователя в распоряжение предоставляется коммуникатор - описатель области связи. Коммуникатор - это верхушка трехслойного пирога (группы, области связи, описатели областей связи), в который "запечены" задачи: именно с коммуникаторами программист имеет дело, вызывая функции пересылки данных, а также подавляющую часть вспомогательных функций. Одной области связи могут соответствовать несколько коммуникаторов. Коммуникаторы являются "несообщающимися сосудами": если данные отправлены через один коммуникатор, ветвь-получатель сможет принять их только через этот же самый коммуникатор, но ни через какой-либо другой. Многие функции MPI имеют среди входных аргументов коммуникатор, который ограничивает сферу их действия той областью связи, к которой он прикреплен.

MPI

2.1. Категории функций: блокирующие, локальные, коллективные

Блокирующие - останавливают (блокируют) выполнение процесса до тех пор, пока производимая ими операция не будет выполнена. Неблокирующие функции возвращают управление немедленно, а выполнение операции продолжается в фоновом режиме; за завершением операции надо проследить особо. Неблокирующие функции возвращают квитанции ("requests"), которые погашаются при завершении. До погашения квитанции с переменными и массивами, которые были аргументами неблокирующей функции, ничего делать нельзя.

Локальные - завершение процедуры зависит только от локального выполняемого процесса. Большинство информационных функций является локальными, т.к. копии системных данных уже хранятся в каждой ветви. Нелокальные – завершение процедуры может требовать выполнения какой-либо MPI процедуры в другом процессе.

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

Принятая в MPI нотация записи

Регистр букв важен, все идентификаторы начинаются с префикса "MPI_". Если идентификатор сконструирован из нескольких слов, слова в нем разделяются подчерками: MPI_Get_count, MPI_Comm_rank. Иногда, однако, разделитель не используется: MPI_Sendrecv, MPI_Alltoall.

Порядок слов в составном идентификаторе выбирается по принципу "от общего к частному": сначала префикс "MPI_", потом название категории (Type, Comm, Group, Attr, Errhandler и т.д.), потом название операции (MPI_Errhandler_create, MPI_Errhandler_set, ...). Наиболее часто употребляемые функции выпадают из этой схемы: они имеют "анти-методические", но короткие и стереотипные названия, например MPI_Barrier, или MPI_Unpack.

Имена констант (и неизменяемых пользователем переменных) записываются полностью заглавными буквами: MPI_COMM_WORLD, MPI_FLOAT. В именах функций первая за префиксом буква - заглавная, остальные маленькие: MPI_Send, MPI_Comm_size.

Наши рекомендации