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.

144 Array<br />

! ciclo ottimizzato con loop skewing<br />

DO i=2,n-1<br />

DO j=i+2,i+m-1<br />

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

END DO<br />

END DO<br />

Naturalmente il codice trasformato è del tutto equivalente a quello originale ma con l’unica<br />

sostanziale differenza che per ogni valore di j tutte le operazioni in i possono essere eseguite<br />

in parallelo. Si noti, infine, che il ciclo originale può certamente essere sottoposto a loop<br />

interchange ove mai se ne realizzasse la necessità, ma di certo non potrebbe essere parallelizzato.<br />

Viceversa, al ciclo sottoposto a skewing può essere facilmente applicato l’interchange loop e<br />

parallelizzato:<br />

! ciclo sottoposto a skewing e interchange<br />

DO j=4,m+n-2<br />

DO i=MAX(2,j-m+1),MIN(n-1,j-2)<br />

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

END DO<br />

END DO<br />

3.8.3 Loop unswitching<br />

La presenza di istruzioni o costrutti condizionali all’interno di un ciclo può pregiudicare notevolmente<br />

l’utilizzo della cache memory e spesso impedisce la parallelizzazione del codice. In questi<br />

casi può essere opportuno applicare una semplice trasformazione, detta loop unswitching, che<br />

consiste nel decomporre le istruzioni IF e di ”clonare” il ciclo di conseguenza al fine di pervenire<br />

a due o più cicli privi di condizioni logiche da analizzare ad ogni passaggio. Ciò, naturalmente<br />

può aver luogo solo quando la condizione logica del costrutto IF è loop invariant in quanto è<br />

soltanto in questo caso che essa potrà essere estratta dal ciclo.<br />

A titolo di esempio, nel ciclo che segue la variabile x non dipende dal ciclo per cui la<br />

condizione logica sul suo valore può essere senz’altro portata fuori dal loop così che il ciclo<br />

stesso potrà essere duplicato in modo tale che le istruzioni del ramo .TRUE. del costrutto IF<br />

potranno essere eseguite in parallelo.<br />

! ciclo originale<br />

DO i=2,n<br />

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

IF(x

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

Saved successfully!

Ooh no, something went wrong!