Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Общая передача данных от всех процессов всем процессам

Поиск

Передача данных от всех процессов всем процессам является наиболее общей операцией передачи данных. Выполнение данной операции может быть обеспечено при помощи функции: int MPI_Alltoall(void *sbuf,int scount,MPI_Datatype stype,void *rbuf,int rcount,MPI_Datatype rtype,MPI_Comm comm), где sbuf, scount, stype - параметры передаваемых сообщений, rbuf, rcount, rtype - параметры принимаемых сообщенийcomm - коммуникатор, в рамках которого выполняется передача данных.


При выполнении функции MPI_Alltoall каждый процесс в коммуникаторе передает данные из scount элементов каждому процессу (общий размер отправляемых сообщений в процессах должен быть равен scount * p элементов, где p есть количество процессов в коммуникаторе comm) и принимает сообщения от каждого процесса. Вызов функции MPI_Alltoall при выполнении операции общего обмена данными должен быть выполнен в каждом процессе коммуникатора. Вариант операции общего обмена данных, когда размеры передаваемых процессами сообщений могут быть различны, обеспечивается при помощи функций MPI_Alltoallv. Пример использования функции MPI_Alltoall рассматривается в разделе 7 при разработке параллельных программ умножения матрицы на вектор как задание для самостоятельного выполнения.

 

30) Объявление производных типов и их удаление. Рассмотренные в предыдущем пункте функции конструирования позволяют определить производный тип данных. Дополнительно перед использованием созданный тип должен быть объявлен при помощи функции: int MPI_Type_commit (MPI_Datatype *type). При завершении использования производный тип должен быть аннулирован при помощи функции: int MPI_Type_free (MPI_Datatype *type).

Формирование сообщений при помощи упаковки и распаковки данных. Наряду с рассмотренными в п. 5.5.2 методами конструирования производных типов в MPI предусмотрен и явный способ сборки и разборки сообщений, содержащих значения разных типов и располагаемых в разных областях памяти. Для использования данного подхода должен быть определен буфер памяти достаточного размера для сборки сообщения. Входящие в состав сообщения данные должны быть упакованы в буфер при помощи функции: int MPI_Pack (void *data, int count, MPI_Datatype type, void *buf, int bufsize, int *bufpos, MPI_Comm comm), где data – буфер памяти с элементами для упаковки, count – количество элементов в буфере, type – тип данных для упаковываемых элементов, buf - буфер памяти для упаковки, buflen – размер буфера в байтах, bufpos – позиция для начала записи в буфер (в байтах от начала буфера), comm - коммуникатор для упакованного сообщения. Функция MPI_Pack упаковывает count элементов из буфера data в буфер упаковки buf, начиная с позиции bufpos. Начальное значение переменной bufpos должно быть сформировано до начала упаковки и далее устанавливается функцией MPI_Pack. Вызов функции MPI_Pack осуществляется последовательно для упаковки всех необходимых данных. Так, для ранее рассмотренного примера набора переменных a, b и n, для их упаковки необходимо выполнить:

bufpos = 0;MPI_Pack(a,1,MPI_DOUBLE,buf,buflen,&bufpos,comm);MPI_Pack(b,1,MPI_DOUBLE,buf,buflen,&bufpos,comm);MPI_Pack(n,1,MPI_INT,buf,buflen,&bufpos,comm);

Для определения необходимого размера буфера для упаковки может быть использована функция:int MPI_Pack_size (int count, MPI_Datatype type, MPI_Comm comm, int *size),которая в параметре size указывает необходимый размер буфера для упаковки count элементов типа type. После упаковки всех необходимых данных подготовленный буфер может быть использован в функциях передачи данных с указанием типа MPI_PACKED. После получения сообщения с типом MPI_PACKED данные могут быть распакованы при помощи функции: int MPI_Unpack (void *buf, int bufsize, int *bufpos,void *data, int count, MPI_Datatype type, MPI_Comm comm), где buf - буфер памяти с упакованными данными, buflen – размер буфера в байтах, bufpos – позиция начала данных в буфере (в байтах от начала буфера), data – буфер памяти для распаковываемых данных, count – количество элементов в буфере, type – тип распаковываемых данных, comm - коммуникатор для упакованного сообщения. Функция MPI_Unpack распаковывает начиная с позиции bufpos очередную порцию данных из буфера buf и помещает распакованные данные в буфер data. Начальное значение переменной bufpos должно быть сформировано до начала распаковки и далее устанавливается функцией MPI_Unpack. Вызов функции MPI_Unpack осуществляется последовательно для распаковки всех упакованных данных, при этом порядок распаковки должен соответствовать порядку упаковки. Так, для ранее рассмотренного примера упаковки для распаковки упакованных данных необходимо выполнить:

bufpos = 0;

MPI_Pack(buf,buflen,&bufpos,a,1,MPI_DOUBLE,comm);MPI_Pack(buf,buflen,&bufpos,b,1,MPI_DOUBLE,comm);MPI_Pack(buf,buflen,&bufpos,n,1,MPI_INT,comm);23. Одновременное выполнение передачи и приема

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

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

int MPI_Sendrecv (void *sbuf,int scount,MPI_Datatype stype,int dest, int stag,

void *rbuf,int rcount,MPI_Datatype rtype,int source,int rtag,

MPI_Comm comm, MPI_Status *status),

где

- sbuf, scount, stype, dest, stag - параметры передаваемого сообщения,

- rbuf, rcount, rtype, source, rtag - параметры принимаемого сообщения,

- comm - коммуникатор, в рамках которого выполняется передача данных,

- status – структура данных с информацией о результате выполнения операции.

Как следует из описания, функция MPI_Sendrecv передает сообщение, описываемое параметрами (sbuf, scount, stype, dest, stag), процессу с рангом dest и принимает сообщение в буфер, определяемый параметрами (rbuf, rcount, rtype, source, rtag), от процесса с рангом source.

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

int MPI_Sendrecv_replace (void *buf, int count, MPI_Datatype type, int dest,

int stag, int source, int rtag, MPI_Comm comm, MPI_Status* status).

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




Поделиться:


Последнее изменение этой страницы: 2016-04-08; просмотров: 299; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.134.77 (0.006 с.)