loops - sintaxis - if fortran
Fortran todas las restricciones (2)
Forall
construcción de Forall
demostró ser realmente demasiado restrictiva y es principalmente útil solo para operaciones de matriz. Para conocer las limitaciones exactas, consulte IBM Fortran - FORALL . Menos restrictivo es una construcción do concurrent
de Fortran 2008. Incluso las declaraciones de read
y write
están permitidas allí. Vea Intel Fortran - DO CONCURRENT y Nuevas características de Fortran 2008 .
Intenté utilizar forall
para asignar matrices dinámicas, pero a Gfortran no le gustó eso. También descubrí que las declaraciones de write
están prohibidas en un bloque forall
, y sospecho que las declaraciones read
también.
¿Qué otras funciones / operaciones no están permitidas en un bloque general?
¿Para qué sirve esta construcción, además de reemplazar algunas veces los bucles 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 realizar dentro de un campo.
¿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 en el que estoy trabajando, solo hay un bloque forall
, y si lo tradujera todo en los bucles do
, daría cuatro bucles anidados. ¿Qué camino es mejor?
No hay mucha necesidad de construcciones FORALL
y WHERE
hoy en día. 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, sino una 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 en función de 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
.
Vea una agradable discusión en FORALL
y WHERE
aquí
Si le preocupa el rendimiento del código, puede preferir 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.