RIDISTRIBUZIONE CICLICA

Usando una ridistribuzione in blocchi è possibile assegnare ai vari processi attivi un carico di lavoro sbilanciato se per qualche motivo il carico di lavoro all'interno delle iterazioni non è uniforme; la ridistribuzione ciclica qui descritta è una alternativa che può aiutare in questo problema.
Le iterazioni presenti in un ciclo del tipo seguente:

do i=n1,n2
  ...calcoli...
enddo

possono essere assegnate ai processi in modo ciclico nel seguente modo:

do i=n1+mype, n2, nprocs
  ...calcoli...
enddo

nella seguente tabella e' riportata la ridistribuzione ciclica dell'esempio nella pagina precedente:
 

ITERAZIONI 1 2 3 4 5 6 7 8 9 10 11 12 13 14
PROCESSI 0 1 2 3 0 1 2 3 0 1 2 3 0 1

mentre l'esempio di codice precedentemente parallelizzato ora diviene:
 

      program esempio8 
      include 'mpif.h' 
      parameter (n=100) 
      integer nprocs, mype, ierr 
      integer istart, iend 
      integer i, a, sum, ssum 
      dimension a(n) 

      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+mype, n, nprocs 
        a(i) = i 
      enddo 
      sum = 0 
      do i = 1+mype, n, nprocs
        sum = sum + a(i) 
      enddo 

      call MPI_REDUCE(sum,ssum,1,MPI_INTEGER,MPI_SUM, 
     +                0,MPI_COMM_WORLD,ierr) 

      if(mype.eq.0) then 
        write(6,*) 'somma = ', ssum 
      endif 
      call MPI_FINALIZE(ierr) 
      end 

Si deve osservare che in generale una ridistribuzione ciclica incorre maggiormente in ciò che viene chiamato con il termine cache misses a causa dell'accesso non uniforme agli elementi di matrice all'interno della loop.

E' possibile anche pensare a ridistribuzioni delle iterazioni di un ciclo che coinvolgono sia la formazioni di blocchi sia la distribuzione ciclica delle iterazioni in ciascun blocco tra i processi.