Condividi tramite


funzione MPI_Alltoallw

Raccoglie i dati da e disperde i dati a tutti i membri di un gruppo. La funzione MPI_Alltoallw è la forma più generale di scambio di dati completo in questa API. MPI_Alltoallw abilita specifiche separate del conteggio, dello spostamento e del tipo di dati.

Sintassi

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        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, come specificato dalla matrice recvcounts e dal parametro recvtype e letti dalle posizioni del buffer di ricezione come specificato dal parametro rdispls .

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

  • sdispls [in]
    Posizione, in byte, 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.

  • sendtypes [in]
    Tipo di dati per ognuno degli elementi nel buffer di invio. Entry j specifica il tipo di dati inviati per elaborare j nel gruppo.

  • 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, in byte, relativa al parametro recvbuf , dei dati di ogni processo di comunicatore. Entry i specifica lo spostamento relativo al parametro recvbuf in corrispondenza del quale inserire i dati in ingresso dal processo i.

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

  • recvtypes [in]
    Tipo di dati di ogni elemento nel buffer. Voce i specifica il tipo di dati ricevuti dal processo i.

  • Comm
    Handle del comunicatore MPI_Comm .

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_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

Commenti

Importante

Per consentire la massima flessibilità, lo spostamento dei blocchi all'interno dei buffer di invio e ricezione viene specificato in byte. 

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.

La firma del tipo specificata dai parametri sendcounts[j] e sendtypes[j] per il processo i deve essere uguale alla firma del tipo associata a recvcounts[i] e recvtypes[i] in fase di elaborazione j. 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.

Il risultato di una chiamata alla funzione MPI_Alltoallw è come se ogni processo inviasse un messaggio a ogni altro processo con MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)e ricevette un messaggio da ogni altro processo con una chiamata a MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,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.

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_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv