Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Коммуникации точка-точка в MPI




Введение

Лабораторная работа №2

“ Программирование с использованием параллельной библиотеки MPI”

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

 

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

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

 

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

Рассмотрим функции блокирующей передачи сообщений – MPI_Send и MPI_Recv:

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

 

Данная функция отправляет данные, находящиеся по адресу buf в количестве count типа datatype процессу с рангом dest с тэгом сообщения tag. Посылка сообщения происходит в коммуникаторе comm. Параметр tag необходим для того, чтобы отличать сообщения от одного и того же процесса, либо сообщения от разных процессов, если принимающий процесс ожидает сообщение от любого процесса.

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Status *status) – Принимает данные и записывает их по адресу buf в количестве count типа datatype от процесса с рангом dest с тэгом сообщения tag. Прием сообщения происходит в коммуникаторе comm. По адресу status в структуру типа MPI_Status записывается информация о прошедшем приеме сообщения.

typedef struct MPI_Status {

int count; //Сколько байт получено

int cancelled; //Была ли передача прервана

int MPI_SOURCE; //От кого сообщение

int MPI_TAG; //Тэг сообщения

int MPI_ERROR; //Код ошибки

} MPI_Status;

 

Функции MPI_Send и MPI_Recv являются блокирующими. Возвращение из MPI_Send не происходит до тех пор, пока данные сообщения не будут скопированы во внутренний буфер MPI. MPI_Recv возвращает управление только после того, как сообщение было принято, таким образом, возможно появление взаимных блокировок процессов (deadlock) - ситуаций при который несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами. Блокировка может произойти в случае, когда два процесса попытаются обменяться сообщениями при помощи одинаковой последовательности вызовов (на примере процессов с рангами 0 и 1):

MPI_Send(buffer, 100, MPI_CHAR,!rank, 1, MPI_COMM_WORLD);

MPI_Recv(buffer, 100, MPI_CHAR,!rank, 1, MPI_COMM_WORLD,&st);

 

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

MPI_Sendrecv_replace:

int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype,

int dest, int sendtag,

void *recvbuf, int recvcount, MPI_Datatype recvtype,

int source, int recvtag,

MPI_Comm comm, MPI_Status *status)

 

Буфера sendbuf и recvbuf не должны пересекаться. Если необходимо обменяться данными, то следует использовать функцию MPI_Sendrecv_replace.

int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype,

int dest, int sendtag, int source, int recvtag,

MPI_Comm comm, MPI_Status *status)

Ниже приведен пример обмена данными двух процессов с рангами 0 и 1 при помощи вызова MPI_Sendrecv_replace:

#include <mpi.h>

#include <stdio.h>

static char data[100];

int main(int argc, char** argv)

{

int rank,size;

MPI_Status st;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

if (size!=2)

{

printf("This example should be run on 2 processors \n");

MPI_Finalize();

return 0;

}

if(rank==0) {

sprintf(data, “message from process 0 ”);

} else {

sprintf(data, “message from process 1 ”);

} MPI_Sendrecv_replace(&data,100, MPI_INT,!rank, 0,!rank,0,MPI_COMM_WORLD,&st);

printf("Process %d got %s. \n", rank, data);

MPI_Finalize();

return 0;

}

Результат работы:

Process 0 got message from process 1.

Process 1 got message from process 0.




Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 1439; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.