Помощь в написании студенческих работ
Антистрессовый сервис

Коллективные операции взаимодействия процессов

РефератПомощь в написанииУзнать стоимостьмоей работы

Операцией редукции называется операция, аргументом которой является вектор, а результатом — скалярная величина, полученная применением некоторой математической операции ко всем компонентам вектора. В частности, если компоненты вектора расположены в адресных пространствах ветвей, выполняющихся на различных процессорах, то в этом случае говорят о глобальной (параллельной) редукции. Int… Читать ещё >

Коллективные операции взаимодействия процессов (реферат, курсовая, диплом, контрольная)

Набор операций типа «точка-точка» в принципе является достаточным для программирования любых алгоритмов. Однако во многих случаях бывает удобнее использовать гак называемые «коллективные операции», которые, как правило, будут выполняться быстрее. Например, часто возникает потребность разослать значение переменной или массива из одного процессора всем остальным. Конечно, такую рассылку можно реализовать с использованием операций Send/Recv, однако гораздо удобнее воспользоваться специальной коллективной операцией.

Главное отличие коллективных операций от операций типа «точкаточка» состоит в том, что в них всегда участвуют все ветви указанного коммуникатора. Несоблюдение этого правила приводит либо к аварийному завершению программы, либо к еще более неприятному ее зависанию.

Отличительные особенности коллективных операций:

коллективные операции не взаимодействуют с операциями типа «точка-точка»;

  • — коллективные операции всегда выполняются в режиме с блокировкой;
  • — возврат из функции коллективного взаимодействия в каждой ветви происходит тогда, когда его участие в коллективной операции завершилось, однако это не означает, что другие ветви завершили операцию;
  • — количество получаемых данных должно быть в точности равно количеству посланных данных;
  • — типы элементов посылаемых и получаемых сообщений должны совпадать;
  • — сообщения не имеют идентификаторов (тэгов).

Барьерная синхронизация всех ветвей коммуникатора:

int MPIBarrierf MPIComm comm); - исполнение программы продолжится только тогда, когда все ветви коммуникатора сотт вызовут эту функцию.

Рассылка одного и того же сообщения от одной ветви всем остальным ветвям данного коммуникатора:

int MPIBcasttyoid* buffer, int count, MPl Datatype datatype, int sender, MPIjComm comm); - эта функция в ветви с номером sender работает как MPISend, а во всех остальных ветвях — как MPIRecv. Поэтому перед вызовом этой функции нс надо выяснять с помощью условного оператора, является ветвь sender’ом или нет. После возврата из этой функции массив buffer во всех ветвях будет содержать одинаковые значения в первых count элементах типа datatype.

Рассылка частей сообщений от одной ветви всем остальным ветвям данного коммуникатора:

int MPI_Scatter (void* send buffer, int send count, MPIDatatype senddatatype, void* recvbujfer, int recvcount, MPIDatatype recvdatatype, int sender, MPIComm comm); — эта функция тоже в ветви с номером sender работает как MPI Send а во всех остальных ветвях — как MPIRecv. Важно помнить, что должно выполняться условие recvcount*sizeof (recvdatatype) > = sendcount*sizeof (senddatatype), иначе программа будет завершена аварийно. После возврата из этой функции массив recvbuffer будет содержать:

в ветви 0: первые sendcount (0 — sendcountA) элементов буфера sendbujfer передающей ветви;

— в ветви 1: sendcount элементов с номерами от sendcount до 2*sendcount- буфера sendbuffer передающей ветви.

Векторный вариант рассылки:

int MPI_Scatterv (void *sendbuf int *sendcnts, int *displs, MPIDatatype senddatatype, void *recvbuf int reevent, MPIDatatype reevdatatype, int sender, MPIComm comm); — отличается от предыдущей функции тем, что количества элементов данных, рассылаемых по ветвям, управляются содержимым массива sendents (при этом для всех / должно быть reevent >= sendents[i], иначе параллельная программа аварийно завершается).

Сбор частей сообщений из всех ветвей коммуникатора в одну ветвь:

int MPI_G at her (void *sendbuf int sendent, MPIDatatype

senddatatype, void *recvbuf int reevent, MPI Datatype reevdatatype, int receiver, MPI Comm comm); - выполняемые действия в точности противоположны по отношению к MPI Scatter. В буфер recvbuf ветви receiver складываются порции данных из всех остальных ветвей в строгом соответствии с их номерами. Значение аргумента reevent может быть больше или равно sendent, но не наоборот. При reevent < sendent программа будет завершена аварийно.

Векторный вариант сбора частей сообщений от всех ветвей данного коммуникатора в одну ветвь:

int MPI Gatherv (void* sendbuf, int sendcount, MPI Datatype senddatatype, void* recvbuf, int *recvcnts, int *displs, MPI Datatype reevdatatype, int receiver, MPIjComm comm); - Как обычно, для каждой принимаемой порции должно удовлетворяться условие: reevents [i] *sizeof (reevdatatype) > = sendcount* size of (senddatatype), иначе — аварийное завершение.

Функция MPI Allgather выполняется так же, как MPI Gather, но получателями являются все ветви группы данного коммуникатора. Данные, отправленные ветвью / из своего буфера sendbuf помещаются в /-ю порцию буфера recvbuf каждой ветви. После завершения операции содержимое буферов приема recvbuf у всех ветвей будет одинаковым.

int MPI Allgather (void* sendbuf int sendcount, MPI Datatype senddatatype, void* recvbuf, int recvcount, MPIJDatatype reevdatatype, MPI Comm comm);

Функция MPI Allgatherv является аналогом функции MPI Gatherv, но сборка данных выполняется всеми ветвями коммуникатора. Поэтому в списке аргументов отсутствует параметр receiver.

int MPI_Allgatherv (void* sendbuf int sendcount, MPI Datatype senddatatype, void* recvbuf, int *recvcnts, int *displs, MPIJDatatype recvdatatype, MPIjComm comm);

Функция MPIAlltoall совмещает в себе операции Scatter и Gather и является, по сути, расширением операции Allgather, когда каждая ветвь посылает различные данные разным получателям. Ветвь i посылает /-й блок своего буфера sendbuf ветви у, которая помещает его в /'-й блок своего буфера recvbuf. Количество посланных данных должно быть равно количеству полученных данных для каждой пары ветвей.

int MPI_Alltoall (void *sendbuf int sendcount, MPI_Datatype senddatatype, void *recvbuf, int recvcount, MPIJDatatype recvdatatype, MPIjComm comm);

Функция MPI_Alltoallv является векторным вариантом функции MPI Alltoall, позволяющим гибко управлять местоположением и размерами порций сообщений, передаваемых между ветвями.

int MPI_Alltoallv (void * sendbuf int *sendcnts, int *senddispls,

MPIJDatatype senddatatype, void *recvbuf, int *recvcnts, int *recvdispls, MPIJDatatype recvdatatype, MPIjComm comm);

Еще более гибкой является функция MPI Alltoallw, дополнительно позволяющая передавать/принимагь данные разных типов:

int MPI Alltoallwfvoid *sendbuf int *sendcnts, int *senddispls,

MPI Datatype *senddatatypes, void *recvbuf, int *recvcnts, int *recvdispls, MPIDatatype *recvdatatypes, MPI Comm comm);

Операцией редукции называется операция, аргументом которой является вектор, а результатом — скалярная величина, полученная применением некоторой математической операции ко всем компонентам вектора. В частности, если компоненты вектора расположены в адресных пространствах ветвей, выполняющихся на различных процессорах, то в этом случае говорят о глобальной (параллельной) редукции.

Например, пусть в адресном пространстве ветвей некоторой группы имеются собственные копии переменной var (необязательно имеющие одно и то же значение). Тогда применение к этой переменной операции вычисления глобальной суммы или, другими словами, операции редукции SUM возвратит одно значение, которое будет содержать сумму всех локальных значений этой переменной.

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

ЫП1 л, a Максимальное значение.

MPIMAXLOC.

и его индекс Специальные типы для этих.

ипт ААтхтт w Минимальное значение функций MPI MINLOC.

— и его индекс Операции MAXLOC и MINLOC выполняются над специальными парными типами, каждый элемент которых хранит две величины: значения, по которым ищется максимум или минимум, и индекс элемента. В MPI имеется девять таких предопределенных типов:

Для языка С:

float and int double and int long and int int and int short and int long double and int

Название.

MPIMAX.

MPIMIN.

MPI_SUM.

MPIPROD.

MPILAND.

MPILOR.

MPILXOR.

MPIBAND.

MPIBOR.

MPI BXOR.

Поразрядное AND.

Поразрядное OR C: int. FORTRAN: integer,.

Поразрядное исключа- ющее OR.

Операция Максимум Минимум Сумма Произведение Логическое AND.

Логическое OR.

Логическое исключающее OR.

Разрешенные типы С: int. FORTRAN: integer, Floating point

C: int. FORTRAN: integer, Floating point. Complex

C int. FORTRAN: Logical

MPIFLOATINT.

MPIDOUBLEINT.

MPILONGINT.

MPI2INT.

MPISHORTINT.

MPILONGDOUBLEJNT.

Функция MPI Reduce:

int MPI_Reduce (void* sendbuf, void* recvbuf, int count, MPI Datatype datatype, MPI Op op, int receiver, MPIjComm comm); - над всеми элементами буфера sendbuf всех ветвей коммуникатора выполняется операция ор, результаты ее собираются в буфере recvbuf ветви receiver. В качестве операции ор можно использовать либо одну из предопределенных операций, либо операцию, сконструированную пользователем. Все предопределенные операции являются ассоциативными и коммутативными. Сконструированная пользователем операция, по крайней мере, должна быть ассоциативной. Порядок редукции определяется номерами ветвей в коммуникаторе. Тип datatype элементов должен быть совместим с операцией ор.

Похожа на MPI Reduce функция MPIAllreduce, только результаты собираются не в одной ветви, а во всех ветвях:

int MPI_AllReduce (void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPIjOp op, MPIjComm comm);

Функция MPI Reduce scatter отличается от MPI All reduce тем, что результат операции разрезается на непсресекающиеся части по числу ветвей в группе, /-я часть посылается i-й ветви в ее буфер приема. Длины этих частей задает третий параметр, являющийся массивом.

int MPI_Reduce_scatter (void *sendbuf, void *recvbuf, int *recvcnts, MPI Datatype datatype, MPI Op op, MPI Comm comm)

Функция MPIJScan выполняет префиксную включающую редукцию. Параметры такие же, как в MPI_Allreduce, но получаемые каждой ветвью результаты отличаются друг от друга. Операция пересылает в буфер приема i-й ветви редукцию значений из входных буферов ветвей с номерами 0,…, / включительно.

int MPIJScan (void * sendbuf, void* recvbuf, int count, MPI Datatype datatype, MPI_Op op, MPIjComm comm);

Функция MPIExscan выполняет префиксную исключающую редукцию (собственные значения каждой ветви нс участвуют в редукции):

int MPI_Exscan (void* sendbuf, void* recvbuf, int count, MPI Datatype datatype, MPIjOp op, MPIjComm comm);

Определение собственных операций для функций MPI Rcduce, MPIRcduccscattcr, MPI Allreduce и MPI Scan:

int MPI Op_create (MP I UserJunction *function, int commute, MPI Op *op);

Описание типа собственной функции выглядит следующим образом: typedef void (MPI User Junction) (void *a, void *b, int *len, MPI Datatype *dtvpe);

Эта функция должна выполнять обработку данных из векторов а и Ь следующим образом:

b[i] = ар] Пользовательская операция> b[i] для i = 0,1еп-1.

Удаление ранее определенной собственной функции.

int MPIOp Jree (MPI_Op *ор);

В результате вызова переменная ор получает значение МР1_ОР_ NULL.

Показать весь текст
Заполнить форму текущей работой