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.14 Costrutto e istruzione FORALL 169<br />

REAL, DIMENSION(10,10) :: matrice_identica=0.0<br />

...<br />

FORALL (i=1:10)<br />

matrice_identica(i,i) = 1.0<br />

END FORALL<br />

Un esempio appena più complicato è rappresentato dal seguente costrutto, che consente di<br />

calcolare il reciproco di un array mat evitando di operare divisioni per zero:<br />

FORALL (i=1:n, j=1:m, mat(i,j)/=0.)<br />

mat(i,j) = 1./mat(i,j)<br />

END FORALL<br />

In generale, ogni espressione che può essere scritta a mezzo di un costrutto FORALL potrebbe<br />

essere scritta, in modo perfettamente equivalente, con una serie di cicli DO innestati combinati<br />

con uno blocco IF. Ad esempio, l’esempio precedente potrebbe essere riscritto come:<br />

DO i=1,n<br />

DO j=1,m<br />

IF (mat(i,j)/=0.)<br />

mat(i,j) = 1./mat(i,j)<br />

END IF<br />

END DO<br />

END DO<br />

La differenza sostanziale fra le due soluzioni consiste nel fatto che mentre le istruzioni in un ciclo<br />

DO vengono eseguite in un ordine stretto, le istruzioni contenute in un costrutto FORALL possono<br />

essere eseguite in un ordine qualsiasi dipendente dal processore. Questa libertà consente alle<br />

architetture parallele di ottimizzare un programma in termini di velocità di esecuzione: ogni<br />

elemento può essere ”manipolato” da un processore differente e i diversi processori possono<br />

terminare il loro lavoro in un ordine qualsiasi ed indipendentemente l’uno dall’altro senza che<br />

ciò abbia influenza sul risultato finale.<br />

Se il corpo di un costrutto FORALL contiene più di una istruzione, allora il processore opererà<br />

prima su tutti gli elementi coinvolti dalla prima istruzione, per successivamente operare sugli<br />

elementi coinvolti nella seguente istruzione, e così via. Ad esempio, nel caso seguente:<br />

FORALL (i=2:n-1, j=2:n-1)<br />

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

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

END FORALL<br />

gli elementi di a saranno valutati tutti prima degli elementi di b.<br />

Si osservi che, proprio a causa del fatto che ciascun elemento di un array può essere processato<br />

indipendentemente dagli altri, il corpo di un costrutti FORALL non può contenere funzioni<br />

di ”trasformazione” il cui risultato dipenda dai valori dell’intero array. Si noti, inoltre, che,<br />

come per tutti gli altri costrutti, anche per i costrutti FORALL è permessa la presenza di forme<br />

innestate. Ad esempio, la sequenza:

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

Saved successfully!

Ooh no, something went wrong!