Freigeben über


MPI_Reduce-Funktion

Führt einen globalen Reduzierungsvorgang für alle Mitglieder einer Gruppe aus. Sie können einen vordefinierten mathematischen oder logischen Vorgang oder einen anwendungsdefinierten Vorgang angeben.

Syntax

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

Parameter

  • sendbuf [in]
    Das Handle an einen Puffer, der die Daten enthält, die an den Stammprozess gesendet werden sollen.

    Wenn der comm-Parameter auf einen Intrakommunikationsgeber verweist, können Sie eine direkte Option angeben, indem Sie in allen Prozessen MPI_IN_PLACE angeben. Die Parameter sendcount und sendtype werden ignoriert. Jeder Prozess erfasst Daten im entsprechenden Empfangspufferelement. Der nth-Prozess sendet Daten an das nth-Element des Empfangspuffers. Der Stammprozess übernimmt seine Eingabedaten aus dem entsprechenden Element des Empfangspuffers und ersetzt sie durch die Ausgabedaten.

  • recvbuf [out, optional]
    Das Handle zu einem Puffer, um das Ergebnis des Reduzierungsvorgangs zu empfangen. Dieser Parameter ist nur beim Stammprozess von Bedeutung.

  • count
    Die Anzahl der Elemente, die von diesem Prozess gesendet werden sollen.

  • datatype
    Der Datentyp jedes Elements im Puffer. Dieser Parameter muss mit dem im op-Parameter angegebenen Vorgang kompatibel sein.

  • Op
    Der auszuführende Vorgang zur globalen Reduzierung. Das Handle kann einen integrierten oder anwendungsdefinierten Vorgang angeben. Eine Liste der vordefinierten Vorgänge finden Sie im Thema MPI_Op .

  • root
    Der Rang des empfangenden Prozesses innerhalb des angegebenen Kommunikators.

  • comm
    Das MPI_Comm Communicatorhandle.

Rückgabewert

Gibt MPI_SUCCESS nach Erfolg zurück. Andernfalls ist der Rückgabewert ein Fehlercode.

In Fortran wird der Rückgabewert im IERROR-Parameter gespeichert.

Fortran

    MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

Hinweise

Die MPI_Reduce-Funktion wird mit der Annahme implementiert, dass der angegebene Vorgang assoziativ ist. Alle vordefinierten Vorgänge sind so konzipiert, dass sie assoziativ und kommutativ sind. Benutzer können Vorgänge definieren, die assoziativ, aber nicht kommutativ sind. Die Standardauswertungsreihenfolge eines Reduktionsvorgangs wird durch die Ränge der Prozesse in der Gruppe bestimmt. Die Implementierung kann jedoch die Assozialität oder Assozialität und Kommutativität nutzen, um die Reihenfolge der Auswertung zu ändern. Dieser Prozess kann das Ergebnis der Reduzierung für Vorgänge ändern, die nicht streng assoziativ und kommutativ sind, z. B. Gleitkommazugabe.

Einige Anwendungen können die nicht assoziative Natur von Gleitkommavorgängen nicht ignorieren oder möglicherweise benutzerdefinierte Vorgänge verwenden, die eine spezielle Reihenfolge der Auswertung erfordern und nicht als assoziativ behandelt werden können. In diesem Fall können Sie die Reihenfolge der Auswertung explizit erzwingen. Bei Vorgängen, die beispielsweise eine strikte Auswertungsreihenfolge von links nach rechts oder von rechts nach links erfordern, können Sie den folgenden Prozess verwenden:

  1. Sammeln Sie alle Operanden in einem einzelnen Prozess, z. B. mithilfe der funktion MPI_Gather .
  2. Wenden Sie den Reduzierungsvorgang in der erforderlichen Reihenfolge an, z. B. mithilfe der funktion MPI_Reduce_local .
  3. Senden Oder verteilen Sie das Ergebnis bei Bedarf an die anderen Prozesse.

Hinweis

Es ist möglich, unterschiedliche benutzerdefinierte Vorgänge für die MPI_Reduce-Funktion in jedem Prozess bereitzustellen. Die Funktion definiert in diesem Fall nicht, welche Vorgänge für welche Operanden verwendet werden. Sie können keine Annahmen darüber treffen, wie die MPI_Reduce-Funktion implementiert ist. Es ist am sichersten, denselben Vorgang in jedem Prozess anzugeben.

 

Benutzerdefinierte Operatoren können mit allgemeinen, abgeleiteten Datentypen ausgeführt werden. In diesem Fall ist jedes Argument, auf das der Reduce-Vorgang angewendet wird, ein Element, das durch einen solchen Datentyp beschrieben wird, das mehrere Grundwerte enthalten kann.

Überlappende Datentypen sind in Sendepuffern zulässig, aber nicht in Empfangspuffern. Überlappende Datentypen in Empfangspuffern können unvorhersehbare Ergebnisse liefern und werden als Fehler betrachtet.

Wenn der comm-Parameter auf einen Intracommunicator verweist, kombiniert die MPI_Reduce-Funktion die Elemente, die im Eingabepuffer jedes Prozesses in der Gruppe angegeben sind, und gibt mithilfe des angegebenen Vorgangs den kombinierten Wert im Ausgabepuffer des Stammprozesses zurück.

Der Eingabepuffer und der Ausgabepuffer verfügen über die gleiche Anzahl von Elementen desselben Datentyps. Rufen Sie die Funktion in allen Gruppenmitgliedern auf, indem Sie dieselben Werte für die Parameter count, datatype, op, root und comm verwenden. Dadurch wird sichergestellt, dass alle Prozesse Eingabepuffer und Ausgabepuffer der gleichen Länge mit Elementen desselben Typs bereitstellen.

Jeder Prozess kann ein Element oder eine Sequenz von Elementen bereitstellen. In diesem Fall wird der Vorgang pro Element für jeden Eintrag der Sequenz ausgeführt. Wenn der Vorgang beispielsweise MPI_MAX ist und der Sendepuffer zwei Elemente enthält, die Gleitkommazahlen sind, recvbuf(1) empfängt das globale Maximum von (sendbuf(1)) und recvbuf(2) empfängt das globale Maximum von (sendbuf(2)).

Wenn der comm-Parameter auf einen Intercommunicator verweist, umfasst der Aufruf alle Prozesse im Intercommunicator, aber mit einer Gruppe, Gruppe A, die den Stammprozess definiert. Alle Prozesse in der anderen Gruppe, Gruppe B, legen denselben Wert im Stammparameter fest, d. h. den Rang des Stammprozesses in Gruppe A. Der Stammprozess legt den Wert MPI_ROOT im Stammparameter fest. Alle anderen Prozesse in Gruppe A legen den Wert MPI_PROC_NULL im Stammparameter fest. Nur Sendepufferparameter sind in Gruppen B-Prozessen von Bedeutung, und nur Empfangspufferparameter sind im Stammprozess von Bedeutung.

Anforderungen

Produkt

HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package oder HPC Pack 2008 Client Utilities

Header

Mpi.h; Mpif.h

Bibliothek

Msmpi.lib

DLL

Msmpi.dll

Weitere Informationen

MPI-Kollektivfunktionen

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast