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
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.
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 ...
Ma d'altra parte il compilatore probabilmente non parallelizzerà nulla all'interno di subroutine pure, quindi fai attenzione. –
- 1. Uso corretto della parola chiave PURE Fortran
- 2. Ottimizzazione del compilatore: bytecode Java
- 3. Ottimizzazione del compilatore, thread sicuro?
- 4. Chiamare una subroutine Fortran da Java
- 5. ottimizzazione del compilatore per la stabilità numerica
- 6. ottimizzazione del compilatore quando si ritorna stringhe
- 7. a = -2147483648 - a; ottimizzazione del compilatore
- 8. libreria BLAS incompatibile con Fortran 77 impostazioni del compilatore
- 9. Can Vim do Fortran completamento degli argomenti di subroutine
- 10. R: Vantaggi dell'utilizzo di una subroutine Fortran con wrapper .Call e C/C++ anziché .Fortran?
- 11. f2py con il compilatore Intel Fortran
- 12. Ottimizzazione del compilatore Java per chiamate di metodo ripetute?
- 13. Bug di ottimizzazione del compilatore LLVM o cosa?
- 14. C/C++ di feedback del compilatore di ottimizzazione
- 15. Ottimizzazione del compilatore Java durante una build di Maven?
- 16. compilatore g ++: ottimizzazione bandiera aggiunge messaggio
- 17. Fortran DEALLOCATE
- 18. Fortran: passa lo stesso array di due argomenti fittizi alla subroutine
- 19. Differenza tra INCLUDE e moduli in Fortran
- 20. Alogena Pure Pure e websocket
- 21. conversione del codice MATLAB in Fortran
- 22. Fortran conserva il valore delle variabili interne tramite chiamate di funzioni e subroutine?
- 23. Fortran - interfaccia esplicita
- 24. installazione del compilatore gfortran in centos 6
- 25. Funzioni di sovraccarico con Fortran
- 26. array di oggetti estesi in Fortran
- 27. Passando funzioni in R come argomenti .Fortran
- 28. Arresta il codice Python nell'errore del modulo (Fortran) usando f2py?
- 29. Errore: dichiarazione inclassificabile in FORTRAN
- 30. Quali sono le differenze tra le funzioni e le subroutine in Fortran?
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
È 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