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

DO i=ti,MIN(ti+63,n)<br />

DO j=tj,MIN(tj+63,n)<br />

a(i,j) = b(j,i)<br />

END DO<br />

END DO<br />

END DO<br />

END DO<br />

decomponendo quindi il cosiddetto spazio delle iterazioni (ossia il dominio in cui scorrono gli<br />

indici del ciclo) in sotto-rettangoli tali che la cache è impiegata al meglio.<br />

3.8.6 Cycle shrinking<br />

Quando un ciclo si caratterizza per alcune dipendenze fra le sue istruzioni che impediscono il<br />

parallelismo è talvolta ancora possibile operare una certa manipolazione che garantisca un certo<br />

grado di parallelismo delle istruzioni. Una operazione di questo tipo è quella nota come cycle<br />

shrinking e consiste nel convertire un ciclo seriale in un doppio ciclo caratterizzato da un ciclo<br />

esterno seriale e da un ciclo interno parallelo. Ad esempio, considerato il seguente ciclo:<br />

DO i=1,n<br />

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

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

END DO<br />

appare subito evidente che, a causa della dipendenza della seconda istruzione dalla prima, le<br />

operazioni non possono essere parallelizzate in toto. Tuttavia, dal momento che il termine<br />

a(i+k) viene assegnato all’iterazione i ma utilizzato solo all’iterazione i+k (si dice, allora, in<br />

questo caso che la distanza di dipendenza è k) è possibile effettuare in parallelo blocchi di k<br />

istruzioni ed eseguire globalmente questi blocchi in serie:<br />

DO ti=1,n,k<br />

DO i=ti,ti+k-1<br />

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

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

END DO<br />

END DO<br />

3.8.7 Loop fission<br />

Quando due cicli interni sono controllati da uno stesso ciclo esterno, è spesso soluzione più<br />

efficiente scomporre il ciclo esterno in due parti più piccole in modo da lavorare con due coppie<br />

di cicli innestati del tutto indipendenti l’uno rispetto all’altro. Ciò consente di applicare in<br />

maniera più semplice ed efficace altri provvedimenti ottimizzanti quali il cache blocking, il loop<br />

fusion o il loop interchange. Questa operazione, detta di loop fission (o loop distribution o anche<br />

loop splitting) in generale consiste nello scomporre un singolo ciclo in più cicli all’interno dello

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

Saved successfully!

Ooh no, something went wrong!