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.

150 Array<br />

stesso spazio di iterazione ma ciascuno racchiudente soltanto un sottoinsieme delle operazioni<br />

del ciclo originale. Tale operazione può avere diversi effetti benefici sul codice:<br />

• Può dare luogo a cicli perfettamente innestati.<br />

• Può creare sub-loop privi (o con ridotto numero) di dipendenze fra le relative istruzioni.<br />

• Consentendo, ad esempio, di operare con array più piccoli che possono essere ospitati per<br />

intero nella cache può migliorare l’utilizzo della cache memory.<br />

• Diminuendo la pressione di registrazione può aumentare la frequenza di riutilizzo degli<br />

stessi registri di memoria.<br />

L’esempio che segue mostra come il loop fission possa rimuovere le dipendenze e consentire a<br />

una parte di ciclo di essere eseguita in parallelo:<br />

! ciclo originale<br />

DO i=1,n<br />

a(i) = a(i)*c<br />

x(i+1) = x(i)*7+x(i+1)+a(i)<br />

END DO<br />

! dopo il loop fission<br />

DO i=1,n<br />

a(i) = a(i)*c<br />

END DO<br />

DO i=1,n<br />

x(i+1) = x(i)*7+x(i+1)+a(i)<br />

END DO<br />

Un ulteriore esempio, leggermente più complesso, può servire a chiarire ulteriormente il concetto.<br />

Si consideri il seguente ciclo:<br />

! ciclo originale<br />

DO i=1,n<br />

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

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

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

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

END DO<br />

Per poter comprendere le dipendenze fra le varie istruzioni sarà bene riportare in successione<br />

l’effetto di ciascuna istruzione ad ogni iterazione:<br />

• S2 assegna un valore a b(i) che sarà usato da S1 all’iterazione successiva.<br />

• S2 assegna un valore a b(i) che sarà usato da S3 all’iterazione corrente.

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

Saved successfully!

Ooh no, something went wrong!