25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

140 Array<br />

3.8.1 Loop interchange<br />

I moderni processori impiegano la memoria a disposizione secondo una struttura gerarchica.<br />

In questa scala gerarchica è la cosiddetta cache memory a caratterizzarsi per l’accesso più<br />

veloce ai registri per cui utilizzare i dati mentre risiedono nella cache memory consente al<br />

programma di ottimizzare i tempi di calcolo. L’accesso ai dati che risiedono temporaneamente<br />

nella cache avviene in maniera più efficiente se il programma, per spostarsi da un valore ad<br />

un altro, impiega ogni volta un passo unitario. Tale passo è definito come l’incremento usato<br />

per accedere al successivo elemento di array che si sta processando. Per conoscere il passo<br />

che il programma sta usando è necessario sapere in che ordine gli elementi dell’array sono<br />

immagazzinati in memoria. Normalmente i compilatori <strong>Fortran</strong> immagazzinano gli elementi<br />

di un array per colonne (contrariamente, ad esempio, a quanto fa il C che, invece, utilizza un<br />

ordinamento per righe) per cui, nella maggior pare dei casi, l’ordinamento effettivo rispecchia<br />

quello ideale. Così, ad esempio, se l’array a è rappresentativo della seguente matrice 4×3:<br />

⎡ ⎤<br />

⎢<br />

⎣<br />

a11 a12 a13<br />

a21 a22 a23<br />

a31 a32 a33<br />

a41 a42 a43<br />

⎥<br />

⎦<br />

i suoi elementi vengono disposti in memoria nel seguente ordine:<br />

a(11) a(21) a(31) a(41) a(12) a(22) a(32) a(42) a(13) a(23) a(33) a(43)<br />

Pertanto, il seguente costrutto:<br />

DO j = 1,3<br />

DO i = 1,4<br />

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

END DO<br />

END DO<br />

consente di accedere agli elementi di a con un passo unitario (ciò garantendo operazioni di<br />

accesso più efficienti), al contrario, invece, di quanto accade con quest’altro costrutto ottenuto<br />

dal precedente invertendone i cicli interno ed esterno:<br />

DO i = 1,4<br />

DO j = 1,3<br />

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

END DO<br />

END DO<br />

Naturalmente, in questo caso, dal momento che le dimensioni dell’array sono molto limitate,<br />

l’effetto che ha la scelta del procedimento adottato sulla velocità di esecuzione del programma è<br />

irrisoria. Ben altro discorso, invece, si ha quando si lavora con array di dimensioni considerevoli.<br />

Ad esempio, considerato il seguente programma:

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

Saved successfully!

Ooh no, something went wrong!