Главная » Просмотр файлов » Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Терехин - Системное программное обеспечение - взаимодействие процессов (2002)

Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Терехин - Системное программное обеспечение - взаимодействие процессов (2002) (1114651), страница 19

Файл №1114651 Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Терехин - Системное программное обеспечение - взаимодействие процессов (2002) (Н.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Терехин - Системное программное обеспечение - взаимодействие процессов (2002)) 19 страницаН.В. Вдовикина, А.В. Казунин, И.В. Машечкин, А.Н. Терехин - Системное программное обеспечение - взаимодействие процессов (2002) (1114651) страница 192019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 19)

Этой функции передаются в качестве параметров указатели на параметры, полученные функцией main(), описывающие аргументы командной строки. Смысл этого заключается в том, что при загрузке MPI-приложения mpirun может добавлять к его аргументам командной строки некоторые дополнительные параметры, необходимые для инициализации среды выполнения MPI. В этом случае вызов MPI_Init() также изменяет массив аргументов командной строки и их количество, удаляя эти дополнительные аргументы.

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

По завершении работы с MPI в каждой ветви необходимо вызвать функцию закрытия библиотеки – MPI_Finalize():

#include <mpi.h>

int MPI_Finalise(void);

После вызова этой функции невозможен вызов ни одной функции библиотеки MPI (в том числе и повторный вызов MPI_Init())

Для аварийного завершения работы с библиотекой MPI служит функция MPI_Abort().

#include <mpi.h>

int MPI_Abort(MPI_Comm comm, int errorcode);

Эта функция немедленно завершает все ветви приложения, входящие в коммуникационный контекст, который описывает коммуникатор comm. Код завершения приложения передается в параметре errorcode. Отметим, что MPI_Abort() вызывает завершения всех ветвей данного коммуникатора даже в том случае, если она была вызвана только в какой-либо одной ветви.

Синхронизация: барьеры.

Для непосредственной синхронизации ветвей в MPI предусмотрена одна специальная функция – MPI_Barrier().

#include <mpi.h>

int MPI_Barrier(MPI_Comm comm);

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

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

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

  1. Использование барьерной синхронизации.

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

На экран выводится общее количество ветвей в приложении, затем каждая ветвь выводит свой уникальный номер. После этого ветвь с номером 0 печатает на экран аргументы командной строки. Барьерная синхронизация необходима для того, чтобы сообщения о порядковых номерах ветвей не смешивались с сообщением об общем количестве ветвей и с выводом аргументов командной строки.

#include <mpi.h>

#include <stdio.h>

int main(int argc, char **argv)

{

int size, rank, i;

MPI_Init(&argc, &argv); /* Инициализируем библиотеку */

MPI_Comm_size(MPI_COMM_WORLD, &size);

/* Узнаем количество задач в запущенном приложении... */

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

/* ...и свой собственный номер: от 0 до (size-1) */

/* задача с номером 0 сообщает пользователю размер группы,коммуникационный контекст которой описывает коммуникатор MPI_COMM_WORLD, т.е. число ветвей в приложении */

if (rank == 0) {

printf("Total processes count = %d\n", size );

}

/* Осуществляется барьерная синхронизация */

MPI_Barrier(MPI_COMM_WORLD);

/* Теперь каждая задача выводит на экран свой номер */

printf("Hello! My rank in MPI_COMM_WORLD = %d\n", rank);

/* Осуществляется барьерная синхронизация */

MPI_Barrier(MPI_COMM_WORLD);

/* затем ветвь c номером 0 печатает аргументы командной строки. */

if (rank == 0) {

printf(“Command line of process 0:\n");

for(i = 0; i < argc; i++) {

printf("%d: \"%s\"\n", i, argv[i]);

}

}

/* Все задачи завершают выполнение */

MPI_Finalize();

return 0;

}

7.2.4Прием и передача данных. Общие замечания.

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

Сообщения и их атрибуты.

Каждое сообщение MPI обладает следующим набором атрибутов:

  • Номер ветви-отправителя

  • Номер или номера ветвей-получателей

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

  • Тип данных, образующих тело сообщения

  • Количество элементов указанного типа, составляющих тело сообщения

  • Тэг, или бирка сообщения

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

Тэг сообщения представляет собой целое число, аналог типа сообщения в механизме очередей сообщений IPC. Интерпретация этого атрибута целиком возлагается на саму программу.

Поддержка типов данных в MPI.

В отличие от других средств межпроцессного взаимодействия, рассмотренных нами ранее, в MPI требуется явное указание типа данных, образующих тело сообщения. Причина этого заключается в том, что библиотека MPI берет на себя заботу о корректности передачи данных в случае использования ее в гетерогенной (т.е. состоящей из разнородных узлов) среде. Одни и те же типы данных на машинах разных архитектур могут иметь различное представление (к примеру, в архитектуре Intel представление целых чисел характеризуется расположением байт от младшего к старшему, в то время как в процессорах Motorola принято обратное расположение; кроме того, на разных машинах один и тот же тип может иметь разную разрядность и выравнивание). Очевидно, что в такой ситуации передача данных как последовательности байт без соответствующих преобразований приведет к их неверной интерпретации. Реализация MPI производит необходимые преобразования данных в теле сообщения перед его посылкой и после получения, однако для этого необходима информация о типе данных, образующих тело сообщения.

Для описания типов данных в MPI введен специальный тип – MPI_Datatype. Для каждого стандартного типа данных Си в заголовочном файле библиотеки описана константа типа MPI_Datatype; ее имя состоит из префикса MPI_ и имени типа, написанного большими буквами, например, MPI_INT, MPI_DOUBLE и т.д. Кроме этого, MPI предоставляет широкие возможности по конструированию описателей производных типов, однако их рассмотрение выходит за рамки данного пособия.

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

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

7.2.5Коммуникации «точка-точка». Блокирующий режим.

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

Рассмотрим сначала функции MPI, используемые для отправки и получения сообщений между двумя ветвями – такой способ обмена в литературе часто носит название коммуникации «точка-точка» .

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

Отправка сообщений в блокирующем режиме.

Для отправки сообщений в блокирующем режиме служит функция MPI_Send():

#include <mpi.h>

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

Аргументы у этой функции следующие:

buf – указатель на буфер, в котором расположены данные для передачи

count – количество элементов заданного типа в буфере

datatype – тип элементов в буфере

dest – уникальный номер ветви-получателя. Представляет собой неотрицательное целое число в диапазоне [0, N-1], где N – число ветвей в коммуникационном контексте, описываемом коммуникатором comm

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

comm – коммуникатор, описывающий коммуникационный контекст, в котором будет передаваться сообщение

Еще раз отметим, что в этой функции, как и во всех остальных функциях приема-передачи MPI, в параметре count указывается не длина буфера в байтах, а количество элементов типа datatype, образующих буфер.

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

С одной стороны, буферизация при отправке позволяет ветви-отправителю сообщения продолжить выполнение, не дожидаясь момента, когда ветвь-адресат сообщения инициирует его прием; с другой стороны – буферизация, очевидно, увеличивает накладные расходы как по памяти, так и по времени, так как требует добавочного копирования. При использовании вызова MPI_Send() решение о том, будет ли применяться буферизация в каждом конкретном случае, принимается самой библиотекой MPI. Это решение принимается из соображений наилучшей производительности, и может зависеть от размера сообщения, а также от наличия свободного места в системном буфере. Если буферизация не будет применяться, то возврат управления из MPI_Send() произойдет только тогда, когда ветвь-адресат инициирует прием сообщения, и его тело будет скопировано в буфер-приемник ветви-адресата.

Режимы буферизации.

MPI позволяет программисту самому управлять режимом буферизации при отправке сообщений в блокирующем режиме. Для этого в MPI существуют три дополнительные модификации функции MPI_Send(): MPI_Bsend(), MPI_Ssend() и MPI_Rsend():

#include <mpi.h>

int MPI_Bsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

int MPI_Ssend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

int MPI_Rsend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);

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

MPI_Bsend() предполагает отсылку сообщения с буферизацией. Это означает, что если к моменту вызова MPI_Bsend() ветвь-адресат не инициировала прием сообщения, и т.о. сообщение не может быть доставлено немедленно, оно должно быть буферизовано. Если в буфере окажется недостаточно свободного места, MPI_Bsend() вернет ошибку. MPI предоставляет специальные функции, с помощью которых ветвь может выделить в своем адресном пространстве некоторый буфер, который будет использоваться MPI для буферизации сообщений в этом режиме, таким образом, программист может сам управлять размером доступного буферного пространства. Заметим, что посылка сообщения с помощью функции MPI_Bsend() является, в отличие от всех остальных операций отсылки, локальной операцией, т.е. ее завершение не зависит от поведения ветви-адресата.

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

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

Прием сообщений в блокирующем режиме.

Прием сообщений в блокирующем режиме осуществляется функцией MPI_Recv():

#include <mpi.h>

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);

Она имеет следующие аргументы:

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6447
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее