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 |