next up previous contents
Next: Редукции Up: Операции, которые пересылают данные Previous: Рассылка   Contents

''All'' формы и ''all-to-all''


------------------------------------------------------------------ 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 оказывается таким, как если бы все процессы выполнили $n$ вызовов:

MPI_GATHER(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf, recvcount, recvtype, root, comm)

для root $ = 0, ..., n - 1$.

Если 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 Целочисленный массив (длины, равной длине группы). Элемент $i$ указывает относительное смещение в recvbuf, с которого будут помещаться приходящие от процесса $i$ данные        
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 оказывается таким, как если бы все процессы выполнили $n$ вызовов:

MPI_GATHER(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf, recvcount, recvtype, root, comm)

для root $ = 0, ..., n - 1$.

Если 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, и наоборот. $j$-й буфер передачи процесса $i$ из группы A должен быть совместим с $i$-м буфером приема процесса $j$ из группы 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, и наоборот. $j$-й буфер передачи процесса $i$ из группы A должен быть совместим с $i$-ым буфером приема процесса $j$ из группы B, и наоборот.


next up previous contents
Next: Редукции Up: Операции, которые пересылают данные Previous: Рассылка   Contents
Alex Otwagin 2002-12-10