Partager via


MPI_Alltoallv, fonction

Collecte les données d’un groupe et les diffuse à tous les membres d’un groupe. La fonction MPI_Alltoallv ajoute de la flexibilité à la fonction MPI_Alltoall en autorisant un nombre variable de données de chaque processus.

Syntaxe

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

Paramètres

  • sendbuf [in]
    Pointeur vers les données à envoyer à tous les processus du groupe. Le nombre et le type de données des éléments dans la mémoire tampon sont spécifiés dans les paramètres sendcount et sendtype . Chaque élément de la mémoire tampon correspond à un processus dans le groupe.

    Si le paramètre comm fait référence à un intracommunicateur, vous pouvez spécifier une option sur place en spécifiant MPI_IN_PLACE dans tous les processus. Les paramètres sendcount, sdispls et sendtype sont ignorés. Chaque processus entre des données dans l’élément de mémoire tampon de réception correspondant.

    Les données envoyées et reçues doivent avoir le même type de mappage que celui spécifié par le tableau recvcounts et le paramètre recvtype . Les données sont lues à partir des emplacements de la mémoire tampon de réception spécifiée par le paramètre rdispls .

  • sendcounts [in]
    Nombre d’éléments de données que ce processus envoie dans la mémoire tampon spécifiée dans le paramètre sendbuf . Si un élément danssendcount est égal à zéro, la partie données du message de ce processus est vide.

  • sdispls [in]
    Emplacement, par rapport au paramètre sendbuf , des données pour chaque processus de communication.

    L’entrée j spécifie le déplacement par rapport au paramètre sendbuf à partir duquel prendre les données sortantes destinées au processus j.

  • sendtype
    Type de données MPI des éléments dans la mémoire tampon d’envoi.

  • recvbuf [out]
    Pointeur vers une mémoire tampon qui contient les données reçues de chaque processus. Le nombre et le type de données des éléments dans la mémoire tampon sont spécifiés dans les paramètres recvcount et recvtype .

  • recvcounts [in]
    Nombre d’éléments de données de chaque processus de communication dans la mémoire tampon de réception.

  • rdispls [in]
    Emplacement, par rapport au paramètre recvbuf , des données de chaque processus de communication.

    Dans les tableaux de paramètres recvbuf, recvcounts et rdispls , le nièmeélément de chaque tableau fait référence aux données reçues du nièmeprocessus de communication.

  • recvtype
    Type de données MPI de chaque élément dans la mémoire tampon.

  • comm
    Spécifie le handle du communicateur MPI_Comm.

Valeur retournée

Retourne MPI_SUCCESS en cas de réussite. Sinon, la valeur de retour est un code d’erreur.

Dans Fortran, la valeur de retour est stockée dans le paramètre IERROR .

Fortran

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

Remarques

La signature de type spécifiée par les paramètres sendcount et sendtype pour un processus doivent être égales à la signature de type spécifiée par les paramètres recvcount et recvtype du processus de réception. Par conséquent, la quantité de données envoyées doit être égale à la quantité de données reçues entre n’importe quelle paire de processus. Les mappages de types distincts entre l’expéditeur et le destinataire sont toujours autorisés.

Tous les paramètres sont significatifs sur tous les processus. Le paramètre comm doit être identique sur tous les processus.

Si le paramètre comm fait référence à un intracommunicateur, le bloc jenvoyé à partir du processus i est reçu par le processus j et est placé dans le iième bloc de la mémoire tampon de réception. Ces blocs n’ont pas besoin d’avoir tous la même taille.

Le résultat de l’appel de la fonction MPI_Alltoallv est comme si chaque processus envoyait un message à tous les autres processus avec , MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)et recevait un message de tous les autres processus avec un appel à MPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …).

La spécification de l’option sur place indique que la même quantité et le même type de données sont envoyés et reçus entre les deux processus du groupe du communicateur. Différentes paires de processus peuvent échanger différentes quantités de données. Les utilisateurs doivent s’assurer que recvcounts[j] et recvtype on process i correspondent recvcounts[i] et recvtype on process j. Cet échange symétrique peut être utile dans les applications où les données à envoyer ne sont pas utilisées par le processus d’envoi après l’appel de fonction MPI_Alltoallv .

Si le paramètre comm fait référence à un intercommunicateur, le résultat est comme si chaque processus du groupe A envoyait un message à chaque processus du groupe B, et vice versa. La mémoiretampon d’envoi j du processus i dans le groupe A doit être cohérente avec la mémoiretampon de réception du processus j dans le groupe B, et vice versa.

Configuration requise

Produit

Package redistribuable MS-MPI HPC Pack 2012, package redistribuable HPC Pack 2008 R2 MS-MPI, package redistribuable MS-MPI HPC Pack 2008 ou utilitaires clients HPC Pack 2008

En-tête

Mpi.h ; Mpif.h

Bibliothèque

Msmpi.lib

DLL

Msmpi.dll

Voir aussi

Fonctions collectives MPI

MPI_Datatype

MPI_Alltoall

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv