Condividi tramite


funzione MPI_Gatherv

Raccoglie i dati delle variabili da tutti i membri di un gruppo a un singolo membro. La funzione MPI_Gatherv aggiunge flessibilità alla funzione MPI_Gather consentendo un numero variabile di dati da ogni processo.

Sintassi

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
);

Parametri

  • sendbuf [in]
    Handle in un buffer che contiene i dati da inviare al processo radice.

    Se il parametro comm fa riferimento a un intracommunicator, è possibile specificare un'opzione sul posto specificando MPI_IN_PLACE in tutti i processi. I parametri sendcount e sendtype vengono ignorati. Ogni processo immette i dati nell'elemento buffer di ricezione corrispondente. Il processo ninvia i dati all'elemento ndel buffer di ricezione. Si presuppone che i dati inviati dal processo radice siano nella posizione corretta nel buffer di ricezione.

  • sendcount
    Numero di elementi nel buffer di invio. Se sendcount è zero, la parte dei dati del messaggio è vuota.

  • sendtype
    Tipo di dati di ogni elemento nel buffer.

  • recvbuf [out, facoltativo]
    Handle in un buffer nel processo radice che contiene i dati ricevuti da ogni processo, inclusi i dati inviati dal processo radice. Questo parametro è significativo solo nel processo radice. Il parametro recvbuf viene ignorato per tutti i processi non radice.

  • recvcounts[] [ in, facoltativo]
    Numero di elementi ricevuti da ogni processo. Ogni elemento della matrice corrisponde al rango del processo di invio. Se il conteggio è zero, la parte dei dati del messaggio è vuota. Questo parametro è significativo solo nel processo radice.

  • displs[] [ in, facoltativo]
    Percorso, relativo al parametro recvbuf , dei dati di ogni processo di comunicatore. I dati ricevuti dal processo j vengono inseriti nel buffer di ricezione degli elementi di offset del processo radice displs[j] dal puntatore sendbuf .

    Nelle matrici di parametri recvbuf, recvcounts e displs , l'nth elemento di ogni matrice fa riferimento ai dati ricevuti dal processo ndi comunicatore.

    Questo parametro è significativo solo nel processo radice.

  • recvtype
    Tipo di dati di ogni elemento nel buffer. Questo parametro è significativo solo nel processo radice.

  • radice
    Classificazione del processo di ricezione all'interno del comunicatore specificato.

  • Comm
    Handle del comunicatore MPI_Comm.

Valore restituito

Restituisce MPI_SUCCESS sull'esito positivo. In caso contrario, il valore restituito è un codice di errore.

In Fortran il valore restituito viene archiviato nel parametro 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

Commenti

Tutti i parametri della funzione sono significativi nel processo radice, solo il sendbuf, sendcount, sendtype, root e comm sono significativi negli altri processi. I parametri radice e comm devono essere identici in tutti i processi.

In genere, i tipi di dati derivati sono consentiti per i parametri sendtype e recvtype . La firma del tipo come specificato dai parametri sendtype e recvtype in ogni processo deve essere uguale alla firma del tipo dei parametri recvcount e sendcount nel processo radice. La quantità di dati inviati deve essere uguale alla quantità di dati ricevuti tra il processo radice e ogni singolo processo. Le mappe dei tipi distinti tra mittente e ricevitore sono ancora consentite.

La specifica dei conteggi e dei tipi non deve causare la scrittura di più posizioni nella radice. Tale chiamata è errata.

Se il parametro comm fa riferimento a un intracommunicator, tutti i processi inviano il contenuto del relativo buffer di invio al processo radice. Il processo radice riceve i messaggi e li archivia in ordine di classificazione. Il risultato è come se ognuno dei processi n del gruppo che vengono eseguiti una chiamata a e la radice aveva eseguito n chiamate a MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)MPI_Send(sendbuf, sendcount, sendtype, root, …). Il valore di extent(recvtype) viene ottenuto usando la funzione MPI_Type_get_extent . Una descrizione alternativa della funzione è che i n messaggi inviati dai processi nel gruppo vengono concatenati nell'ordine di classificazione e il messaggio risultante viene ricevuto dalla radice come se da una chiamata a MPI_RECV(recvbuf, recvcountn, recvtype, ...). Il buffer di ricezione viene ignorato per tutti i processi non radice.

Se il parametro comm fa riferimento a un intercommunicator, la chiamata comporta tutti i processi nell'intercommunicator, ma con un gruppo, un gruppo A, che definisce il processo radice. Tutti i processi nell'altro gruppo, gruppo B, impostano lo stesso valore nel parametro radice , ovvero il rango del processo radice nel gruppo A. Il processo radice imposta il valore MPI_ROOT nel parametro radice . Tutti gli altri processi nel gruppo A impostano il valore MPI_PROC_NULL nel parametro radice . I dati vengono trasmessi dal processo radice a tutti i processi nel gruppo B. I parametri del buffer dei processi nel gruppo B devono essere coerenti con il parametro buffer del processo radice.

Requisiti

Prodotto

Pacchetto ridistribuibile HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package o HPC Pack 2008 Utilità client

Intestazione

Mpi.h; Mpif.h

Libreria

Msmpi.lib

DLL

Msmpi.dll

Vedi anche

Funzioni collettive MPI

MPI_Datatype

MPI_Gather