2012-03-21 19 views
13

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

19

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.

+1

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

+1

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

4

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 ...

+2

Pero, por otro lado, el compilador probablemente no paralelizará nada dentro de subrutinas puras, así que ten cuidado. –

Cuestiones relacionadas