2011-12-22 15 views
6

Intenté usar forall para asignar matrices dinámicas, pero a gfortran no le gustó eso. También descubrí que las declaraciones write están prohibidas en un bloque forall, y sospecho que las declaraciones read también lo están.Fortran forall restrictions

¿Qué otras funciones/operaciones no están permitidas en un bloque forall?

¿Para qué sirve esta construcción, además de reemplazar algunas veces los lazos do cuando el orden no importa? Pensé que haría la codificación más legible y elegante, especialmente cuando el orden de las operaciones no es importante, pero parece bastante restrictivo con las operaciones que se pueden hacer dentro de un forall.

¿Cuáles son los motivos de estas restricciones, es decir, qué protegen/evitan que el usuario se equivoque? ¿Es una buena idea usar forall? Si es así, ¿para qué?

En este momento en el código que estoy trabajando sólo hay un bloque de forall, y si lo traduje todo en do bucles que le daría cuatro bucles anidados. ¿Qué camino es mejor?

Respuesta

11

No hay mucha necesidad de construcciones FORALL y WHERE en la actualidad. Fueron introducidos como parte de Fortran 95 (extensión menor a Fortran 90), principalmente con el propósito de la optimización, cuando la vectorización del código era una cosa importante en HPC. La razón por la que FORALL tiene una aplicación tan limitada es exactamente porque fue diseñada para la optimización de bucles. También tenga en cuenta que, FORALL no es una construcción de bucle, pero la asignación. Por lo tanto, solo se permiten declaraciones de asignación dentro del bloque. En teoría, los bucles DO dan instrucciones explícitas sobre el orden de los índices sobre los que el procesador va a pasar. Una construcción FORALL permite al compilador elegir el orden más óptimo según cómo se almacena la matriz en la memoria. Sin embargo, esto ha perdido significado con el tiempo, ya que los compiladores modernos son muy buenos en las vectorizaciones de bucle DO y no es probable que note ninguna mejora al usar FORALL.

ver un bonito debate sobre FORALL y WHEREhere

Si usted está preocupado por el rendimiento del código, es posible que en vez desee considerar un compilador diferente - PGI o ifort. Desde mi propia experiencia, gfortran es adecuado para el desarrollo, pero no realmente para HPC. Notará una ejecución varias veces más rápida con código compilado con pgf90 o ifort.

+0

Gracias, lo has dejado bastante claro. –

6

Forall constructo demostró ser demasiado restrictivo y es principalmente útil solo para operaciones de matriz. Para conocer las limitaciones exactas, consulte IBM Fortran - FORALL. Menos restrictivo es un constructo do concurrent de Fortran 2008. Incluso las declaraciones read y write están permitidas allí. Ver Intel Fortran - DO CONCURRENT y New features of Fortran 2008.

+0

Sin embargo, no hay muchos compiladores que admitan Fortran 2008. Estoy usando gfortran, la última versión estable (¿4.6?) –

+1

Gfortran 4.6 tiene soporte parcial de él http://fortranwiki.org/fortran/show/Fortran+2008+status y http://gcc.gnu.org/ onlinedocs/gfortran/Fortran-2008-status.html, que reclama soporte para 'do concurrent' en el nuevo gfortran. –

+0

Debo aprender a hacer eso. –