КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |