------------------------------------------------------------------
MPI_ALLGATHER(sendbuf, sendcount, sendtype, recvbuf,
recvcount, recvtype, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
IN | sendcount | Количество элементов в буфере передачи (целое) | ||||
IN | sendtype | Тип данных элементов буфера передачи (указатель) | ||||
OUT | recvbuf | Адрес буфера приема (по выбору) | ||||
IN | recvcount | Количество элементов, принимаемых от любого процесса (целое) | ||||
IN | recvtype | Тип данных элементов буфера приема (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Allgather(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype,
void* recvbuf, int recvcount,
const MPI::Datatype& recvtype)
const = 0
Опция in-place
для интракоммуникаторов указывается передачей
MPI_IN_PLACE
в качестве значения sendbuf
для всех процессов.
sendcount
и sendtype
игнорируются. При этом предполагается,
что входные данные каждого процесса располагаются таким образом, чтобы они
оказались в пространстве, где данный процесс сможет внести свой
собственный вклад в буфер приема. Особенность состоит в том, что результат
вызова MPI_ALLGATHER
для случая in-place
оказывается таким,
как если бы все процессы выполнили вызовов:
MPI_GATHER(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf,
recvcount, recvtype, root, comm)
для root
.
Если comm
- интеркоммуникатор, то каждый процесс из группы A
выдает элемент данных; эти элементы подвергаются конкатенации и результат
сохраняется в каждом процессе из группы B
. В то же время,
конкатенация всех вкладов от процессов из группы B
сохраняется в
каждом процессе из группы A
. Аргументы буферов передачи из группы
B
должны соответствовать аргументам буферов приема из группы
А
, и наоборот.
Совет пользователям:
Модель коммуникаций для MPI_ALLGATHER
, обрабатываемый в
интеркоммуникационном домене, не обязательно должна быть симметричной.
Число элементов, посылаемых процессами из группы A
(которое указано
аргументами sendcount
, sendtype
для группы A
и
аргументами recvcount
, recvtype
для группы B
), не
обязательно эквивалентно числу элементов, посылаемых процессами из группы
B
(которое указано аргументами sendcount
, sendtype
для группы B
и арггументами recvcount
, recvtype
для
группы A
). В частности, можно пересылать данные только в одном
направлении, указав sendcount = 0
для реализации связи в обратном
направлении. []
------------------------------------------------------------------
MPI_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf,
recvcounts, displs, recvtype, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
IN | sendcount | Количество элементов в буфере передачи (целое) | ||||
IN | sendtype | Тип данных элементов буфера передачи (указатель) | ||||
OUT | recvbuf | Адрес буфера приема (по выбору) | ||||
IN | recvcounts | Целочисленный массив (длины, равной длине группы), содержащий количество элементов, принимаемых от каждого процесса | ||||
IN | displs | Целочисленный массив (длины, равной длине группы). Элемент указывает относительное смещение в recvbuf, с которого будут помещаться приходящие от процесса данные | ||||
IN | recvtype | Тип данных элементов буфера приема (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Allgatherv(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype,
void* recvbuf, const int recvcounts[],
const int displs[],
const MPI::Datatype& recvtype)
const = 0
Опция in-place
для интракоммуникаторов указывается передачей
MPI_IN_PLACE
в качестве значения sendbuf
для всех процессов.
sendcount
и sendtype
игнорируются. При этом предполагается,
что входные данные каждого процесса располагаются таким образом, чтобы они
оказались в пространстве, где данный процесс сможет внести свой
собственный вклад в буфер приема. Особенность состоит в том, что результат
вызова MPI_ALLGATHER
для случая in-place
оказывается таким,
как если бы все процессы выполнили вызовов:
MPI_GATHER(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf,
recvcount, recvtype, root, comm)
для root
.
Если comm
- интеркоммуникатор, то каждый процесс из группы A
выдает элемент данных; эти элементы подвергаются конкатенации и результат
сохраняется в каждом процессе из группы B
. В то же время,
конкатенация всех вкладов от процессов из группы B
сохраняется в
каждом процессе из группы A
. Аргументы буферов передачи из группы
B
должны соответствовать аргументам буферов приема из группы
А
, и наоборот.
------------------------------------------------------------------
MPI_ALLTOALL(sendbuf, sendcount, sendtype, recvbuf,
recvcount, recvtype, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
IN | sendcount | Количество элементов в буфере передачи (целое) | ||||
IN | sendtype | Тип данных элементов буфера передачи (указатель) | ||||
OUT | recvbuf | Адрес буфера приема (по выбору) | ||||
IN | recvcount | Количество элементов, принимаемых от любого процесса (целое) | ||||
IN | recvtype | Тип данных элементов буфера приема (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Alltoall(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype,
void* recvbuf, int recvcount,
const MPI::Datatype& recvtype)
const = 0
Опция in-place
- не поддерживается.
Если comm
- интеркоммуникатор, то результатом результатом вызова
будет посылка каждым процессом из группы A
сообщения каждому
процессу из группы B
, и наоборот. -й буфер передачи процесса из
группы A
должен быть совместим с -м буфером приема процесса из группы
B
, и наоборот.
Совет пользователям:
Когда выполняется all-to-all
в интеркоммуникационном домене, число
элементов, посылаемых процессами из группы A
процессам из группы
B
, не обязательно должно совпадать с числом элементов, посылаемых в
обратном направлении. В частности, мы можем иметь однонаправленные
коммуникации, указав sendcount = 0
в обратном направлении.
[]
------------------------------------------------------------------
MPI_ALLTOALLV(sendbuf, sendcounts, sdispls, sendtype,
recvbuf, recvcounts, rdispls, recvtype, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
IN | sendcounts | Целочисленный массив длины, равной длине группы, указывающий количество элементов для передачи каждому процессу | ||||
IN | sdispls | Целочисленный массив (длины, равной длине группы). Элемент j указывает относительное смещение в sendbuf, с которого будут браться уходящие данные, предназначенные для процесса j | ||||
IN | sendtype | Тип данных элементов буфера передачи (указатель) | ||||
OUT | recvbuf | Адрес буфера приема (по выбору) | ||||
IN | recvcounts | Целочисленный массив (длины равной длине группы), содержащий количество элементов, принимаемых от каждого процесса |
IN | rdispls | Целочисленный массив длины, равной длине группы. Элемент i указывает относительное смещение в recvbuf, с которого будут помещаться приходящие процессу i данные | ||||
IN | recvtype | Тип данных элементов буфера приема (указатель) | ||||
IN | comm | Коммуникатор (указатель) |
void MPI::Comm::Alltoallv(const void* sendbuf,
const int sendcounts[],
const int sdispls[],
const MPI::Datatype& sendtype,
void* recvbuf,
const int recvcounts[],
const int rdispls[],
const MPI::Datatype& recvtype)
const = 0
Опция in-place
- не поддерживается.
Если comm
- интеркоммуникатор, то результатом будет посылка каждым
процессом из группы A
сообщения каждому процессу из группы
B
, и наоборот. -й буфер передачи процесса из группы
A
должен быть совместим с -ым буфером приема процесса из
группы B
, и наоборот.