GESTIRE GRUPPI

La gestione di gruppi diversi dal classico comunicatore MPI_COMM_WORLD che rappresenta tutti i processi attivi nella elaborazione parallela si ottiene attraverso la funzione

MPI_COMM_SPLIT(comunicatore, colore, chiave, nuovocomunicatore, ierr)

dove:

In pratica quindi il vecchio gruppo viene suddiviso in più sottogruppi disgiunti, uno per ogni valore di colore. Ogni sottogruppo contiene quei processi che hanno lo stesso valore di colore. All'interno di ogni sottogruppo i processi sono identificati con una nuova varibile intera (chiave). Il valore di colore deve essere maggiore o uguale a zero, mentre tutti i processi del comunicatore devono chiamare la funzione MPI_COMM_SPLIT.
Vediamo quindi un semplice esempio di utilizzo di MPI_COMM_SPLIT:
 
      program esempio5 
      include 'mpif.h' 
      integer nprocs, mype, ierr
      integer newprocs, newpe
      integer icolor, ikey

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

      if(nprocs.ne.4) stop 'N. proc. diverso da 4'

      if(mype.eq.0) then
        icolor = 1
        ikey   = 2
      elseif(mype.eq.1) then
        icolor = 1
        ikey   = 1
      elseif(mype.eq.2) then
        icolor = 2
        ikey   = 1
      else
        icolor = 2
        ikey   = 2
      endif

      call MPI_COMM_SPLIT(MPI_COMM_WORLD, icolor, ikey, 
     +                    nuovocom,ierr)
      call MPI_COMM_SIZE(nuovocom, newprocs, ierr) 
      call MPI_COMM_RANK(nuovocom, newpe, ierr)
 
      write(6,*) mype, newprocs, newpe 

      call MPI_FINALIZE(ierr) 
      end