2011-12-22 9 views
6

Ho provato a utilizzare forall per allocare gli array dinamici, ma a Gfortran non piaceva. Ho anche scoperto che le istruzioni write sono proibite in un blocco forall e ho il sospetto che le istruzioni siano anche read.Fortran per tutte le restrizioni

Quali altre funzioni/operazioni non sono consentite in un blocco forall?

Esattamente a cosa serve questo costrutto, oltre a sostituire a volte i cicli do quando l'ordine non è importante? Ho pensato che avrebbe reso la codifica più leggibile ed elegante, soprattutto mostrando quando l'ordine delle operazioni non è importante, ma sembra abbastanza restrittivo con le operazioni che possono essere eseguite all'interno di uno forall.

Quali sono le ragioni di queste restrizioni, ovvero cosa proteggono/impediscono all'utente di incasinare? È una buona idea usare forall? Se sì, a quali scopi?

In questo momento nel codice su cui sto lavorando c'è solo un blocco forall e, se l'ho tradotto tutto nei cicli do, fornirebbe quattro cicli annidati. Qual è il modo migliore?

risposta

11

Oggigiorno non c'è molto bisogno dei costrutti FORALL e WHERE. Sono stati introdotti come parte di Fortran 95 (estensione minore di Fortran 90), principalmente ai fini dell'ottimizzazione, quando la vettorizzazione del codice era una cosa importante in HPC. Il motivo per cui FORALL è così limitato nell'applicazione è esattamente perché è stato progettato per l'ottimizzazione del ciclo. Si noti inoltre che, FORALL non è un costrutto di loop, ma assegnazione. Pertanto, solo le istruzioni di assegnazione sono consentite all'interno del blocco. In teoria, i loop DO forniscono istruzioni esplicite sull'ordine degli indici che il processore sta eseguendo il loopover. Un costrutto FORALL consente al compilatore di scegliere l'ordine più ottimale in base a come l'array viene archiviato in memoria. Tuttavia, questo ha perso significato nel tempo, dal momento che i compilatori moderni sono molto bravi con le vettorizzazioni del ciclo DO e non si noterà alcun miglioramento utilizzando FORALL.

vedere una bella discussione sulla FORALL e WHEREhere

Se siete preoccupati per le prestazioni del codice, si potrebbe invece prendere in considerazione un compilatore diverso - PGI o ifort. Dalla mia esperienza personale, gfortran è adatto allo sviluppo, ma non proprio per HPC. Noterai un'esecuzione fino a diverse volte più veloce con codice compilato con pgf90 o ifort.

+0

Grazie, lo hai chiarito. –

6

Forall il costrutto si è rivelato davvero troppo restrittivo ed è utile soprattutto per le operazioni con gli array. Per le limitazioni esatte vedere IBM Fortran - FORALL. Meno restrittivo è un costrutto do concurrent di Fortran 2008. Anche le dichiarazioni read e write sono consentite qui. Vedi Intel Fortran - DO CONCURRENT e New features of Fortran 2008.

+0

Non molti compilatori supportano ancora Fortran 2008, però. Sto usando gfortran, l'ultima versione stabile (4.6?) –

+1

Gfortran 4.6 ha il supporto parziale di esso http://fortranwiki.org/fortran/show/Fortran+2008+status e http://gcc.gnu.org/ onlinedocs/gfortran/Fortran-2008-status.html, che afferma il supporto per 'fare concomitanza 'nel nuovissimo gfortran. –

+0

Dovrei imparare come farlo. –