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.

3.8 Ottimizzazione delle operazioni con array 141<br />

PROGRAM prova_ordinamento<br />

IMPLICIT NONE<br />

INTEGER :: i,j<br />

REAL,DIMENSION(5000,5000) :: array1=1.0,array2=2.0,array3=0.0<br />

REAL :: inizio,fine<br />

CALL CPU_TIME(inizio)<br />

DO j=1,5000<br />

DO i=1,5000<br />

array3(i,j) = array1(i,j)+array2(i,j)<br />

END DO<br />

END DO<br />

CALL CPU_TIME(fine)<br />

WRITE(*,*) "Tempo trascorso: ", fine-inizio<br />

STOP<br />

END PROGRAM prova_ordinamento<br />

si può subito notare che esso accede agli elementi dei array per colonna, ossia secondo il meccanismo<br />

ottimale che rispetta l’ordinamento in memoria degli elementi stessi. Compilato con<br />

l’Essential Lahey <strong>Fortran</strong> <strong>90</strong> Compiler (Rel. 4.00b) e mandato in esecuzione su un PC con<br />

processore Intel Pentium III, l’output prodotto è:<br />

Tempo trascorso: 3.20461<br />

Se, poi, si sostituisce il nido di DO con una più compatta ed elegante assegnazione in forma<br />

globale:<br />

array3 = array1+array2<br />

il risultato è molto prossimo al precedente:<br />

Tempo trascorso: 3.10446<br />

Ben altro risultato, invece, si ottiene quando si ritorna al doppio ciclo e si invertono gli indici<br />

i e j:<br />

DO i=1,5000<br />

DO j=1,5000<br />

array3(i,j) = array1(i,j)+array2(i,j)<br />

END DO<br />

END DO<br />

In questo caso, infatti, l’output è:<br />

Tempo trascorso: 24.6555

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

Saved successfully!

Ooh no, something went wrong!