щью коллективных операций (кроме процедуры 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