Condividi tramite


funzione MPI_Alltoallv

Raccoglie i dati da e disperde i dati a tutti i membri di un gruppo. La funzione MPI_Alltoallv aggiunge flessibilità alla funzione MPI_Alltoall consentendo un numero variabile di dati da ogni processo.

Sintassi

int MPIAPI MPI_Alltoallv(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts,
  _In_  int          *sdispls,
        MPI_Datatype sendtype,
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts,
  _In_  int          *rdispls,
        MPI_Datatype recvtype,
        MPI_Comm     comm
);

Parametri

  • sendbuf [in]
    Puntatore ai dati da inviare a tutti i processi del gruppo. Il numero e il tipo di dati degli elementi nel buffer vengono specificati nei parametri sendcount e sendtype . Ogni elemento nel buffer corrisponde a un processo nel gruppo.

    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, sdispls e sendtype vengono ignorati. Ogni processo immette i dati nell'elemento del buffer di ricezione corrispondente.

    I dati inviati e ricevuti devono avere la stessa mappa dei tipi specificata dalla matrice recvcounts e dal parametro recvtype . I dati vengono letti dalle posizioni del buffer di ricezione specificato dal parametro rdispls .

  • sendcounts [in]
    Numero di elementi dati inviati da questo processo nel buffer specificato nel parametro sendbuf . Se un elemento insendcount è zero, la parte dei dati del messaggio da tale processo è vuota.

  • sdispls [in]
    Posizione, relativa al parametro sendbuf , dei dati per ogni processo di comunicatore.

    Entry j specifica lo spostamento relativo al parametro sendbuf da cui accettare i dati in uscita destinati al processo j.

  • sendtype
    Tipo di dati MPI degli elementi nel buffer di invio.

  • recvbuf [out]
    Puntatore a un buffer contenente i dati ricevuti da ogni processo. Il numero e il tipo di dati degli elementi nel buffer vengono specificati nei parametri recvcount e recvtype .

  • recvcounts [in]
    Numero di elementi dati di ogni processo communicator nel buffer di ricezione.

  • rdispls [in]
    Posizione, relativa al parametro recvbuf , dei dati di ogni processo di comunicatore.

    Nelle matrici di parametri recvbuf, recvcounts e rdispls, l'n elemento th di ogni matrice fa riferimento ai dati ricevuti dal processo ncommunicator.

  • recvtype
    Tipo di dati MPI di ogni elemento nel buffer.

  • Comm
    Specifica l'handle MPI_Comm communicator.

Valore restituito

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

In Fortran il valore restituito viene archiviato nel parametro IERROR .

Fortran

    MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
                COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

Commenti

La firma del tipo specificata dai parametri sendcount e sendtype per un processo deve essere uguale alla firma del tipo specificata dai parametri recvcount e recvtype del processo di ricezione. Pertanto, la quantità di dati inviati deve essere uguale alla quantità di dati ricevuti tra qualsiasi coppia di processi. Le mappe dei tipi distinti tra mittente e ricevitore sono ancora consentite.

Tutti i parametri sono significativi per tutti i processi. Il parametro comm deve essere identico in tutti i processi.

Se il parametro comm fa riferimento a un intracommunicator, il blocco jth inviato dal processo i viene ricevuto dal processo j e viene inserito nel blocco idel buffer di ricezione. Questi blocchi non devono avere tutte le stesse dimensioni.

Il risultato della chiamata alla funzione MPI_Alltoallv è come se ogni processo inviasse un messaggio a ogni altro processo con , MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)e ricevette un messaggio da ogni altro processo con una chiamata a MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …).

Se si specifica l'opzione sul posto, viene indicato che la stessa quantità e tipo di dati viene inviata e ricevuta tra due processi nel gruppo del comunicatore. Diverse coppie di processi possono scambiare quantità diverse di dati. Gli utenti devono assicurarsi che recvcounts[j] e recvtype nel processo i match recvcounts[i] e recvtype nel processo j. Questo scambio simmetrico può essere utile nelle applicazioni in cui i dati da inviare non vengono usati dal processo di invio dopo la chiamata di funzione MPI_Alltoallv .

Se il parametro comm fa riferimento a un intercomnicator, il risultato è come se ogni processo nel gruppo A invia un messaggio a ogni processo nel gruppo B e viceversa. Il jth send buffer of process i nel gruppo A deve essere coerente con il buffer di ricezione idi processo j nel gruppo B e viceversa.

Requisiti

Prodotto

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

Intestazione

Mpi.h; Mpif.h

Libreria

Msmpi.lib

DLL

Msmpi.dll

Vedi anche

Funzioni collettive MPI

MPI_Datatype

MPI_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv