função MPI_Gatherv
Coleta dados variáveis de todos os membros de um grupo para um membro. A função MPI_Gatherv adiciona flexibilidade à função MPI_Gather , permitindo uma contagem variada de dados de cada processo.
Sintaxe
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
);
Parâmetros
sendbuf [in]
O identificador para um buffer que contém os dados a serem enviados para o processo raiz.Se o parâmetro comm referenciar um intracomunicador, você poderá especificar uma opção in-loco especificando MPI_IN_PLACE em todos os processos. Os parâmetros sendcount e sendtype são ignorados. Cada processo insere dados no elemento de buffer de recebimento correspondente. O nºprocesso envia dados para o nºelemento do buffer de recebimento. Presume-se que os dados enviados pelo processo raiz estejam no lugar correto no buffer de recebimento.
sendcount
O número de elementos no buffer de envio. Se sendcount for zero, a parte de dados da mensagem estará vazia.sendtype
O tipo de dados de cada elemento no buffer.recvbuf [out, opcional]
O identificador para um buffer no processo raiz que contém os dados recebidos de cada processo, incluindo os dados enviados pelo processo raiz. Esse parâmetro é significativo apenas no processo raiz. O parâmetro recvbuf é ignorado para todos os processos não raiz.recvcounts[] [in, opcional]
O número de elementos recebidos de cada processo. Cada elemento na matriz corresponde à classificação do processo de envio. Se a contagem for zero, a parte de dados da mensagem estará vazia. Esse parâmetro é significativo apenas no processo raiz.displs[] [in, opcional]
O local, em relação ao parâmetro recvbuf , dos dados de cada processo do comunicador. Os dados recebidos do processo j são colocados no buffer de recebimento dos elementos displs[j] de deslocamento do processo raiz do ponteiro sendbuf .Nas matrizes de parâmetro recvbuf, recvcounts e displs , o nº elemento de cada matriz refere-se aos dados recebidos do nºprocesso do comunicador.
Esse parâmetro é significativo apenas no processo raiz.
recvtype
O tipo de dados de cada elemento no buffer. Esse parâmetro é significativo apenas no processo raiz.root
A classificação do processo de recebimento dentro do comunicador especificado.comm
O MPI_Comm identificador do comunicador.
Retornar valor
Retorna MPI_SUCCESS em caso de êxito. Caso contrário, o valor retornado será um código de erro.
Em Fortran, o valor retornado é armazenado no parâmetro 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
Comentários
Todos os parâmetros de função são significativos no processo raiz, somente sendbuf, sendcount, sendtype, root e comm são significativos nos outros processos. Os parâmetros raiz e comm devem ser idênticos em todos os processos.
Geralmente, tipos de dados derivados são permitidos para os parâmetros sendtype e recvtype . A assinatura de tipo conforme especificado pelos parâmetros sendtype e recvtype em cada processo deve ser igual à assinatura de tipo dos parâmetros recvcount e sendcount no processo raiz. A quantidade de dados enviados deve ser igual à quantidade de dados recebidos entre o processo raiz e cada processo individual. Mapas de tipo distintos entre remetente e receptor ainda são permitidos.
A especificação de contagens e tipos não deve fazer com que qualquer local na raiz seja gravado mais de uma vez. Tal chamada é errônea.
Se o parâmetro comm referenciar um intracomunicador, todos os processos enviarão o conteúdo de seu buffer de envio para o processo raiz. O processo raiz recebe as mensagens e as armazena na ordem de classificação. O resultado é como se cada um dos n processos no grupo que são executados uma chamada para MPI_Send(sendbuf, sendcount, sendtype, root, …)
; e a raiz tivesse executado n chamadas para MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)
. O valor de extent(recvtype)
é obtido usando a função MPI_Type_get_extent . Uma descrição alternativa da função é que as n mensagens enviadas pelos processos no grupo são concatenadas na ordem de classificação e a mensagem resultante é recebida pela raiz como se fosse por uma chamada para MPI_RECV(recvbuf, recvcountn, recvtype, ...)
. O buffer de recebimento é ignorado para todos os processos não raiz.
Se o parâmetro comm fizer referência a um intercomunicador, a chamada envolverá todos os processos no intercomunicador, mas com um grupo, o grupo A, que define o processo raiz. Todos os processos no outro grupo, grupo B, definem o mesmo valor no parâmetro raiz , ou seja, a classificação do processo raiz no grupo A. O processo raiz define o valor MPI_ROOT no parâmetro raiz . Todos os outros processos no grupo A definem o valor MPI_PROC_NULL no parâmetro raiz . Os dados são transmitidos do processo raiz para todos os processos no grupo B. Os parâmetros de buffer dos processos no grupo B devem ser consistentes com o parâmetro de buffer do processo raiz.
Requisitos
Produto |
Pacote Redistribuível do HPC Pack 2012 MS-MPI, Pacote Redistribuível HPC Pack 2008 R2 MS-MPI, Pacote Redistribuível do HPC Pack 2008 MS-MPI ou Utilitários de Cliente HPC Pack 2008 |
parâmetro |
Mpi.h; Mpif.h |
Biblioteca |
Msmpi.lib |
DLL |
Msmpi.dll |