функция MPI_Gatherv
Собирает переменные данные от всех членов группы к одному члену. Функция MPI_Gatherv обеспечивает гибкость функции MPI_Gather , позволяя получать разное количество данных из каждого процесса.
Синтаксис
int MPIAPI MPI_Gatherv(
_In_ void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
_Out_opt_ void *recvbuf,
_In_opt_ int *recvcounts[],
_In_opt_ int *displs[],
MPI_Datatype recvtype,
int root,
MPI_Comm comm
);
Параметры
sendbuf [in]
Дескриптор буфера, который содержит данные, отправляемые корневому процессу.Если параметр comm ссылается на внутриобщий коммуникации, можно указать параметр на месте, указав MPI_IN_PLACE во всех процессах. Параметры sendcount и sendtype игнорируются. Каждый процесс вводит данные в соответствующий элемент буфера получения. N-йпроцесс отправляет данные в n-йэлемент буфера приема. Предполагается, что данные, отправляемые корневым процессом, должны находиться в правильном месте в буфере приема.
sendcount
Количество элементов в буфере отправки. Если значение sendcount равно нулю, часть данных сообщения пуста.sendtype
Тип данных каждого элемента в буфере.recvbuf [out, optional]
Дескриптор буфера корневого процесса, который содержит данные, полученные из каждого процесса, включая данные, отправляемые корневым процессом. Этот параметр имеет значение только в корневом процессе. Параметр recvbuf игнорируется для всех некорневых процессов.recvcounts[] [in, необязательный]
Количество элементов, полученных из каждого процесса. Каждый элемент в массиве соответствует рангу процесса отправки. Если счетчик равен нулю, часть данных сообщения пуста. Этот параметр имеет значение только в корневом процессе.displs[] [in, необязательный]
Расположение данных из каждого процесса коммуникатора относительно параметра recvbuf . Данные, полученные из процесса j , помещаются в буфер получения элементов корневого смещения процесса displs[j] из указателя sendbuf .В массивах параметров recvbuf, recvcounts и displsn-йэлемент каждого массива ссылается на данные, полученные из процесса n-гокоммуникатора.
Этот параметр имеет значение только в корневом процессе.
recvtype
Тип данных каждого элемента в буфере. Этот параметр имеет значение только в корневом процессе.root
Ранг принимающего процесса в указанном коммуникаторе.Comm
Дескриптор коммуникатора MPI_Comm .
Возвращаемое значение
Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение представляет собой код ошибки.
В Fortran возвращаемое значение хранится в параметре IERROR .
Fortran
MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR
Комментарии
Все параметры функции имеют важное значение для корневого процесса, только sendbuf, sendcount, sendtype, root и comm имеют важное значение в других процессах. Параметры root и comm должны быть одинаковыми во всех процессах.
Как правило, производные типы данных разрешены для параметров sendtype и recvtype . Подпись типа в соответствии с параметрами sendtype и recvtype в каждом процессе должна быть равна сигнатуре типа параметров recvcount и sendcount в корневом процессе. Объем отправляемых данных должен быть равен объему данных, получаемых между корневым процессом и каждым отдельным процессом. Сопоставление различающихся типов между отправителем и получателем по-прежнему разрешено.
Спецификация счетчиков и типов не должна приводить к тому, что любое расположение в корневом каталоге будет записано несколько раз. Такой вызов является ошибочным.
Если параметр comm ссылается на внутриобщие данные, все процессы отправляют содержимое буфера отправки корневому процессу. Корневой процесс получает сообщения и сохраняет их в порядке ранжирования. Результат будет таким же, как если бы каждый из n процессов в группе, которые выполняют вызов MPI_Send(sendbuf, sendcount, sendtype, root, …)
; и корневой элемент выполнил n вызовов MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)
. Значение extent(recvtype)
получается с помощью функции MPI_Type_get_extent . Альтернативное описание функции заключается в том, что n сообщений, отправляемых процессами в группе, объединяются в порядке ранжирования, а полученное сообщение получается корнем, как если бы путем вызова MPI_RECV(recvbuf, recvcountn, recvtype, ...)
метода . Буфер приема игнорируется для всех некорневых процессов.
Если параметр comm ссылается на интеркоммуникатор, то вызов включает все процессы в интеркоммуникаторе, но с одной группой, группой A, которая определяет корневой процесс. Все процессы в другой группе, группе B, задают одно и то же значение в корневом параметре, то есть ранг корневого процесса в группе A. Корневой процесс задает значение , MPI_ROOT в параметре root . Все остальные процессы в группе A задают значение , MPI_PROC_NULL в корневом параметре. Данные передаются из корневого процесса во все процессы в группе B. Параметры буфера процессов в группе B должны соответствовать параметру buffer корневого процесса.
Требования
Продукт |
Распространяемый пакет HPC 2012 MS-MPI, пакет HPC 2008 R2 распространяемый пакет MS-MPI, пакет HPC 2008 MS-MPI или клиентские служебные программы пакета HPC 2008 |
Заголовок |
Mpi.h; Mpif.h |
Библиотека |
Msmpi.lib |
DLL |
Msmpi.dll |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по