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 153<br />

! loop e procedura originali<br />

DO i=1,n<br />

CALL mysub(x,i)<br />

END DO<br />

SUBROUTINE mysub(a,j)<br />

IMPLICIT NONE<br />

REAL, DIMENSION(:) :: a<br />

INTEGER :: j<br />

...<br />

a(j) = a(j)+c<br />

...<br />

RETURN<br />

END SUBROUTINE mysub<br />

! invocazione della procedura e<br />

! procedura clonata dopo il loop pushing<br />

CALL mysub2(x)<br />

SUBROUTINE mysub2(a)<br />

IMPLICIT NONE<br />

REAL, DIMENSION(:) :: a<br />

INTEGER :: i<br />

...<br />

DO i=1,n<br />

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

END DO<br />

...<br />

RETURN<br />

END SUBROUTINE mysub2<br />

Naturalmente se nel ciclo ci sono altre istruzioni oltre alla chiamata di procedura, allora un<br />

prerequisito per il pushing dovrà essere il loop fission.<br />

3.8.10 Loop peeling<br />

Un’altra operazione utile in molti casi è il cosiddetto loop peeling. <strong>Il</strong> peeling ha due applicazioni<br />

principali: rimuovere le dipendenze create dalle prime o dalle ultime iterazioni di un ciclo<br />

(consentendo così la parallelizzazione delle istruzioni) e creare un match tra gli estremi di<br />

variazione degli indici di due o più cicli in modo da consentire una efficace operazione di fusione.<br />

Come esempio di applicazione della presente operazione, si guardi il seguente frammento di<br />

programma:<br />

DO i=2,n

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

Saved successfully!

Ooh no, something went wrong!