Синтаксис функции рассылки 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].
Номер принимающего буфера игнорируется во всех некорневых процессах.
Сигнатура типа, используемая sendcount, sendtype в процессе i должна быть такой же, как и сигнатура, используемая recvcounts[i], recvtype в корневом процессе. Необходимо, чтобы количество посланных и полученных данных совпадало попарно для корневого и каждого другого процессов. Однако по-прежнему разрешается различие в картах типов между отправителями и получателями, как показано на примере 4.6.
В корневом процессе используются все аргументы функции MPI_GATHERV, а на всех других процессах используются только аргументы sendbuf, sendcount, sendtype, root, comm. Переменные comm и root должны иметь одинаковые значения во всех процессах.
Описанные в функции MPI_GATHERV количества, типы данных и смещения не должны приводить к тому, чтобы любая область корневого процесса записывалась бы более одного раза. Такой вызов является неверным.