Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Инициализация и завершение MPI программ. Структура параллельной программы, разработанная с использованием MPI.Содержание книги
Поиск на нашем сайте
Инициализация и завершение 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 функций> MPI_Init (&agrc, &argv); <программный код с использованием MPI функций> MPI_Finalize(); <программный код без использования MPI функций> return 0; } Файл mpi.h содержит определения именованных констант, прототипов функций и типов данных библиотеки MPI, Функции MPI_Init и MPI_Finalize являются обязательными и должны быть выполнены (и только один раз) каждым процессом параллельной программы, Перед вызовом MPI_Init может быть использована функция MPI_Initialized для определения того, был ли ранее выполнен вызов MPI_Init.
Определение количества и ранга процессов структура параллельной программы, разработанная с использованием MPI. Определение количества и ранга процессов Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции: 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 функций> MPI_Init (&agrc, &argv); MPI_Comm_size (MPI_COMM_WORLD, &ProcNum); MPI_Comm_rank (MPI_COMM_WORLD, &ProcRank); <программный код с использованием MPI функций> MPI_Finalize(); <программный код без использования MPI функций> return 0; } Коммуникатор MPI_COMM_WORLD, создается по умолчанию и представляет все процессы выполняемой параллельной программы, Ранг, получаемый при помощи функции MPI_Comm_rank, является рангом процесса, выполнившего вызов этой функции, т.е. переменная ProcRank будет принимать различные значения в разных процессах. 13) Передача сообщений (MPI_Send). Базовые (пpедопpеделенные) типы данных MPI для алгоритмического языка C Передача сообщений Для передачи сообщения процесс-отправитель должен выполнить функцию: int MPI_Send(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm), где buf – адрес буфера памяти, в котором располагаются данные отправляемого сообщения, count – количество элементов данных в сообщении, type - тип элементов данных пересылаемого сообщения, dest - ранг процесса, которому отправляется сообщение, tag - значение-тег, используемое для идентификации сообщений, comm - коммуникатор, в рамках которого выполняется передача данных. Для указания типа пересылаемых данных в MPI имеется ряд базовых типов, полный список которых приведен дальше.MPI_Datatype - C Datatype; MPI_BYTE; MPI_CHAR - signed char; MPI_DOUBLE — double; MPI_FLOAT — float; MPI_INT — int; MPI_LONG — long; MPI_LONG_DOUBLE - long double; MPI_PACKED; MPI_SHORT — short; MPI_UNSIGNED_CHAR - unsigned char; MPI_UNSIGNED - unsigned int; MPI_UNSIGNED_LONG - unsigned long; MPI_UNSIGNED_SHORT - unsigned short. Отправляемое сообщение определяется через указание блока памяти (буфера), в котором это сообщение располагается. Используемая для указания буфера триада (buf, count, type) входит в состав параметров практически всех функций передачи данных, Процессы, между которыми выполняется передача данных, в обязательном порядке должны принадлежать коммуникатору, указываемому в функции MPI_Send, Параметр tag используется только при необходимости различения передаваемых сообщений, в противном случае в качестве значения параметра может быть использовано произвольное целое число (см. также описание функции MPI_Recv). Сразу же после завершения функции MPI_Send процесс-отправитель может начать повторно использовать буфер памяти, в котором располагалось отправляемое сообщение. Вместе с этим, следует понимать, что в момент завершения функции MPI_Send состояние самого пересылаемого сообщения может быть совершенно различным - сообщение может располагаться в процессе-отправителе, может находиться в процессе передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv. Тем самым, завершение функции MPI_Send означает лишь, что операция передачи начала выполняться и пересылка сообщения будет рано или поздно будет выполнена.
14) Прием сообщений (MPI_Recv). Для приема сообщения процесс-получатель должен выполнить функцию: int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status), где buf, count, type – буфер памяти для приема сообщения, назначение каждого отдельного параметра соответствует описанию в MPI_Send, - source - ранг процесса, от которого должен быть выполнен прием сообщения, tag - тег сообщения, которое должно быть принято для процесса, comm - коммуникатор, в рамках которого выполняется передача данных, status – указатель на структуру данных с информацией о результате выполнения операции приема данных. Буфер памяти должен быть достаточным для приема сообщения, а тип элементов передаваемого и принимаемого сообщения должны совпадать; при нехватке памяти часть сообщения будет потеряна и в коде завершения функции будет зафиксирована ошибка переполнения, При необходимости приема сообщения от любого процесса-отправителя для параметра source может быть указано значение MPI_ANY_SOURCE, При необходимости приема сообщения с любым тегом для параметра tag может быть указано значение MPI_ANY_TAG, Параметр status позволяет определить ряд характеристик принятого сообщения: - status.MPI_SOURCE – ранг процесса-отправителя принятого сообщения, - status.MPI_TAG - тег принятого сообщения. Функция MPI_Get_count(MPI_Status *status, MPI_Datatype type, int *count) возвращает в переменной count количество элементов типа type в принятом сообщении. Вызов функции MPI_Recv не должен согласовываться со временем вызова соответствующей функции передачи сообщения MPI_Send – прием сообщения может быть инициирован до момента, в момент или после момента начала отправки сообщения. По завершении функции MPI_Recv в заданном буфере памяти будет располагаться принятое сообщение. Принципиальный момент здесь состоит в том, что функция MPI_Recv является блокирующей для процесса-получателя, т.е. его выполнение приостанавливается до завершения работы функции. Таким образом, если по каким-то причинам ожидаемое для приема сообщение будет отсутствовать, выполнение параллельной программы будет блокировано.
Режимы передачи данных Функция MPI_Send обеспечивает так называемый стандартный (Standard) режим отправки сообщений, при котором на время выполнения функции процесс-отправитель сообщения блокируется, после завершения функции буфер может быть использован повторно, состояние отправленного сообщения может быть различным - сообщение может располагаться в процессе-отправителе, может находиться в процессе передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv. Кроме стандартного режима в MPI предусматриваются следующие дополнительные режимы передачи сообщений: Синхронный (Synchronous) режим состоит в том, что завершение функции отправки сообщения происходит только при получении от процесса-получателя подтверждения о начале приема отправленного сообщения, отправленное сообщение или полностью принято процессом-получателем или находится в состоянии приема, Буферизованный (Buffered) режим предполагает использование дополнительных системных буферов для копирования в них отправляемых сообщений; как результат, функция отправки сообщения завершается сразу же после копирования сообщения в системный буфер, Режим передачи по готовности (Ready) может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован. Для именования функций отправки сообщения для разных режимов выполнения в MPI используется название функции MPI_Send, к которому как префикс добавляется начальный символ названия соответствующего режима работы, т.е. MPI_Ssend – функция отправки сообщения в синхронном режиме, MPI_Bsend – функция отправки сообщения в буферизованном режиме, MPI_Rsend – функция отправки сообщения в режиме по готовности. Список параметров всех перечисленных функций совпадает с составом параметров функции MPI_Send. Для использования буферизованного режима передачи должен быть создан и передан MPI буфер памяти для буферизации сообщений – используемая для этого функция имеет вид int MPI_Buffer_attach(void *buf, int size), где buf - буфер памяти для буферизации сообщений, size – размер буфера. После завершения работы с буфером он должен быть отключен от MPI при помощи функции: int MPI_Buffer_detach(void *buf, int *size). По практическому использованию режимов можно привести следующие рекомендации: Режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т.к. обычно сложно гарантировать готовность операции приема, Стандартный и буферизованный режимы также выполняются достаточно быстро, но могут приводить к большим расходам ресурсов (памяти) – в целом может быть рекомендован для передачи коротких сообщений, Синхронный режим является наиболее медленным, т.к. требует подтверждения приема. В тоже время, этот режим наиболее надежен – можно рекомендовать его для передачи длинных сообщений.
|
||||
Последнее изменение этой страницы: 2016-04-08; просмотров: 557; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.140.100 (0.01 с.) |