MPI_REDUCE

La funzione MPI_REDUCE agisce con una particolare operazione su dati appartenenti a differenti processi per consegnarne il risultato finale ad un particolare processo (a tutti i processi nel caso della funzione MPI_ALLREDUCE).
La sintassi di questa funzione è la seguente:

MPI_REDUCE(nome-in, nome-out,quanti, tipo,
           operazione, ricevente, comunicatore, ierr)

dove:

Esistono in MPI un certo numero di operazioni predefinite che possono essere incluse nella funzione MPI_REDUCE; le principali sono mostrate nella seguente tabella insieme al tipo di dati su cui principalmente operano:
 
                      Operazione
                             
                    Tipo di dati
                           
MPI_SUM    (esegue la somma)
MPI_PROD  (esegue il prodotto)
MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_COMPLEX
MPI_MIN    (trova il minimo)
MPI_MAX    (trova il massimo)
MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION
MPI_LAND  (and logico)
MPI_LOR   (or  logico)
MPI_LXOR  (xor logico)
MPI_LOGICAL
MPI_BAND  (and binario)
MPI_BOR   (or  binario)
MPI_BOR   (and binario)
MPI_INTEGER

Consideriamo quindi il seguente esempio:
 

      program esempio4 
      include 'mpif.h' 
      integer nprocs, mype, ierr, i
      integer isend, irecv 
      dimension isend(2), irecv(2)

      call MPI_INIT(ierr) 
      call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr) 
      call MPI_COMM_RANK(MPI_COMM_WORLD, mype, ierr) 

      do i=1,2
      isend(i) = mype + i
      enddo

      call MPI_REDUCE(isend(1),irecv(1),1,MPI_INTEGER, 
     +                MPI_SUM,0,MPI_COMM_WORLD,ierr)
      call MPI_REDUCE(isend(2),irecv(2),1,MPI_INTEGER, 
     +                MPI_PROD,0,MPI_COMM_WORLD,ierr)
      if(mype.eq.0) then 
        write(6,*) 'irecv: ', irecv(1), irecv(2)
      endif 
      call MPI_FINALIZE(ierr) 
      end