2012-03-21 13 views
13

Recentemente ho scoperto l'uso di funzioni pure e subroutine in Fortran. Da quello che indica il manuale Fortran, sembra che la maggior parte delle mie subroutine sia effettivamente definita come pura (poiché specificherò sempre l'intento di tutti gli argomenti, e di solito non ho "salva", "pausa" o I/O esterno nella maggior parte delle mie subroutine). La mia domanda è: dovrei farlo? Mi chiedevo se il compilatore ottimizza le subroutine pure migliori o se semplicemente non importa, o se può peggiorare le cose. Grazie!Subroutine pure in Fortran - Ottimizzazione del compilatore

risposta

19

Si lavora con il compilatore per generare un buon codice e più informazioni si forniscono al compilatore, migliore è il lavoro voi due potete fare insieme.

Che si tratti di etichettatura con intent(in) argomenti fittizi non si cambia, o utilizzando parameter per le costanti, o esplicitamente facendo pure qualsiasi sottoprogramma che non ha effetti collaterali, o utilizzando forall quando non si ha realmente a cuore l'ordine di un ciclo è calcolato in, per essere più esplicito su ciò che si vuole che accada, è vantaggio, perché:

  • il compilatore può ora Flag più errori in fase di compilazione - hey, modificati che l'argomento che hai detto era intento 'in', o hai modificato la variabile del modulo in una subroutine pura
  • il tuo codice è c chi impara alla prossima persona a venire senza sapere cosa dovrebbe fare (e quella persona potrebbe benissimo essere tre mesi dopo)
  • il compilatore può essere più aggressivo con l'ottimizzazione (se il compilatore ha una garanzia da te che nulla sta per cambiare, può aumentare l'ottimizzazione).

Di questi tre vantaggi, l'ottimizzazione probabilmente non è la più importante; nel caso di subroutine pure, un compilatore intelligente può probabilmente vedere solo attraverso l'analisi statica che la subroutine non ha effetti collaterali. Tuttavia, maggiore è la garanzia che puoi dargli, migliore è il lavoro che può fare per ottimizzare il tuo codice pur mantenendo la correttezza.

+1

Vorrei solo aggiungere che l'uso di 'do concurrent' è ora raccomandato su' forall'. Si veda ad esempio [pagina 23 di questo documento Intel] (https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDIQFjAB&url=https%3A%2F%2Fsoftware.intel. com% 2Fsites% 2Fdefault% 2Ffiles% 2Fparallel_mag_issue11.pdf & ei = OIxIVYjaIcb0UufjgcAL & USG = AFQjCNFwOikfX3mcuuFfRSQIjIuNj_UZBA & SIG2 = 6d9TpqMl_8BCKU2ePIli5g & BVM = bv.92291466, d.d24). – max

+1

È possibile utilizzare la parola chiave 'pure' come rilevatore di effetti collaterali. Dichiara semplicemente tutte le funzioni che scrivi come 'pure'. Se la funzione ha effetti collaterali, il compilatore si lamenterà. Se ciò accade, pensa se puoi refactoring per essere privo di effetti collaterali, altrimenti drop 'pure'. In questo modo otterrai una migliore comprensione del tuo codice e scrivi automaticamente un codice più pulito. – user26756

4

Per quanto ne so, non ha importanza in una modalità sequenziale. Ma se attivate le opzioni di "auto parallelizzazione", un compilatore può talvolta trarre vantaggio dalla dichiarazione PURE per parallelizzare loop (multi-threading) contenenti chiamate a subroutine pure (non può correre il rischio se le subroutine non sono pure). Per la stessa ragione, la dichiarazione PURE è utile anche per il programmatore che vuole impostare manualmente // direttive (OpenMP per esempio) perché il rischio di problemi con tali procedure è piuttosto limitato. Spesso è possibile parallelizzare loop con chiamate a subroutine non pure, ma questo richiede una profonda verifica ...

+2

Ma d'altra parte il compilatore probabilmente non parallelizzerà nulla all'interno di subroutine pure, quindi fai attenzione. –

Problemi correlati