Condividi tramite


funzione MPI_Reduce

Esegue un'operazione di riduzione globale in tutti i membri di un gruppo. È possibile specificare un'operazione matematica o logica predefinita o un'operazione definita dall'applicazione.

Sintassi

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

Parametri

  • sendbuf [in]
    Handle in un buffer che contiene i dati da inviare al processo radice.

    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 e sendtype vengono ignorati. Ogni processo immette i dati nell'elemento buffer di ricezione corrispondente. Il processo ninvia i dati all'elemento ndel buffer di ricezione. Il processo radice accetta i dati di input dall'elemento corrispondente del buffer di ricezione e lo sostituisce con i dati di output.

  • recvbuf [out, facoltativo]
    Handle in un buffer per ricevere il risultato dell'operazione di riduzione. Questo parametro è significativo solo nel processo radice.

  • count
    Numero di elementi da inviare da questo processo.

  • datatype
    Tipo di dati di ogni elemento nel buffer. Questo parametro deve essere compatibile con l'operazione come specificato nel parametro op .

  • Op
    Operazione di riduzione globale da eseguire. L'handle può indicare un'operazione predefinita o definita dall'applicazione. Per un elenco di operazioni predefinite, vedere l'argomento MPI_Op .

  • radice
    Classificazione del processo di ricezione all'interno del comunicatore specificato.

  • Comm
    Handle del comunicatore MPI_Comm.

Valore restituito

Restituisce MPI_SUCCESS sull'esito positivo. In caso contrario, il valore restituito è un codice di errore.

In Fortran il valore restituito viene archiviato nel parametro IERROR .

Fortran

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

Commenti

La funzione MPI_Reduce viene implementata con il presupposto che l'operazione specificata sia associativa. Tutte le operazioni predefinite sono progettate per essere associative e commutative. Gli utenti possono definire operazioni progettate per essere associative, ma non commutative. L'ordine di valutazione predefinito di un'operazione di riduzione è determinato dai ranghi dei processi nel gruppo. Tuttavia, l'implementazione può sfruttare l'associatività o l'associatività e la commutabilità per modificare l'ordine della valutazione. Questo processo può modificare il risultato della riduzione per le operazioni che non sono strettamente associative e commutative, ad esempio l'aggiunta a virgola mobile.

Alcune applicazioni non possono ignorare la natura non associativa delle operazioni a virgola mobile o possono usare operazioni definite dall'utente che richiedono un ordine speciale di valutazione e non possono essere considerate associative. In questo caso, è possibile applicare l'ordine di valutazione in modo esplicito. Ad esempio, nel caso di operazioni che richiedono una stretta a sinistra a destra o a destra, ordine di valutazione, è possibile usare il processo seguente:

  1. Raccogliere tutti gli operandi in un singolo processo, ad esempio usando la funzione MPI_Gather .
  2. Applicare l'operazione di riduzione nell'ordine richiesto, ad esempio usando la funzione MPI_Reduce_local .
  3. Se necessario, trasmettere o dispersione il risultato agli altri processi.

Nota

È possibile fornire operazioni definite dall'utente diverse alla funzione MPI_Reduce in ogni processo. La funzione non definisce quali operazioni vengono usate su quali operandi in questo caso. Non è possibile fare ipotesi su come viene implementata la funzione MPI_Reduce . È più sicuro specificare la stessa operazione in ogni processo.

 

Gli operatori definiti dall'utente possono operare su tipi di dati generali e derivati. In questo caso, ogni argomento a cui viene applicata l'operazione di riduzione è un elemento descritto da tale tipo di dati, che può contenere diversi valori di base.

I tipi di dati sovrapposti sono consentiti nei buffer di invio, ma non nei buffer di ricezione. I tipi di dati sovrapposti nei buffer di ricezione possono dare risultati imprevedibili e vengono considerati un errore.

Se il parametro comm fa riferimento a un intracommunicator, la funzione MPI_Reduce combina gli elementi come specificato nel buffer di input di ogni processo nel gruppo e utilizzando l'operazione specificata, restituisce il valore combinato nel buffer di output del processo radice.

Il buffer di input e il buffer di output hanno lo stesso numero di elementi dello stesso tipo di dati. Chiamare la funzione in tutti i membri del gruppo usando gli stessi valori per il conteggio, il tipo di dati, l'op, la radice e i parametri comm . Questa procedura garantisce che tutti i processi forniscano buffer di input e buffer di output della stessa lunghezza, con elementi dello stesso tipo.

Ogni processo può fornire un elemento o una sequenza di elementi, in questo caso l'operazione viene eseguita per ogni elemento in ogni voce della sequenza. Ad esempio, se l'operazione è MPI_MAX e il buffer di invio contiene due elementi che sono numeri a virgola mobile, recvbuf(1) riceve il massimo globale di (sendbuf(1)) e recvbuf(2) riceve il massimo globale di (sendbuf(2)).

Se il parametro comm fa riferimento a un intercommunicator, la chiamata comporta tutti i processi nell'intercommunicator, ma con un gruppo, un gruppo A, che definisce il processo radice. Tutti i processi nell'altro gruppo, gruppo B, impostano lo stesso valore nel parametro radice , ovvero il rango del processo radice nel gruppo A. Il processo radice imposta il valore MPI_ROOT nel parametro radice . Tutti gli altri processi nel gruppo A impostano il valore MPI_PROC_NULL nel parametro radice . Solo i parametri del buffer di invio sono significativi nei processi B di gruppo e solo i parametri del buffer di ricezione sono significativi nel processo radice.

Requisiti

Prodotto

Pacchetto ridistribuibile HPC Pack 2012 MS-MPI Redistributable Package, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package o HPC Pack 2008 Utilità client

Intestazione

Mpi.h; Mpif.h

Libreria

Msmpi.lib

DLL

Msmpi.dll

Vedi anche

Funzioni collettive MPI

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast