щью коллективных операций (кроме процедуры MPI_Barrier). Если какой-то процесс завершил свое участие в коллективной операции, то это не означает ни того, что данная операция завершена другими процессами коммуникатора, ни даже того, что она ими начата (если это возможно по смыслу операции).В коллективных операциях не используются идентификаторы сообщений (теги). Таким образом, коллективные операции строго упорядочены согласно их появлению тексте программы.
MPI_BARRIER(COMM, IERR) INTEGER COMM, IERR
Процедура используется для барьерной синхронизации процессов. Работа
процессов блокируется до тех пор, пока все оставшиеся процессы коммуникатора не выполнят эту процедуру. Только после того, как
последний процесс коммуникатора выполнит данную процедуру, все процессы будут разблокированы и продолжат выполнение дальше. Данная процедура является коллективной. Все процессы должны вызвать MPI_BARRIER, хотя реально исполненные вызовы различными процессами коммуникатора могут быть расположены в разных местах программы.
MPI_BCAST(BUF, COUNT, DATATYPE, ROOT, COMM, IERR)-Рассылка элементов данных типа из массива от процесса ROOT, всем процессам данного коммуникатора включая сам
рассылающий процесс. При возврате из процедуры содержимое буфера процесса будет скопировано в локальный буфер каждого процесса
коммуникатора COMM. Значения параметров COUNT, DATATYPE, ROOT и COMM должны быть одинаковыми у всех процессов. MPI_GATHER(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, ROOT, COMM,
IERR)-Сборка элементов данных типа из массивов со всех процессов коммуникатора в буфере процесса. Каждый процесс включая, посылает содержимое своего буфера процессу. Собирающий процесс сохраняет данные в буфере RBUF, располагая их в порядке возрастания номеров процессов. MPI_SCATTER(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, ROOT,
COMM, IERR)-Процедура по своему действию является обратной к
MPI_GATHER. Она осуществляет рассылку по SCOUNT элементов данных типа
STYPE из массива Buff роцесса Root в массивы всех процессов комму-
никатора COMM, включая сам процесс ROOT. Можно считать, что массив SBUF делится на равные части по числу процессов, каждая из которых состоит из элементов типа STYPE. MPI_ALLGATHER(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM, IERR)- Сборка данных из массивов со всех процессов коммуникатора вбуфере каждого процесса. Данные сохраняются в порядке возрастания
номеров процессов. Блок данных, посланный процессом J-1, размещается в
J-ом блоке буфера RBUF принимающего процесса. Операцию можно рассмат-
ривать как MPI_GATHER, при которой результат получается на всех процессах
COMM коммуникатора. MPI_ALLTOALL(SBUF, SCOUNT, STYPE, RBUF, RCOUNT, RTYPE, COMM,
IERR)-Рассылка каждым процессом коммуникатора различных порций данных
всем другим процессам. J-й блок данных буфера SBUF (I-1)-го процесса попадает в i-й блок данных буфера Rbuf (j)-го процесса.
3) Коллективная обработка данных(редукция), встроенные операции редукции и их типы данных. Операция редукции данных определённая пользователем.
MPI_REDUCE(SBUF, RBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERR)-
Выполнение COUNT независимых глобальных операций OP над соответст-
щими элементами массивов SBuf. Результат выполнения операции OP над
I-ми элементами массивов SBUF всех процессов коммуникатора получа-
ется в I-ом элементе массива RBUF процесса ROOT.
MPI_MAX MPI_MIN– определение максимального и минимального
значения;
MPI_MINLOC, MPI_MAXLOC– определение максимального и минимального значения и их местоположения;
MPI_SUM, MPI_PROD – вычисление глобальной суммы и глобального произведения;
MPI_LAND MPI_LOR MPI_LXOR - логические “И”, “ИЛИ”, исключающее “ИЛИ”;
MPI_BAND MPI_BOR MPI_BXOR – побитовые “И”, “ИЛИ”, исключающее “ИЛИ”.
В MPI предусмотрен ряд предопределенных глобальных операций, они задаются следующими константами:
Кроме того, программист может задать свою функцию для выполнения глобальной операции при помощи процедуры MPI_OP_CREATE.
MPI_ALLREDUCE(SBUF, RBUF, COUNT, DATATYPE, OP, COMM, IERR) - Выполнение независимых глобальных операций OP над соответствующими элементами массивов SBUF. Отличие от процедуры MPI_REDUCE в
том, что результат получается в массиве RBUF каждого процесса.
MPI_REDUCE_SCATTER(SBUF, RBUF, RCOUNTS, DATATYPE, OP, COMM, IERR)-Выполнение суммы независимых глобальных операций i над соответствующими элементами массивов SBUF. Функционально это эквивалентно тому, что сначала выполняются глобальные операции, затем результат рассылается по процессам. I-ый процесс получает (I+1)-ую порцию результа - RCOUNTS(I+1) RBUF RCOUNTS
тов из элементов и помещает в массив. Массив должен быть одинаковым на всех процессах коммуникатора COMM. MPI_SCAN(SBUF, RBUF, COUNT, DATATYPE, OP, COMM, IERR)-Выполнение COUNT независимых частичных глобальных операций OP над соответствующими элементами массивов. Полный результат глобальной операции получается в массиве RBUF последнего процесса.
MPI_OP_CREATE(FUNC, COMMUTE, OP, IERR)-Создание пользовательской глобальной операции, которая будет вычисляться функцией FUNC. Создаваемая операция должна быть ассоциативной, а
если параметр COMMUTE равен TRUE, то она должна быть также и коммутативной. Если параметр COMMUTE равен. FALSE., то порядок выполнения глобальной операции строго фиксируется согласно увеличению номеров процессов, начиная с процесса с номером 0.
MPI_OP_FREE(OP, IERR) -Уничтожение пользовательской глобальной операции. По выполнении процедуры переменной OP присваивается значение MPI_OP_NULL.
4) Производные типы данных. Классификация. Требования стандарта в случае несоответствия типов данных при отправке и получении сообщения.
Производные типы данных
Производные типы MPI следует понимать как описатели расположения в памяти элементов базовых типов. Производный тип MPI представляет собой скрытый (opaque) объект, который специфицирует две вещи: последовательность базовых типов и последовательность смещений. Последовательность таких пар определяется как отображение (карта) типа:
Typemap = {(type0, disp0), ... , (typen-1, dispn-1)}
Отображение типа вместе с базовым адресом начала расположения данных buf определяет коммуникационный буфер обмена. Этот буфер будет содержать n элементов, а i-й элемент будет иметь адрес buf+disp и иметь базовый тип type. Стандартные типы MPI имеют предопределенные отображения типов. Например, MPI_INT имеет отображение {(int,0)}.
Стандартный сценарий определения и использования производных типов включает следующие шаги:
- Производный тип строится из предопределенных типов MPI и ранее определенных производных типов с помощью специальных функций-конструкторов MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct. Новый производный тип регистрируется вызовом функции MPI_Type_commit. Только после регистрации новый производный тип можно использовать в коммуникационных подпрограммах и при конструировании других типов. Предопределенные типы MPI считаются зарегистрированными. Когда производный тип становится ненужным, он уничтожается функцией MPI_Type_free.
Любой тип данных в MPI имеет две характеристики: протяженность и размер, выраженные в байтах:
- Протяженность типа определяет, сколько байт переменная данного типа занимает в памяти. Эта величина может быть вычислена как:
адрес последней ячейки данных - адрес первой ячейки данных + длина последней ячейки данных (опрашивается подпрограммой MPI_Type_extent). Размер типа определяет количество реально передаваемых байт в коммуникационных операциях. Эта величина равна сумме длин всех базовых элементов определяемого типа (опрашивается подпрограммой MPI_Type_size).
Для простых типов протяженность и размер совпадают.
Правила соответствия типов данных
Передача данных содержит следующие три фазы:
· данные выталкиваются из буфера процесса-отправителя, и части сообщения объединяются;
· сообщение передается от отправителя к получателю;
· данные выделяются из получаемого сообщения и помещаются в буфер получателя.
Соответствие типов должно отслеживаться на каждой из трех фаз:
· тип каждой переменной в буфере посылки должен соответствовать типу, указанному для этого элемента в операции посылки;
· тип, описанный в операции посылки, должен соответствовать типу, указанному в операции приема;
· тип каждой переменной в приемном буфере должен соответствовать типу, указанному для нее в операции приема.
Типы отправителя и получателя (фаза два) соответствуют друг другу, если обе операции используют одинаковые названия. Это означает, что MPI_INTEGER соответствует MPI_INTEGER, MPI_REAL соответствует MPI_REAL, и так далее. Тип переменной в хост–программе (главной программе) соответствует типу, указанному в операции обмена, если название типа данных, используемое этой операцией, соответствует базисному типу переменной хост–программы.
Имеется два исключения из этого последнего правила: элемент с названием типа MPI_BYTE или MPI_PACKED может соответствовать любому байту памяти (на байт-адресуемой машине), без учета типа переменной, которая содержит этот байт. Тип MPI_PACKED используется для передачи данных, которые были явно упакованы, или для получения данных, которые будут явно распакованы. Тип MPI_BYTE позволяет передавать двоичное значение байта из памяти.
Правила соответствия типов можно разделить на три категории:
· Коммуникация типизированных значений: типы данных соответствующих элементов в программе передачи, в вызове операции передачи, в вызове операции приема и в программе приема должны соответствовать друг другу.
· Коммуникация нетипизированных значений: нет никаких требований по типам соответствующих элементов в передающей и принимающей программах.
· Коммуникация, применяющая упакованные данные, где используется MPI_PACKED.
Преобразование данных
Одной из целей MPI является поддержка параллельных вычислений в неоднородной среде. Связь в такой среде может потребовать следующего преобразования данных:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


