2015-05-15 31 views
9

Attualmente sto scavando in Fortran e ho trovato la parola chiave pure che specifica funzioni/subroutine che non hanno effetti collaterali.Uso corretto della parola chiave PURE Fortran

ho un libro, Fortran 90/95 da S Chapman che introduce la parola pure ma stranamente non fornisce alcuna "buona pratica di codifica" usa.

Mi chiedo quanto si possa usare liberamente questa parola chiave nelle proprie procedure. Guardandomi intorno è ovvio che la maggior parte delle procedure senza effetti collaterali non ritiene necessario includere la parola chiave pure.

Quindi dove è meglio utilizzato? Solo nelle procedure che si desidera completamente la garanzia non ha effetti collaterali? O forse nelle procedure che si prevede di convertire in procedure elemental in seguito? (Come le procedure elemental devono prima essere pure.)

+1

Bene, provo ad usare le routine 'pure' tutte le volte che posso. Mi costringe a scrivere codice pulito. Tuttavia, solo una piccola percentuale di routine può essere pura ... Ma non ho mai visto alcuna differenza in termini di velocità o simili. –

+2

Non è Fortran 90/95 ma si noti che le procedure 'elemental' possono essere' impure'. – francescalus

+0

@AlexanderVogt "Solo una piccola percentuale"? Mi sembra che la maggior parte delle funzioni/subroutine siano 'pure' se codificate correttamente. Come ho capito dal mio libro, solo le procedure che modificano le variabili specificate con 'intent (in)' o hanno componenti I/O non sarebbero 'pure'. Sembra la minoranza, non la maggioranza, per me. – River

risposta

7

PURE è richiesto in alcuni casi, ad esempio, procedure chiamate all'interno di specifiche di specifica o da FORALL o DO CONCURRENT costrutti. PURE è richiesto in questi casi per dare la flessibilità del processore Fortran nell'ordinare le chiamate di procedure pur avendo un risultato ragionevolmente deterministico da un particolare tratto di codice.

Oltre a questi casi necessari, se utilizzare PURE o meno è fondamentalmente una questione di stile, che è piuttosto soggettiva.

ci sono i costi di utilizzo di PURE (incapacità di fare IO nell'ambito della procedura, l'impossibilità di chiamare le procedure che non PURE sono) e benefici (una procedura pura scritta oggi può essere chiamato da un contesto scritta domani che richiede una procedura pura , poiché le procedure PURE non hanno effetti collaterali le implicazioni di una chiamata di tale procedura possono essere più chiare per un lettore del codice), il compromesso tra i due dipende dalle specifiche.

Lo standard può conferire ai processori Fortran un notevole vantaggio nel modo in cui valutano espressioni e riferimenti di funzione all'interno di espressioni. Sostiene definitivamente i programmi in qualche modo attorno agli effetti collaterali dell'esecuzione della funzione e alla modifica degli argomenti delle funzioni. I requisiti per una funzione pura sono coerenti con quella via di fuga e quei vincoli, di conseguenza alcune persone usano uno stile in cui la maggior parte delle funzioni sono pure. Anche in questo caso, può ancora dipendere da specifiche e potrebbero esserci delle eccezioni per cose come l'interoperabilità C o l'interazione con API esterne.

+0

Altre risposte portano altre informazioni utili sull'uso di 'pure' e dovrebbero essere esaminate per ulteriori informazioni su come' pure' consente al compilatore di ottimizzare con la parallelizzazione fuori ordine. – River

+0

@IanH Se definisco una funzione pura 'f' e la uso in un'espressione' x = f (a * b) + f (a * b) ', allora è il caso che' f' viene sempre chiamato una volta? Sembra che test per vedere se ciò è vero non è possibile, dal momento che richiederebbe una sorta di effetto collaterale nella funzione. –

+1

@RaulLaasner No. 'f' potrebbe essere chiamato zero, una o due volte, e questo è indipendente dal fatto che' f' sia puro. – IanH

0

Se si tenta di modificare una variabile che ha INTENT(IN), non verrà compilata.

Le funzioni pure possono avere solo argomenti INTENT(IN) e restituiscono un valore che dipende solo dagli argomenti. Una subroutine pura può modificare gli argomenti INTENT(OUT) e INTENT(INOUT), ma di nuovo, solo in base al valore degli argomenti.

In entrambi i casi: stessi argomenti -> stesso risultato.

Il vantaggio è che garantisce al compilatore di poter scambiare l'ordine di esecuzione (per ottimizzare il codice) senza modificare il comportamento del programma.

+1

" Le funzioni pure possono avere solo 'INTENT (IN)' argomenti ": non vero: argomenti fittizi che sono puntatori o procedure non hanno bisogno di averlo specificato – francescalus

+0

Ho appena provato e hai ragione: una funzione pura può avere un argomento fittizio non-'INTENT (IN) 'E il compilatore intel fortran ti permette perfino di cambiarne il valore!' gfortran' dà un errore di compilazione. – chw21

+0

Se "cambia il suo valore" intendi la valore della destinazione del puntatore, quindi gfortran ha un bug. L'INTENZIONE per gli argomenti fittizi del puntatore è per lo stato di associazione del puntatore, non per quello a cui punta. Vedi F2008, sezione 5.3.10, paragrafo 2. –

5

Come suggerito da Chw21, la motivazione principale di PURE è consentire al compilatore di ottimizzare meglio. In particolare, la mancanza di PURE per una funzione impedirà la parallelizzazione a causa di effetti collaterali sconosciuti. Si noti che PURE subroutine, a differenza di funzioni, può avere INTENT(INOUT) argomenti, ma c'è ancora la restrizione sugli effetti collaterali (e che una procedura di PURE può chiamare soltanto altri PURE procedure.)

Up attraverso Fortran 2003 ELEMENTAL procedure sono implicitamente PURE . Fortran 2008 aggiunge un prefisso IMPURE che può essere utilizzato con le procedure ELEMENTAL per disabilitare quell'aspetto.

+0

Hai qualche benchmark disponibile che l'istruzione 'pure' porti effettivamente ad una migliore ottimizzazione da parte del compilatore? Sono solo curioso, l'ho provato in passato e non ho visto alcun beneficio con 'gfortran' o' ifort'. –

+0

Se inserisco la parola chiave 'PURE' in una routine non pura, il compilatore genera un errore. Ovviamente il compilatore può fare la determinazione da solo, quindi ci si potrebbe aspettare che lo faccia e quindi ottimizzare il codice allo stesso modo. – agentp

+0

Queste risposte mi aiutano a capire meglio i vantaggi della parola chiave 'pure', ma mi piacerebbe ancora di più su come è comunemente usato. Dovrebbe essere usato ogni qualvolta possibile o è più simile a un po 'di manipolazione, multi-threading e altre cose simili che sono comuni solo dove la velocità è di grande importanza? – River