Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Общая передача данных от всех процессов всем процессам↑ ⇐ ПредыдущаяСтр 6 из 6 Содержание книги
Поиск на нашем сайте
Передача данных от всех процессов всем процессам является наиболее общей операцией передачи данных. Выполнение данной операции может быть обеспечено при помощи функции: 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 - коммуникатор, в рамках которого выполняется передача данных.
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, для их упаковки необходимо выполнить: Для определения необходимого размера буфера для упаковки может быть использована функция: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 с.) |