25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

3.8 Ottimizzazione delle operazioni con array 155<br />

Come è facilmente verificabile, per esso non è possibile scambiare gli indici i e j per cui non è<br />

possibile applicare il loop interchange pertanto se il valore n è sufficientemente elevato l’utilizzo<br />

della memoria si caratterizzerà per una scarsissima efficienza. Se, tuttavia, si invertono gli<br />

estremi del ciclo interno si ottiene un costrutto formalmente analogo:<br />

DO i=1,n<br />

DO j=n,1,-1<br />

a(i,j) = a(i-1,j+1)+1<br />

END DO<br />

END DO<br />

ma caratterizzato dalla possibilità di poter essere sottoposto ad interchange.<br />

Analogamente, se si osservano i cicli seguenti ci si accorge subito che essi non possono essere<br />

”fusi” direttamente a causa della dipendenza fra le istruzioni S2 ed S3:<br />

! cicli originali<br />

DO i=1,n<br />

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

c(i) = a(i)/2 ! S2<br />

END DO<br />

DO i=1,n<br />

d(i) = 1/c(i+1) ! S3<br />

END DO<br />

La dipendenza fra le istruzioni anzidette può essere facilmente riconosciuta, infatti considerando<br />

ad esempio i=5 ci si accorge subito che nella versione ”fusa” del costrutto:<br />

! dopo l’applicazione del loop fusion<br />

! (versione scorretta)<br />

DO i=1,n<br />

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

c(i) = a(i)/2 ! S2<br />

d(i) = 1/c(i+1) ! S3<br />

END DO<br />

l’istruzione S3 farebbe uso del vecchio valore di c(6) piuttosto che del nuovo valore calcolato<br />

da S2. La soluzione al problema è ovviamente offerta dalla possibilità di invertire il verso di<br />

scorrimento degli indici i e j (ossia applicando un loop reversal):<br />

! dopo l’applicazione del loop reversal<br />

DO i=n,1,-1<br />

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

c(i) = a(i)/2 ! S2<br />

END DO<br />

DO i=n,1,-1<br />

d(i) = 1/c(i+1) ! S3<br />

END DO

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

Saved successfully!

Ooh no, something went wrong!