Нижегородский государственный университет им. Н.И.Лобачевского Факультет Вычислительной математики и кибернетики Раздел 4_2. Параллельное программирование на основе MPI Образовательный комплекс Введение в методы параллельного программирования Гергель В.П., профессор, д.т.н. Кафедра математического обеспечения ЭВМ
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 2 из 50 Операции передачи данных между двумя процессорами –Режимы передачи данных –Организация неблокирующих обменов данными между процессорами –Одновременное выполнение передачи и приема Коллективные операции передачи данных –Обобщенная передача данных от всех процессов одному процессу –Обобщенная передача данных от одного процесса всем процессам –Общая передача данных от всех процессов всем процессам –Дополнительные операции редукции данных Производные типы данных в MPI –Способы конструирования производных типов данных Заключение Содержание
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 3 из 50 Операции передачи данных между двумя процессами… Режимы передачи данных… Стандартный (Standart): –обеспечивается функцией MPI_Send, –на время выполнения функции процесс-отправитель сообщения блокируется, –после завершения функции буфер может быть использован повторно, –состояние отправленного сообщения может быть различным - сообщение может располагаться в процессе-отправителе, может находиться в процессе передачи, может храниться в процессе-получателе или же может быть принято процессом-получателем при помощи функции MPI_Recv.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 4 из 50 Режимы передачи данных… Синхронный (Synchronous) режим –завершение функции отправки сообщения происходит только при получении от процесса-получателя подтверждения о начале приема отправленного сообщения: Режим передачи по готовности (Ready) –может быть использован только, если операция приема сообщения уже инициирована. Буфер сообщения после завершения функции отправки сообщения может быть повторно использован. MPI_Ssend – функция отправки сообщения в синхронном режиме MPI_Rsend – функция отправки сообщения в режиме по готовности Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 5 из 50 Режимы передачи данных… Буферизованный (Buffered) режим –используются дополнительные системные буферы для копирования в них отправляемых сообщений; функция отправки сообщения завершается сразу же после копирования сообщения в буфер, –Для использования буферизованного режима передачи должны быть создан и передан MPI буфер памяти: –После завершения работы с буфером он должен быть отключен от MPI при помощи функции: MPI_Bsend – функция отправки сообщения в буферизованном режиме, int MPI_Buffer_attach(void *buf, int size), где - buf - буфер памяти для буферизации сообщений, - size – размер буфера. int MPI_Buffer_detach(void *buf, int *size) Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 6 из 50 Режимы передачи данных… Режим передачи по готовности формально является наиболее быстрым, но используется достаточно редко, т.к. обычно сложно гарантировать готовность операции приема, Стандартный и буферизованный режимы также выполняются достаточно быстро, но могут приводить к большим расходам ресурсов (памяти), могут быть рекомендованы для передачи коротких сообщений, Синхронный режим является наиболее медленным, т.к. требует подтверждения приема. В тоже время, этот режим наиболее надежен – можно рекомендовать его для передачи длинных сообщений. Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 7 из 50 Организация неблокирующих обменов данными между процессорами… Блокирующие функции приостанавливают выполнение процессов до момента завершения работы вызванных функций, Неблокирующие функции обмена данными выполняются без блокировки процессов для совмещения процессов передачи сообщений и вычислений: –Более сложен для использования, –Может в значительной степени уменьшить потери эффективности параллельных вычислений из-за медленных коммуникационных операций. Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 8 из 50 Организация неблокирующих обменов данными между процессорами… Наименование неблокирующих аналогов образуется из названий соответствующих функций путем добавления префикса I (Immediate). int MPI_Isend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Issend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Ibsend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Irsend(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Irecv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Request *request); Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 9 из 50 Организация неблокирующих обменов данными между процессорами… Проверка состояния выполняемой неблокирующей операции передачи данных выполняется при помощи функции: Операция проверки является неблокирующей. int MPI_Test( MPI_Request *request, int *flag, MPI_status *status), где - request - дескриптор операции, определенный при вызове неблокирующей функции, - flag - результат проверки (=true, если операция завершена), - status - результат выполнения операции обмена (только для завершенной операции. Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 10 из 50 Организация неблокирующих обменов данными между процессорами… Возможная схема вычислений и выполнения неблокирующей операции обмена: Блокирующая операция ожидания завершения операции: MPI_Isend(buf,count,type,dest,tag,comm,&request); … do { … MPI_Test(&request,&flag,&status); } while ( !flag ); int MPI_Wait( MPI_Request *request, MPI_status *status); Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 11 из 50 MPI_Testall - проверка завершения всех перечисленных операций обмена, MPI_Waitall – ожидание завершения всех операций обмена, MPI_Testany - проверка завершения хотя бы одной из перечисленных операций обмена, MPI_Waitany – ожидание завершения любой из перечисленных операций обмена, MPI_Testsome - проверка завершения каждой из перечисленных операций обмена, MPI_Waitsome - ожидание завершения хотя бы одной из перечисленных операций обмена и оценка состояния по всем операциям. Организация неблокирующих обменов данными между процессорами Дополнительные функций проверки и ожидания неблокирующих операций обмена: Операции передачи данных между двумя процессами…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 12 из 50 Одновременное выполнение передачи и приема Функция, позволяющая эффективно одновременно выполнить передачу и прием данных: В случае, когда сообщения имеют одинаковый тип, имеется возможность использования единого буфера: 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 – структура данных с информацией о результате выполнения операции. 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). Операции передачи данных между двумя процессами
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 13 из 50 Под коллективными операциями в MPI понимаются операции данных, в которых принимают участие все процессы используемого коммуникатора Коллективные операции передачи данных…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 14 из 50 Коллективные операции передачи данных… Обобщенная передача данных от одного процесса всем процессам… Распределение данных – ведущий процесс (root) передает процессам различающиеся данные int MPI_Scatter(void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm), где - sbuf, scount, stype - параметры передаваемого сообщения (scount определяет количество элементов, передаваемых на каждый процесс), - rbuf, rcount, rtype - параметры сообщения, принимаемого в процессах, - root – ранг процесса, выполняющего рассылку данных, - comm - коммуникатор, в рамках которого выполняется передача данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 15 из 50 Коллективные операции передачи данных… Обобщенная передача данных от одного процесса всем процессам Вызов MPI_Scatter при выполнении рассылки данных должен быть обеспечен в каждом процессе коммуникатора, MPI_Scatter передает всем процессам сообщения одинакового размера. Если размеры сообщений для процессов могут быть разными, следует использовать функцию MPI_Scatterv.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 16 из 50 Коллективные операции передачи данных… Обобщенная передача данных от всех процессов одному процессу… Передача данных от всех процессоров одному процессу (сбор данных) является обратной к операции распределения данных int MPI_Gather(void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm), где - sbuf, scount, stype - параметры передаваемого сообщения, - rbuf, rcount, rtype - параметры принимаемого сообщения, - root – ранг процесса, выполняющего сбор данных, - comm - коммуникатор, в рамках которого выполняется передача данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 17 из 50 Коллективные операции передачи данных… Обобщенная передача данных от всех процессов одному процессу… MPI_Gather определяет коллективную операцию, и ее вызов при выполнении сбора данных должен быть обеспечен в каждом процессе коммуникатора
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 18 из 50 Коллективные операции передачи данных… Обобщенная передача данных от всех процессов одному процессу MPI_Gather собирает данные на одном процессе. Для получения всех собираемых данных на каждом процессе нужно использовать функцию сбора и рассылки: В случае, когда размеры передаваемых процессами сообщений могут быть различны, для передачи данных необходимо использовать функции MPI_Gatherv и MPI_Allgatherv. int MPI_Allgather(void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, MPI_Comm comm).
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 19 из 50 Коллективные операции передачи данных… Общая передача данных от всех процессов всем процессам…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 20 из 50 Коллективные операции передачи данных… Обобщенная передача данных от всех процессов всем процессам Вызов функции MPI_Alltoall при выполнении операции общего обмена данными должен быть выполнен в каждом процессе коммуникатора, Вариант операции общего обмена данных, когда размеры передаваемых процессами сообщений могут быть различны обеспечивается при помощи функций MPI_Alltoallv. 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 - коммуникатор, в рамках которого выполняется передача данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 21 из 50 Коллективные операции передачи данных… Дополнительные операции редукции данных… MPI_Reduce обеспечивает получение результатов редукции данных только на одном процессе, Функция MPI_AllReduce редукции и рассылки выполняет рассылку между процессами всех результатов операции редукции: Возможность управления распределением этих данных между процессами предоставляется функций MPI_Reduce_scatter, Функция MPI_Scan производит операцию сбора и обработки данных, при которой обеспечивается получение и всех частичных результатов редуцирования int MPI_Allreduce(void *sendbuf, void *recvbuf,int count, MPI_Datatype type,MPI_Op op,MPI_Comm comm) int MPI_Scan(void *sendbuf, void *recvbuf,int count, MPI_Datatype type, MPI_Op op,MPI_Comm comm)
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 22 из 50 Коллективные операции передачи данных Дополнительные операции редукции данных При выполнении функции MPI_Scan элементы получаемых сообщений представляют собой результаты обработки соответствующих элементов передаваемых процессами сообщений, при этом для получения результатов на процессе с рангом i, 0 i
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 23 из 50 Производные типы данных в MPI… Во всех ранее рассмотренных примерах использования функций передачи данных предполагалось, что сообщения представляют собой некоторый непрерывный вектор элементов предусмотренного в MPI типа, B общем случае, необходимые к пересылке данные могут располагаться не рядом и состоять из разного типа значений: –разрозненные данные могут быть переданы с использованием нескольких сообщений (такой способ ведет к накоплению латентности множества выполняемых операций передачи данных ), –разрозненные данные могут быть предварительно упакованы в формат того или иного непрерывного вектора (появление лишних операций копирования данных).
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 24 из 50 Производные типы данных в MPI… Производный тип данных в MPI - описание набора значений предусмотренного в MPI типа, значения могут не располагаться непрерывно по памяти: –Задание типа в MPI принято осуществлять при помощи карты типа (type map) в виде последовательности описаний входящих в тип значений, каждое отдельное значение описывается указанием типа и смещения адреса месторасположения от некоторого базового адреса: –Часть карты типа с указанием только типов значений именуется в MPI сигнатурой типа: TypeMap = {(type 0, disp 0 ), (type 1, disp 1 ), …, (type n-1, disp n-1 )} TypeSignature = {type 0, type 1, …, type n-1 }
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 25 из 50 Производные типы данных в MPI… Пример. –Пусть в сообщение должны входить значения переменных: –Тогда производный тип для описания таких данных должен иметь карту типа следующего вида: double a; /* адрес 24 */ double b; /* адрес 40 */ int n; /* адрес 48 */ {(MPI_DOUBLE,0), (MPI_DOUBLE,16), (MPI_INT,24) }
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 26 из 50 Производные типы данных в MPI… Для производных типов данных в MPI используется следующих ряд новых понятий: –нижняя граница типа: –верхняя граница типа: –протяженность типа (размер памяти в байтах, который нужно отводить для одного элемента производного типа): –размер типа данных - это число байтов, которые занимают данные. Различие в значениях протяженности и размера состоит в величине округления для выравнивания адресов.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 27 из 50 Производные типы данных в MPI… Для получения значения протяженности и размера типа в MPI предусмотрены функции: Определение нижней и верхней границ типа может быть выполнено при помощи функций: Важной и необходимой при конструировании производных типов является функция получения адреса переменной: int MPI_Type_extent ( MPI_Datatype type, MPI_Aint *extent ); int MPI_Type_size ( MPI_Datatype type, MPI_Aint *size ); int MPI_Type_lb ( MPI_Datatype type, MPI_Aint *disp ); int MPI_Type_ub ( MPI_Datatype type, MPI_Aint *disp ); int MPI_Address ( void *location, MPI_Aint *address );
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 28 из 50 Производные типы данных в MPI… Способы конструирования производных типов данных : –Непрерывный способ позволяет определить непрерывный набор элементов существующего типа как новый производный тип, –Векторный способ обеспечивает создание нового производного типа как набора элементов существующего типа, между элементами которого существуют регулярные промежутки по памяти. При этом, размер промежутков задается в числе элементов исходного типа, –Индексный способ отличается от векторного метода тем, что промежутки между элементами исходного типа могут иметь нерегулярный характер, –Структурный способ обеспечивает самое общее описание производного типа через явное указание карты создаваемого типа данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 29 из 50 Производные типы данных в MPI… Непрерывный способ конструирования : –Как следует из описания, новый тип newtype создается как count элементов исходного типа oldtype. Например, если исходный тип данных имеет карту типа то вызов функции MPI_Type_contiguous с параметрами приведет к созданию типа данных с картой типа: int MPI_Type_contiguous(int count,MPI_Data_type oldtype, MPI_Datatype *newtype); { (MPI_INT,0),(MPI_DOUBLE,8) }, MPI_Type_contiguous (2, oldtype, &newtype); { (MPI_INT,0),(MPI_DOUBLE,8),(MPI_INT,16),(MPI_DOUBLE,24) }.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 30 из 50 Производные типы данных в MPI… Векторный способ конструирования… –при векторном способе новый производный тип создается как набор блоков из элементов исходного типа, при этом между блоками могут иметься регулярные промежутки по памяти. int MPI_Type_vector ( int count, int blocklen, int stride, MPI_Data_type oldtype, MPI_Datatype *newtype ), где - count – количество блоков, - blocklen – размер каждого блока, - stride – количество элементов, расположенных между двумя соседними блоками - oldtype - исходный тип данных, - newtype - новый определяемый тип данных. int MPI_Type_hvector ( int count, int blocklen, MPI_Aint stride, MPI_Data_type oldtype, MPI_Datatype *newtype ); –Если интервалы между блоками задаются в байтах, а не в элементах исходного типа данных, следует использовать функцию:
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 31 из 50 Производные типы данных в MPI… Векторный способ конструирования: –создание производных типов для описания подмассивов многомерных массивов int MPI_Type_create_subarray ( int ndims, int *sizes, int *subsizes, int *starts, int order, MPI_Data_type oldtype, MPI_Datatype *newtype ), где - ndims – размерность массива, - sizes – количество элементов в каждой размерности исходного массива, - subsizes – количество элементов в каждой размерности определяемого подмассива, - starts – индексы начальных элементов в каждой размерности определяемого подмассива, - order - параметр для указания необходимости переупорядочения, - oldtype - тип данных элементов исходного массива, - newtype - новый тип данных для описания подмассива.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 32 из 50 Производные типы данных в MPI… Индексный способ конструирования: –новый производный тип создается как набор блоков разного размера из элементов исходного типа, при этом между блоками могут иметься разные промежутки по памяти. int MPI_Type_indexed ( int count, int blocklens[], int indices[], MPI_Data_type oldtype, MPI_Datatype *newtype ), где - count – количество блоков, - blocklens – количество элементов в каждов блоке, - indices – смещение каждого блока от начала типа (в количестве элементов исходного типа), - oldtype - исходный тип данных, - newtype - новый определяемый тип данных. int MPI_Type_hindexed ( int count, int blocklens[], MPI_Aint indices[],MPI_Data_type oldtype,MPI_Datatype *newtype); –Если интервалы между блоками задаются в байтах, а не в элементах исходного типа данных, следует использовать функцию:
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 33 из 50 Производные типы данных в MPI… Индексный способ конструирования: –конструирования типа для описания верхней треугольной матрицы размером n x n: // конструирование типа для описания верхней треугольной матрицы for ( i=0, i
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 34 из 50 Производные типы данных в MPI… Структурный способ конструирования: –является самым общим методом конструирования производного типа данных при явном задании соответствующей карты типа: int MPI_Type_struct ( int count, int blocklens[], MPI_Aint indices[], MPI_Data_type oldtypes[], MPI_Datatype *newtype ), где - count – количество блоков, - blocklens – количество элементов в каждов блоке, - indices – смещение каждого блока от начала типа (в байтах), - oldtypes - исходные типы данных в каждом блоке в отдельности, - newtype - новый определяемый тип данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 35 из 50 Производные типы данных в MPI… Объявление производных типов и их удаление: –перед использованием созданный тип должен быть объявлен : –При завершении использования производный тип должен быть аннулирован при помощи функции: int MPI_Type_commit (MPI_Datatype *type ); int MPI_Type_free (MPI_Datatype *type );
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 36 из 50 Производные типы данных в 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 - коммуникатор для упакованного сообщения.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 37 из 50 Производные типы данных в MPI… Формирование сообщений при помощи упаковки и распаковки данных…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 38 из 50 Производные типы данных в MPI… Формирование сообщений при помощи упаковки и распаковки данных… –Для определения необходимого размера буфера для упаковки может быть использована функция: –После упаковки всех необходимых данных подготовленный буфер может быть использован в функциях передачи данных с указанием типа MPI_PACKED, –После получения сообщения с типом MPI_PACKED данные могут быть распакованы при помощи функции: MPI_Pack_size (int count, MPI_Datatype type, MPI_Comm comm, int *size); int MPI_Unpack (void *buf, int bufsize, int *bufpos, void *data, int count, MPI_Datatype type, MPI_Comm comm);
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 39 из 50 Производные типы данных в MPI… Формирование сообщений при помощи упаковки и распаковки данных… –Вызов функции MPI_Pack осуществляется последовательно для упаковки всех необходимых данных. Если в сообщение должны входить данные то для их упаковки необходимо выполнить: –Для распаковки упакованных данных необходимо выполнить: double a /* адрес 24 */; double b /* адрес 40 */; int n /* адрес 48 */; 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); bufpos = 0; MPI_Unpack(buf,buflen,&bufpos,a,1,MPI_DOUBLE,comm); MPI_Unpack(buf,buflen,&bufpos,b,1,MPI_DOUBLE,comm); MPI_Unpack(buf,buflen,&bufpos,n,1,MPI_INT,comm);
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 40 из 50 Производные типы данных в MPI Формирование сообщений при помощи упаковки и распаковки данных: –Данный подход приводит к необходимости дополнительных действий по упаковке и распаковке данных, –Он может быть оправдан при сравнительно небольших размерах сообщений и при малом количестве повторений, –Упаковка и распаковка может оказаться полезной при явном использовании буферов для буферизованного способа передачи данных.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 41 из 50 Заключение… Во второй презентации раздела рассмотрены имеющиеся в MPI операции передачи данных между двумя процессами, а также возможные режимы выполнения этих операций. Обсуждается вопрос организации неблокирующих обменов данными между процессами. Подробно рассмотрены коллективные операции передачи данных. Представлены все основные способы конструирования и использования производных типов данных в MPI.
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 42 из 50 Достаточность состава поддерживаемых в MPI операций передачи данных. Рекомендации по использованию разных способов конструирования типов данных. Вопросы для обсуждения
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 43 из 50 Операции передачи данных между двумя процессами 1.Подготовьте варианты ранее разработанных программ с разными режимами выполнения операций передачи данных. Сравните время выполнения операций передачи данных при разных режимах работы. 2.Подготовьте варианты ранее разработанных программ с использованием неблокирующего способа выполнения операций передачи данных. Оцените необходимое количество вычислительных операций, для того чтобы полностью совместить передачу данных и вычисления. Разработайте программу, в которой бы полностью отсутствовали задержки вычислений из-за ожидания передаваемых данных. 3.Выполните задание 3 с использованием операции одновременного выполнения передачи и приема данных. Сравните результаты вычислительных экспериментов. Темы заданий для самостоятельной работы...
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 44 из 50 Коллективные операции передачи данных 4.Разработайте программу-пример для каждой имеющейся в MPI коллективной операции. 5.Разработайте реализации коллективных операций при помощи парных обменов между процессами. Выполните вычислительные эксперименты и сравните время выполнения разработанных программ и функций MPI для коллективных операций. 6.Разработайте программу, выполните эксперименты и сравните результаты для разных алгоритмов реализации операции сбора, обработки и рассылки данных всех процессам (функция MPI_Allreduce). Темы заданий для самостоятельной работы...
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 45 из 50 Производные типы в MPI 7.Разработайте программу-пример для каждого имеющегося в MPI способа конструирования производных типов данных. 8.Разработайте программу-пример с использованием функций упаковки и распаковки данных. Выполните эксперименты и сравните с результатами при использовании производных типов данных. 9.Разработайте производные типы данных для строк, столбцов, диагоналей матриц. 10.Разработайте программу-пример для каждой из рассмотренных функций для управления процессами и коммуникаторами. 11.Разработайте программу для представления множества процессов в виде прямоугольной решетки. Создайте коммуникаторы для каждой строки и столбца процессов. Выполните коллективную операцию для всех процессов и для одного из созданных коммуникаторов. Сравните время выполнения операции. 12.Изучите самостоятельно и разработайте программы-примеры для передачи данных между процессами разных коммуникаторов. Темы заданий для самостоятельной работы
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 46 из 50 Информационный ресурс Интернет с описанием стандарта MPI: Одна из наиболее распространенных реализаций MPI библиотека MPICH представлена на Библиотека MPICH2 с реализацией стандарта MPI-2 содержится на unix.mcs.anl.gov/mpi/mpich2http://www- unix.mcs.anl.gov/mpi/mpich2 Русскоязычные материалы о MPI имеются на сайте Ссылки
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 47 из 50 Воеводин В.В., Воеводин Вл.В. (2002). Параллельные вычисления. – СПб.: БХВ-Петербург.БХВ-Петербург Корнеев В.В. (2003) Параллельное программирование в MPI. Москва-Ижевск: Институт компьютерных исследований,2003 Немнюгин С., Стесик О. (2002). Параллельное программирование для многопроцессорных вычислительных систем – СПб.: БХВ-Петербург. Group, W., Lusk, E., Skjellum, A. (1994). Using MPI. Portable Parallel Programming with the Message-Passing Interface. – MIT Press. Group, W., Lusk, E., Skjellum, A. (1999a). Using MPI - 2nd Edition: Portable Parallel Programming with the Message Passing Interface (Scientific and Engineering Computation). - MIT Press. Литература…
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 48 из 50 Group, W., Lusk, E., Thakur, R. (1999b). Using MPI- 2: Advanced Features of the Message Passing Interface (Scientific and Engineering Computation). - MIT Press. Pacheco, P. (1996). Parallel Programming with MPI. - Morgan Kaufmann. Quinn, M. J. (2004). Parallel Programming in C with MPI and OpenMP. – New York, NY: McGraw-Hill. Snir, M., Otto, S., Huss-Lederman, S., Walker, D., Dongarra, J. (1996). MPI: The Complete Reference. - MIT Press, Boston, 1996.MPI: The Complete ReferenceMIT Press, Литература
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 49 из 50 Авторский коллектив Гергель В.П., профессор, д.т.н., руководитель Гришагин В.А., доцент, к.ф.м.н. Абросимова О.Н., ассистент (раздел 10) Лабутин Д.Ю., ассистент (система ПараЛаб) Курылев А.Л., ассистент (лабораторные работы 4, 5) Сысоев А.В., ассистент (раздел 1) Гергель А.В., аспирант (раздел 12, лабораторная работа 6) Лабутина А.А., аспирант (разделы 7,8,9, лабораторные работы 1, 2, 3, система ПараЛаб) Сенин А.В., аспирант (раздел 11, лабораторные работы по Microsoft Compute Cluster) Ливерко С.В. (система ПараЛаб)
Н.Новгород, 2005 г. Основы параллельных вычислений: Параллельное программирование на основе MPI © Гергель В.П. 50 из 50 Целью проекта является создание образовательного комплекса "Многопроцессорные вычислительные системы и параллельное программирование", обеспечивающий рассмотрение вопросов параллельных вычислений, предусматриваемых рекомендациями Computing Curricula 2001 Международных организаций IEEE-CS и ACM. Данный образовательный комплекс может быть использован для обучения на начальном этапе подготовки специалистов в области информатики, вычислительной техники и информационных технологий. Образовательный комплекс включает учебный курс "Введение в методы параллельного программирования" и лабораторный практикум "Методы и технологии разработки параллельных программ", что позволяет органично сочетать фундаментальное образование в области программирования и практическое обучение методам разработки масштабного программного обеспечения для решения сложных вычислительно-трудоемких задач на высокопроизводительных вычислительных системах. Проект выполнялся в Нижегородском государственном университете им. Н.И. Лобачевского на кафедре математического обеспечения ЭВМ факультета вычислительной математики и кибернетики ( Выполнение проекта осуществлялось при поддержке компании Microsoft. О проекте