Recientemente descubrí el uso de funciones puras y subrutinas en Fortran. Según lo que indica el manual de Fortran, parece que la mayoría de mis subrutinas pueden definirse realmente como puras (ya que siempre especifico el propósito de todos los argumentos, y generalmente no tengo "guardar", "pausar", o E/S externa en la mayoría de mis subrutinas). Mi pregunta es: ¿Debería hacerlo? Me preguntaba si el compilador optimiza mejores subrutinas puras o si simplemente no importa, o si puede empeorar las cosas. Gracias!Subrutinas puras en Fortran - Optimización del compilador
Respuesta
Usted trabaja con el compilador para generar un buen código, y mientras más información proporcione el compilador, mejor será un trabajo ustedes dos pueden hacerlo juntos.
Ya sea etiquetado con intent(in)
argumentos ficticios no se cambia, o el uso de parameter
para las constantes, de manera explícita o hacer cualquier pure
subprograma que no tiene ningún efecto secundario, o el uso de forall
cuando no les importa el orden de un bucle se calcula, por ser más explícito acerca de lo que desea que suceda, usted se beneficia porque:
- el compilador ahora puede marcar más errores en tiempo de compilación - Hey, que modifican ese argumento que has dicho es la intención 'in', o ha modificado esa variable de módulo en una subrutina pura
- su código es c Leerse a la siguiente persona para llegar a ella sin saber lo que se supone que debe hacer (y esa persona bien podría ser usted tres meses después)
- el compilador puede ser más agresivo con la optimización (si el compilador tiene la garantía de que nada va a cambiar, puede aumentar la optimización).
De esos tres beneficios, la optimización probablemente no sea la más importante; en el caso de las subrutinas puras, un compilador inteligente probablemente vea solo a través del análisis estático que su subrutina no tiene efectos secundarios. Aún así, cuantas más garantías pueda otorgar, mejor será el trabajo que puede hacer para optimizar su código y mantener la corrección.
Por lo que sé, simplemente no importa en un modo secuencial. Pero si activa las opciones de "paralelización automática", un compilador a veces puede aprovechar la declaración PURE para paralelizar bucles (multi-threading) que contienen llamadas a subrutinas puras (no puede correr el riesgo si las subrutinas no son puras). Por la misma razón, la declaración PURE también es útil para el programador que quiere establecer manualmente // directivas (OpenMP por ejemplo) porque el riesgo de problemas con tales procedimientos es bastante limitado. A menudo es posible paralelizar bucles con llamadas a subrutinas no puras, pero esto necesita una verificación profunda ...
Pero, por otro lado, el compilador probablemente no paralelizará nada dentro de subrutinas puras, así que ten cuidado. –
- 1. Funciones elementales de Fortran vs subrutinas elementales
- 2. Optimización del compilador, ¿Thread Safe?
- 3. Constantes y optimización del compilador en C++
- 4. Optimización del compilador: bytecode de Java
- 5. optimización del compilador para la estabilidad numérica
- 6. biblioteca BLAS incompatible con Fortran 77 configuración del compilador
- 7. Terminología del compilador de Fortran: Variables ficticias y atributos
- 8. ¿Cómo puedo desactivar la optimización del compilador en C#?
- 9. Optimización del compilador de Java para llamadas a métodos repetidos?
- 10. Optimización del compilador de Java durante una compilación Maven?
- 11. La optimización del compilador rompe el código de subprocesos múltiples
- 12. Optimización del compilador que hace que el rendimiento se ralentice
- 13. c99 __restrict y compilador de optimización
- 14. C/C++ retroalimentación compilador de optimización
- 15. ¿Qué está haciendo mi compilador? (Memcpy optimización)
- 16. Optimización de estructura de compilador C
- 17. Excepciones puras en Haskell
- 18. Cómo desactivar la optimización del compilador gcc para habilitar el desbordamiento del búfer
- 19. optimización del bucle anidado del compilador para acceso a la memoria secuencial.
- 20. ¿Cómo se utilizan datos del módulo Fortran 90?
- 21. Java: optimización del tipo SAM
- 22. subrutinas en archivos por lotes
- 23. Ejemplo de 'volátil' que impide una optimización del compilador en C#?
- 24. Concepto de "eliminación de código muerto" en las opciones de optimización del compilador
- 25. ¿Cuáles son las técnicas de optimización del compilador de C++ en Visual Studio
- 26. Optimizaciones del compilador de Erlang
- 27. g ++ compilador: indicador de optimización añade un mensaje de advertencia
- 28. Error del compilador de C++ en netbeans
- 29. Optimización del juego AndEngine
- 30. ¿Cuándo ocurre la optimización del código?
Simplemente agregaría que usar 'do concurrent' ahora se recomienda sobre' forall'. Ver por ejemplo [página 23 de este documento de 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
Puede usar la palabra clave 'pure' como detector de efectos secundarios. Simplemente declare todas las funciones que escribe como 'puro'. Si la función tiene efectos secundarios, el compilador se quejará. Si eso sucede, piense si puede refactorizarlo para que sea libre de efectos secundarios; de lo contrario, suelte 'puro '. De esta forma comprenderá mejor su código y escribirá automáticamente un código más limpio. – user26756