Partager via


MPI_Reduce, fonction

Effectue une opération de réduction globale sur tous les membres d’un groupe. Vous pouvez spécifier une opération mathématique ou logique prédéfinie ou une opération définie par l’application.

Syntaxe

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            int          root,
            MPI_Comm     comm
);

Paramètres

  • sendbuf [in]
    Handle vers une mémoire tampon qui contient les données à envoyer au processus racine.

    Si le paramètre comm fait référence à un intracommunicateur, vous pouvez spécifier une option in place en spécifiant MPI_IN_PLACE dans tous les processus. Les paramètres sendcount et sendtype sont ignorés. Chaque processus entre des données dans l’élément de mémoire tampon de réception correspondant. Le nièmeprocessus envoie des données au nièmeélément de la mémoire tampon de réception. Le processus racine prend ses données d’entrée de l’élément correspondant de la mémoire tampon de réception et les remplace par les données de sortie.

  • recvbuf [out, facultatif]
    Handle vers une mémoire tampon pour recevoir le résultat de l’opération de réduction. Ce paramètre n’est significatif qu’au niveau du processus racine.

  • count
    Nombre d’éléments à envoyer à partir de ce processus.

  • datatype
    Type de données de chaque élément dans la mémoire tampon. Ce paramètre doit être compatible avec l’opération comme spécifié dans le paramètre op .

  • Op
    Opération de réduction globale à effectuer. Le handle peut indiquer une opération intégrée ou définie par l’application. Pour obtenir la liste des opérations prédéfinies, consultez la rubrique MPI_Op .

  • root
    Classement du processus de réception dans le communicateur spécifié.

  • comm
    Handle de 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_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

Remarques

La fonction MPI_Reduce est implémentée avec l’hypothèse que l’opération spécifiée est associative. Toutes les opérations prédéfinies sont conçues pour être associatives et commutatives. Les utilisateurs peuvent définir des opérations conçues pour être associatives, mais pas commutatives. L’ordre d’évaluation par défaut d’une opération de réduction est déterminé par les rangs des processus dans le groupe. Toutefois, l’implémentation peut tirer parti de l’associativité, ou de l’associativité et de la commutativité pour modifier l’ordre d’évaluation. Ce processus peut modifier le résultat de la réduction pour les opérations qui ne sont pas strictement associatives et commutatives, telles que l’ajout à virgule flottante.

Certaines applications ne peuvent pas ignorer la nature non associative des opérations à virgule flottante ou utiliser des opérations définies par l’utilisateur qui nécessitent un ordre d’évaluation spécial et ne peuvent pas être traitées comme associatives. Dans ce cas, vous pouvez appliquer explicitement l’ordre d’évaluation. Par exemple, dans le cas d’opérations qui nécessitent un ordre d’évaluation strict de gauche à droite ou de droite à gauche, vous pouvez utiliser le processus suivant :

  1. Rassemblez tous les opérandes en un seul processus, par exemple à l’aide de la fonction MPI_Gather .
  2. Appliquez l’opération de réduction dans l’ordre requis, par exemple, à l’aide de la fonction MPI_Reduce_local .
  3. Si nécessaire, diffusez ou diffusez le résultat vers les autres processus.

Notes

Il est possible de fournir différentes opérations définies par l’utilisateur à la fonction MPI_Reduce dans chaque processus. La fonction ne définit pas les opérations utilisées sur les opérandes dans ce cas. Vous ne pouvez pas faire d’hypothèses sur la façon dont la fonction MPI_Reduce est implémentée. Il est plus sûr de spécifier la même opération dans chaque processus.

 

Les opérateurs définis par l’utilisateur peuvent fonctionner sur des types de données généraux dérivés. Dans ce cas, chaque argument auquel l’opération reduce est appliquée est un élément décrit par un tel type de données, qui peut contenir plusieurs valeurs de base.

Les types de données qui se chevauchent sont autorisés dans les mémoires tampons d’envoi, mais pas dans les mémoires tampons de réception. Les types de données qui se chevauchent dans les mémoires tampons de réception peuvent donner des résultats imprévisibles et sont considérés comme une erreur.

Si le paramètre comm fait référence à un intracommunicateur, la fonction MPI_Reduce combine les éléments comme spécifié dans la mémoire tampon d’entrée de chaque processus du groupe et, à l’aide de l’opération spécifiée, retourne la valeur combinée dans la mémoire tampon de sortie du processus racine.

La mémoire tampon d’entrée et la mémoire tampon de sortie ont le même nombre d’éléments du même type de données. Appelez la fonction dans tous les membres du groupe en utilisant les mêmes valeurs pour les paramètres count, datatype, op, root et comm . Cette pratique garantit que tous les processus fournissent des mémoires tampons d’entrée et des mémoires tampons de sortie de la même longueur, avec des éléments du même type.

Chaque processus peut fournir un élément, ou une séquence d’éléments, auquel cas l’opération est exécutée par élément sur chaque entrée de la séquence. Par exemple, si l’opération est MPI_MAX et que la mémoire tampon d’envoi contient deux éléments qui sont des nombres à virgule flottante, reçoit recvbuf(1) le maximum global de (sendbuf(1)) et recvbuf(2) reçoit la valeur maximale globale de (sendbuf(2)).

Si le paramètre comm fait référence à un intercommunicateur, l’appel implique tous les processus de l’intercommunicateur, mais avec un groupe, le groupe A, qui définit le processus racine. Tous les processus de l’autre groupe, le groupe B, définissent la même valeur dans le paramètre racine , c’est-à-dire le rang du processus racine dans le groupe A. Le processus racine définit la valeur MPI_ROOT dans le paramètre racine . Tous les autres processus du groupe A définissent la valeur MPI_PROC_NULL dans le paramètre racine . Seuls les paramètres de mémoire tampon d’envoi sont significatifs dans les processus du groupe B et seuls les paramètres de mémoire tampon de réception sont significatifs dans le processus racine.

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_Gather

MPI_Op

MPI_Bcast