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.

142 Array<br />

che è un valore di un ordine di grandezza superiore rispetto ai casi precedenti ed è, pertanto,<br />

rappresentativo di una condizione di lavoro certamente peggiore.<br />

La subroutine intrinseca CPU_TIME, utilizzata nel precedente esempio, sarà trattata in dettaglio<br />

al capitolo 5. Per il momento si anticipa solamente che il suo output è il tempo del<br />

processore (espresso in secondi) secondo una approssimazione dipendente dal processore stesso.<br />

A causa di questa dipendenza dal sistema di elaborazione si preferisce produrre il risultato della<br />

computazione sempre in termini di differenza fra due ”istanti” (tipicamente l’inizio e la fine di<br />

un processo) piuttosto che come tempo ”assoluto” che, di per sé, avrebbe scarso significato.<br />

E’ da notare che taluni compilatori ottimizzanti ”riordinano” i cicli del codice sorgente<br />

proprio in funzione dell’efficienza dell’accesso ai registri di memoria (così, ad esempio, il loop<br />

precedente verrebbe automaticamente ”riscritto” nella prima forma secondo un meccanismo<br />

noto come loop interchange), tuttavia è sempre buona norma sviluppare il codice sorgente in<br />

modo tale da minimizzare questo tipo di intervento da parte del compilatore.<br />

Molta cura, inoltre, si dovrebbe avere nel dimensionare un array multidimensionale. Una<br />

regola da seguire sempre, infatti, dovrebbe essere quella di dichiarare array caratterizzati da<br />

dimensioni degli indici decrescenti andando dal primo all’ultimo indice (a tal proposito si usa<br />

spesso dire ”il maggiore per primo”). Così, ad esempio, in un array bidimensionale, il numero<br />

di righe dovrebbe sempre superare il numero di colonne. La seguente dichiarazione di array:<br />

REAL(KIND(1.D0)), DIMENSION(100:20) :: matrix<br />

rispetta tale regola dal momento che l’estensione del primo indice, 100, è maggiore di quella<br />

del secondo indice, 20. Così matrix si compone di 20 colonne e 100 righe o ciò che è lo<br />

stesso, ciascuna colonna di matrix contiene 100 elementi mentre ciascuna riga ne contiene<br />

soltanto 20. <strong>Il</strong> beneficio comportato dall’indicizzare i cicli in questo modo è intimamente<br />

associato alla minimizzazione dei salti che la testina di lettura deve compiere per accedere<br />

ai dati immagazzinati in celle non contigue della cache memory. In questo modo l’esecuzione<br />

di istruzioni di questo tipo:<br />

DO j = 1,20<br />

DO i = 1,100<br />

matrix(i,j) = matrix(i,j)*SQRT(matrix(i,j))<br />

END DO<br />

END DO<br />

sarà efficacemente ottimizzata. Non solo. Se, infatti, le dimensioni dell’array sono tali che<br />

esso non possa essere contenuto per intero nella cache memory, lavorando nel modo anzidetto<br />

(ossia facendo sì che la dimensione maggiore dell’array sia quella delle colonne) si permette<br />

all’elaboratore di memorizzare temporaneamente nella cache soltanto una (presumibilmente<br />

intera) colonna per volta ossia, per ogni ciclo interno, soltanto quella colonna i cui elementi<br />

devono essere processati nello step corrente.<br />

Nel caso in cui si fosse comunque costretti ad accedere agli elementi di un array multidimensionale<br />

nella maniera meno efficiente, ossia per righe, si badi perlomeno a non fare in modo che<br />

la prima dimensione dell’array sia una potenza di due. Infatti, dal momento che le dimensioni<br />

della cache memory, espresse in unità di memorizzazione, rappresentano una potenza di due,

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

Saved successfully!

Ooh no, something went wrong!