next up previous contents
Next: Пример использования MPI_SCATTER, MPI_SCATTERV Up: Коллективные взаимодействия процессов Previous: Примеры использования функций MPI_GATHER,   Contents

Рассылка

Синтаксис функции рассылки MPI_SCATTER представлен ниже.

MPI_SCATTER(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm)

IN sendbuf начальный адрес буфера рассылки (альтернатива, используется только корневым процессом)
IN sendcount количество элементов, посылаемых каждому процессу (целое, используется только корневым процессом)
IN sendtype тип данных элементов в буфере посылки (дескриптор, используется только корневым процессом)
OUT recvbuf адрес буфера процесса-получателя (альтернатива)
IN recvcount количество элементов в буфере корневого (целое)
IN recvtype тип данных элементов приемного буфера (дескриптор)
IN root номер процесса-получателя (целое)
IN comm коммуникатор (дескриптор)

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

MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT,
COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*) INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT,
RECVTYPE, ROOT, COMM, IERROR

void MPI::Intracomm::Scatter(const void* sendbuf, int sendcount,
const Datatype& sendtype, void* recvbuf, int recvcount,
const Datatype& recvtype, int root) const

Операция MPI_SCATTER обратна операции MPI_GATHER. Результат ее выполнения таков, как если бы корневой процесс выполнил n операций посылки MPI_Send(senbuf + i * extent(sendtype), sendcount, sendtype, i,...), и каждый процесс выполнит приём MPI_Recv(recvbuf, recvcount, recvtype, i,...)

Буфер отправки игнорируется всеми некорневыми процессами.

Сигнатура типа, связанная с sendcount, sendtype, должна быть одинаковой для корневого процесса и всех других процессов (хотя карты типов могут быть разными). Необходимо, чтобы количество посланных и полученных данных совпадало попарно для корневого и каждого другого процессов. Однако по-прежнему разрешается различие в картах типов между отправителями и получателями.

Корневой процесс использует все аргументы функции, а другие процессы используют только аргументы recvbuf, recvcount, recvtype, root, comm. Аргументы root и comm должны быть одинаковыми во всех процессах.

Описанные в функции MPI_SCATTER количества и типы данных не должны являться причиной того, чтобы любая ячейка корневого процесса записывалось бы более одного раза. Такой вызов является неверным.

Объяснение: Последнее ограничение введено (хотя это не вызывается необходимостью), чтобы достигнуть симметрии с MPI_GATHER, где соответствующее ограничение требуется.[]

Синтаксис функции рассылки MPI_SCATTERV представлен ниже.

MPI_SCATTERV(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype,
root, comm)

IN sendbuf адрес буфера посылки (альтернатива, используется только корневым процессом)
IN sendcounts целочисленный массив (размера группы), определяющий число элементов, для отправки каждому процессу
IN displs целочисленный массив (размера группы). Элемент i указывает смещение (относительно sendbuf, из которого берутся данные для процесса take the i)
IN sendtype тип элементов посылающего буфера (дескриптор)
OUT recvbuf адрес принимающего буфера (альтернатива)
IN recvcount число элементов в посылающем буфере (целое)
IN recvtype тип данных элементов принимающего буфера (дескриптор)
IN root номер посылающего процесса (целое)
IN comm коммуникатор (дескриптор)

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(SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

void MPI::Intracomm::Scatterv(const void* sendbuf,
const int sendcounts[], const int displs[],
const Datatype& sendtype, void* recvbuf, int recvcount,
const Datatype& recvtype, int root) const

По сравнению с MPI_GATHER при использовании функции MPI_GATHERV разрешается принимать от каждого процесса переменное число элементов данных, поэтому в функции MPI_GATHERV аргумент recvcount является массивом. Она также обеспечивает большую гибкость в размещении данных в корневом процессе. Для этой цели используется новый аргумент displs.

Выполнение MPI_GATHERV будет давать такой же результат, как если бы каждый процесс, включая корневой, послал бы корневому процессу сообщение

MPI_Send(sendbuf + displs[i] * extent(sendtype), sendcounts[i], sendtype, i, ...),

и корневой процесс выполнил n операций приема

MPI_Recv(recvbuf, recvcount, recvtype, i, ...).

Сообщения помещаются в принимающий буфер корневого процесса в порядке возрастания их номеров, то есть данные, посланные процессом j помещено в j-ю часть принимающего буфера recvbuf на корневом процессе. j-я часть recvbuf начинается со смещения displs[j].

Номер принимающего буфера игнорируется во всех некорневых процессах.

\includegraphics[width=5.34in,height=2.82in]{Ch4figure2.eps}

Сигнатура типа, используемая sendcount, sendtype в процессе i должна быть такой же, как и сигнатура, используемая recvcounts[i], recvtype в корневом процессе. Необходимо, чтобы количество посланных и полученных данных совпадало попарно для корневого и каждого другого процессов. Однако по-прежнему разрешается различие в картах типов между отправителями и получателями, как показано на примере 4.6.

В корневом процессе используются все аргументы функции MPI_GATHERV, а на всех других процессах используются только аргументы sendbuf, sendcount, sendtype, root, comm. Переменные comm и root должны иметь одинаковые значения во всех процессах.

Описанные в функции MPI_GATHERV количества, типы данных и смещения не должны приводить к тому, чтобы любая область корневого процесса записывалась бы более одного раза. Такой вызов является неверным.



Subsections
next up previous contents
Next: Пример использования MPI_SCATTER, MPI_SCATTERV Up: Коллективные взаимодействия процессов Previous: Примеры использования функций MPI_GATHER,   Contents
Alex Otwagin 2002-12-10