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.

154 Array<br />

b(i) = b(i)+b(2)<br />

END DO<br />

DO i=3,n<br />

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

END DO<br />

Come si può notare, il primo ciclo non può essere parallelizzato a causa della dipendenza fra<br />

l’iterazione i=2 e le iterazioni i=3,...,n. Inoltre i due cicli non possono essere fusi sotto il<br />

controllo di un’unica variabile indice a causa della differenza degli intervalli di variazione degli<br />

indici stessi. Tuttavia, se a b si applica l’unrolling relativamente al solo primo componente si<br />

risolvono contemporaneamente entrambi i problemi, come banalmente mostrato di seguito:<br />

! dopo il peeling<br />

IF(n>=2) THEN<br />

b(2) = b(2) + b(2)<br />

END IF<br />

DO i=3,n<br />

b(i) = b(i)+b(2)<br />

END DO<br />

DO i=3,n<br />

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

END DO<br />

! dopo il peeling e il fusion<br />

IF(n>=2) THEN<br />

b(2) = b(2) + b(2)<br />

END IF<br />

DO i=3,n<br />

b(i) = b(i)+b(2)<br />

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

END DO<br />

3.8.11 Loop reversal<br />

<strong>Il</strong> loop reversal è un tipo di trasformazione che consiste nell’invertire il verso di avanzamento<br />

dell’indice di un ciclo all’interno del range di iterazione. Questo tipo di trasformazione si rivela<br />

spesso indispensabile per poter consentire l’applicazione di altre forme di ottimizzazione come<br />

il loop fusion o il loop interchange. Come esempio, si consideri il seguente costrutto:<br />

DO i=1,n<br />

DO j=1,n<br />

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

END DO<br />

END DO

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

Saved successfully!

Ooh no, something went wrong!