25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

3.8 Ottimizzazione delle operazioni con array 151<br />

• S3 assegna un valore a c(i) che sarà usato dalla stessa S3 all’iterazione successiva.<br />

• S3 assegna un valore a c(i) che sarà usato da S4 all’iterazione corrente.<br />

Da quanto detto si può subito notare che il ciclo originale può essere ”splittato” nelle tre<br />

componenti S1, (S2, S3) e S4. Naturalmente, poiché le operazioni eseguite da S1 e da S4 sono<br />

subordinate a quelle eseguite dal blocco (S2, S3) è necessario che nella versione ”ottimizzata”<br />

del ciclo il blocco (S2, S3) preceda S1 e S4.<br />

! dopo il loop fission<br />

DO i=1,n<br />

b(i) = c(i-1)*x + y ! S2<br />

c(i) = 1./b(i) ! S3<br />

END DO<br />

DO i=1,n<br />

a(i) = a(i)+b(i-1) ! S1<br />

END DO<br />

DO i=1,n<br />

d(i) = SQRT(c(i)) ! S4<br />

END DO<br />

3.8.8 Loop fusion<br />

Se due cicli vicini operano sugli stessi dati, conviene di solito combinarli in un unico ciclo<br />

operando in tal modo l’operazione nota come loop fusion. Questo procedimento, che rappresenta<br />

un pò l’inverso del loop fission, non solo rende un codice più compatto e leggibile ma, al<br />

tempo stesso, consente di utilizzare più efficientemente la cache memory limitando al massimo<br />

il numero delle operazioni di lettura dei dati in memoria. Inoltre esso può aumentare la velocità<br />

di esecuzione dei cicli in quanto, fondendo insieme diversi cicli controllati dal medesimo indice,<br />

riduce il numero di condizioni logiche da verificare per la chiusura del loop. Un esempio di<br />

applicazione dell’operazione di fusione è riportata di seguito:<br />

! ciclo originale<br />

DO i=1,n<br />

a(i) = a(i) + k<br />

END DO<br />

DO i=1,n<br />

b(i+1) = b(i) + a(i)<br />

END DO<br />

! dopo il loop fusion<br />

DO i=1,n<br />

a(i) = a(i) + k

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!