Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
522.63 Кб
Скачать
      1. Функции коллективного обмена данными

Широковещательная рассылка данных:

int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int source, MPI_Comm comm);

buffer - адрес начала буфера посылки сообщения (выходной параметр);

count - число передаваемых элементов в сообщении;

datatype - тип передаваемых элементов;

root - номер рассылающего процесса;

comm - идентификатор группы.

Выполняется рассылка сообщения от процесса root всем процессам, включая рассылающий процесс. При возврате из процедуры содержимое буфера buffer процесса root будет скопировано в локальный буфер процесса. Значения параметров count, datatype и root должны быть одинаковыми у всех процессов.

Функции сбора блоков данных от всех процессов группы:

int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm).

sendbuf - адрес начала буфера посылки;

sendcount - число элементов в посылаемом сообщении;

sendtype - тип элементов отсылаемого сообщения;

recvbuf - адрес начала буфера сборки данных (выходной параметр);

recvcount - число элементов в принимаемом сообщении;

recvtype - тип элементов принимаемого сообщения;

root - номер процесса, на котором происходит сборка данных;

comm - идентификатор группы;

ierror - код ошибки (выходной параметр).

Данная функция ("совок") выполняет сборку данных со всех процессов в буфере recvbuf процесса root. Каждый процесс, включая root, посылает содержимое своего буфера sendbuf процессу root. Собирающий процесс сохраняет данные в буфере recvbuf, располагая их в порядке возрастания номеров процессов. Параметр recvbuf имеет значение только на собирающем процессе и на остальных игнорируется, значения параметров sendcount, datatype и root должны быть одинаковыми у всех процессов. Векторный вариант функции сбора данных – MPI_Gatherv – позволяет задавать разное количество отправляемых данных в разных задачах-отправителях. Соответственно, на приемной стороне задается массив позиций в приемном буфере, по которым следует размещать поступающие данные, и максимальные длины порций данных от всех задач. Оба массива содержат позиции/длины не в байтах, а в количестве ячеек типа recvcount.

int MPI_Allgather(void* sendbuf, intsendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm);

int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void*rbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm).

Функция MPI_Allgather аналогична MPI_Gather, но прием осуществляется не в одной задаче, а во всех: каждая имеет специфическое содержимое в передающем буфере, и все получают одинаковое содержимое в буфере приемном. Как и в MPI_Gather, приемный буфер последовательно заполняется данными изо всех передающих. Вариант с неодинаковым количеством данных называется MPI_Allgatherv.

Функции распределения блоков данных по всем процессам группы:

int MPI_Scatter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm).

Функция MPI_Scatter ("разбрызгиватель") выполняет обратную "совку" операцию - части передающего буфера из задачи root распределяются по приемным буферам всех задач.

int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm).

Векторный вариант – MPI_Scatterv, рассылает части различной длины в приемные буфера разного размера.

Совмещенные коллективные операции:

int MPI_Alltoall(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm).

MPI_Alltoall : каждый процесс нарезает передающий буфер на куски и рассылает куски остальным процессам; каждый процесс получает куски от всех остальных и поочередно размещает их приемном буфере. Это "совок" и "разбрызгиватель" в одном флаконе. Векторный вариант называется MPI_Alltoallv.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]