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)
do i = 1+mype, n, nprocs
call MPI_REDUCE(sum,ssum,1,MPI_INTEGER,MPI_SUM,
if(mype.eq.0) then
|
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.