Question

J'en suis récemment venu à maintenir une grande quantité de code FORTRAN à forte intensité de calcul scientifique.J'ai du mal à comprendre toutes les nuances, disons, d'une langue vieille de quarante ans, malgré Google et deux livres de niveau d'introduction.Le code regorge d'"améliorations améliorant les performances".Quelqu'un a-t-il des guides ou des conseils pratiques pour de-optimiser FORTRAN dans les niveaux CS 101 ?Quelqu'un sait-il comment fonctionne l'optimisation du code FORTRAN ?Existe-t-il des « pièges » FORTRAN typiques qui pourraient ne pas arriver à un développeur Java/C++/.NET reprenant une base de code FORTRAN 77/90 ?

Était-ce utile?

La solution

Vous devez en quelque sorte avoir une « idée » de ce que les programmeurs devaient faire à l’époque.La grande majorité du code avec lequel je travaille est plus ancien que moi et fonctionnait sur des machines qui étaient "nouvelles" lorsque mes parents étaient au lycée.

Les FORTRAN-ismes courants que je traite et qui nuisent à la lisibilité sont :

  • Blocs communs
  • Variables implicites
  • Deux ou trois boucles DO avec des instructions CONTINUE partagées
  • GOTO remplace les boucles DO
  • Instructions arithmétiques IF
  • GOTO calculés
  • Equivalence REAL/INTEGER/autre dans un bloc commun

Les stratégies pour résoudre ces problèmes impliquent :

  1. Obtenir Spag / plusFORT, ça vaut le coup, il résout beaucoup d'entre eux automatiquement et Bug Free(tm)
  2. Passez à Fortran 90 si possible, sinon passez à Fortran 77 au format libre
  3. Ajoutez IMPLICIT NONE à chaque sous-programme, puis corrigez chaque erreur de compilation, ce qui prend du temps mais est finalement nécessaire, certains programmes peuvent le faire automatiquement pour vous (ou vous pouvez le créer par script)
  4. Déplacer tous les blocs COMMUNS vers des MODULES, un fruit à portée de main, ça vaut le coup
  5. Convertir les instructions arithmétiques IF en blocs IF..ELSEIF..ELSE
  6. Convertir les GOTO calculés en blocs SELECT CASE
  7. Convertissez toutes les boucles DO vers la nouvelle syntaxe F90

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Convertissez les membres de bloc communs équivalents soit en mémoire ALLOCATABLE allouée dans un module, soit en leurs véritables routines de caractères si Hollerith est stocké dans un VRAI

Si vous avez des questions plus spécifiques sur la manière d'accomplir certaines tâches de lisibilité, je peux vous donner des conseils.J'ai une base de code de quelques centaines de milliers de lignes de Fortran qui a été écrite sur une période de 40 ans et dont je suis en quelque sorte responsable, j'ai donc probablement rencontré des "problèmes" que vous avez pu rencontrer.

Autres conseils

Boîte à savon Fortran héritée

J'ai aidé à maintenir/améliorer une base de code Fortran héritée pendant un certain temps et je pense pour la plupart variables à six lettres est sur l'argent.Ce conseil est cependant plutôt technique ;Un problème plus difficile à résoudre est celui de la mise en œuvre des « bonnes pratiques ».

  • Établissez un style de codage requis et des directives de codage.
  • Exigez une révision du code (de plus que le codeur !) pour tout ce qui est soumis à la base de code.(Le contrôle de version doit être lié à ce processus.)
  • Commencez à créer et à exécuter des tests unitaires ;idem tests de référence ou de régression.

Cela peut sembler évident de nos jours, mais au risque de généraliser à outrance, j'affirme que la plupart des magasins de code Fortran ont une culture bien ancrée, que certains ont commencé avant même que le terme « génie logiciel » n'existe, et qu'avec le temps, ce qui finit par dominer. est "Faites-le maintenant".(Ce n'est en aucun cas unique aux magasins Fortran.)

Embrasser les pièges

Mais que faire d’une vieille base de code existante et dégueulasse ?Je suis d'accord avec Joel Spolsky sur la réécriture, ne le faites pas.Cependant, à mon avis variables à six lettres pointe vers l'exception autorisée : Utilisez des outils logiciels pour passer à de meilleures constructions Fortran. Beaucoup de choses peuvent être détectées/corrigées par les analyseurs de code (POURCHECK) et les réécrivains de code (plusFORT).Si vous devez le faire à la main, assurez-vous d’avoir une raison impérieuse.(J'aurais aimé avoir sous la main une référence au nombre de bogues logiciels résultant de la correction de bogues logiciels, c'est une leçon d'humilité.Je pense qu'une telle statistique existe Programmation C experte.)

La meilleure attaque pour gagner le jeu des pièges de Fortran est probablement d'avoir la meilleure défense :Connaître assez bien la langue.Pour atteindre cet objectif, je recommande...livres!

Bibliothèque d'arbres morts Fortran

Je n'ai eu qu'un succès modeste en tant que « bourreau d'assurance qualité » au fil des ans, mais j'ai découvert que l'éducation fonctionne, parfois par inadvertance, et que l'une des choses les plus influentes est un ouvrage de référence que quelqu'un a sous la main.J'adore et je recommande vivement

Fortran 90/95 pour les scientifiques et les ingénieurs, par Stephen J.Chapman

Le livre est même bon avec Fortran 77 dans la mesure où il identifie spécifiquement les constructions qui ne devraient pas être utilisées et propose les meilleures alternatives.Cependant, il s'agit en fait d'un manuel et peut s'essouffler lorsque l'on veut vraiment connaître les détails du Fortran 95, c'est pourquoi je recommande

Fortran 90/95 expliqué, par Michael Metcalf et John K.Reid

comme référence incontournable (sic) pour Fortran 95.Attention, ce n'est pas l'écriture la plus lucide, mais le voile se lèvera lorsque l'on voudra vraiment tirer le meilleur parti d'une nouvelle fonctionnalité Fortran 95.

Pour m'être concentré sur les enjeux du passage de Fortran 77 à Fortran 90, j'ai apprécié

Migration vers Fortran 90, par Jim Kerrigan

mais le livre est désormais épuisé.(Je ne comprends tout simplement pas l'utilisation qu'O'Reilly fait de Safari, pourquoi tous leurs livres épuisés ne sont-ils pas disponibles ?)

Enfin, quant à l'héritier du merveilleux, merveilleux classique, Outils logiciels, je propose

Fortran classique, de Michael Kupferschmid

Ce livre montre non seulement ce que l'on peut faire avec "seulement" Fortran 77, mais il aborde également certains des problèmes les plus subtils qui se posent (par exemple, faut-il ou non utiliser la déclaration EXTERNE).Ce livre ne couvre pas exactement le même espace que "Outils logiciels", mais ce sont deux des trois livres de programmation Fortran que je qualifierais de "amusants"...(voici le troisième).

Conseils divers qui s'appliquent à presque chaque compilateur Fortran

  • Il existe une option du compilateur pour appliquer le comportement IMPLICIT NONE, que vous pouvez utiliser pour identifier les routines problématiques sans les modifier au préalable avec la déclaration IMPLICIT NONE.Ce conseil ne semblera significatif qu'après la première bombe de construction en raison d'une commande IMPLICIT NONE insérée dans une routine héritée.(Quoi?Votre révision de code n'a pas détecté cela ?;-)
  • Il existe une option du compilateur pour la vérification des limites du tableau, ce qui peut être utile lors du débogage du code Fortran 77.
  • Les compilateurs Fortran 90 devraient être capables de compiler presque tout le code Fortran 77 et même le code Fortran plus ancien.Activez les options de reporting sur votre compilateur Fortran 90, exécutez votre code existant via celui-ci et vous aurez un bon départ en matière de vérification de la syntaxe.Certains compilateurs Fortran 77 commerciaux sont en fait des compilateurs Fortran 90 qui s'exécutent en mode Fortran 77, cela peut donc être une option relativement triviale pour tous les scripts de construction dont vous disposez.

Il y a quelque chose dans la question initiale contre lequel je voudrais mettre en garde.Vous dites que le code regorge d'"améliorations améliorant les performances".Étant donné que les problèmes Fortran sont généralement de nature scientifique et mathématique, ne présumez pas que ces astuces de performances sont là pour améliorer la compilation.Ce n'est probablement pas une question de langue.En Fortran, la solution réside rarement dans l’efficacité du code lui-même mais plutôt dans les mathématiques sous-jacentes pour résoudre le problème final.Les astuces peuvent ralentir la compilation, voire même rendre la logique désordonnée, mais l'intention est de rendre la solution plus rapide.À moins que vous sachiez exactement ce qu’il fait et pourquoi, laissez-le tranquille.

Même une simple refactorisation, comme changer des noms de variables stupides, peut être un gros piège.Les équations mathématiques historiquement standard dans un domaine scientifique donné utilisent un raccourci particulier depuis l’époque de Maxwell.Ainsi, voir un tableau nommé B(:) en électromagnétisme indique à tous les ingénieurs d'Emag exactement ce qui est résolu.Changez cela à vos risques et périls.Morale, apprenez à connaître la nomenclature standard de la science avant de la renommer également.

En tant que personne ayant de l'expérience à la fois en FORTRAN (version 77, même si cela fait un moment que je ne l'ai pas utilisé sérieusement) et en C/C++, l'élément à surveiller qui me vient immédiatement à l'esprit sont les tableaux.Les tableaux FORTRAN commencent par un index de 1 au lieu de 0 comme c'est le cas en C/C++/Java.De plus, la disposition de la mémoire est inversée.Ainsi, l'incrémentation du premier index vous donne des emplacements de mémoire séquentiels.

Ma femme utilise toujours FORTRAN régulièrement et a du code C++ avec lequel elle doit travailler maintenant et je suis sur le point de commencer à l'aider.Au fur et à mesure que des problèmes surviendront lors de sa conversion, j'essaierai de les signaler.Peut-être qu'ils aideront.

Pourriez-vous expliquer ce que vous devez faire pour maintenir le code ?Faut-il vraiment modifier le code ?Si vous pouvez vous en sortir en modifiant uniquement l'interface de ce code au lieu du code lui-même, ce serait le mieux.

Le problème inhérent lorsqu’il s’agit d’un code scientifique volumineux (pas seulement FORTRAN) est que les mathématiques sous-jacentes et la mise en œuvre sont toutes deux complexes.Presque par défaut, l'implémentation doit inclure l'optimisation du code, afin de s'exécuter dans un délai raisonnable.Ceci est aggravé par le fait qu'une grande partie du code dans ce domaine est créé par des scientifiques/ingénieurs experts dans leur domaine, mais pas en développement de logiciels.Disons simplement que "facile à comprendre" n'est pas leur première priorité (j'étais l'un d'entre eux, encore en train d'apprendre à devenir un meilleur développeur de logiciels).

En raison de la nature du problème, je ne pense pas qu'une question et une réponse générales soient suffisantes pour être utiles.Je vous suggère de publier une série de questions spécifiques avec un extrait de code ci-joint.Peut-être en commençant par celui qui vous donne le plus mal à la tête ?

J'utilise Fortran à partir de la version 66 depuis 1967 (sur un IBM 7090 avec 32 000 mots de mémoire).J'ai ensuite utilisé PL/1 pendant un certain temps, mais je suis ensuite revenu au Fortran 95 car il est parfaitement adapté aux problèmes de matrice/nombre complexe que nous rencontrons.Je voudrais ajouter aux considérations qu'une grande partie de la structure alambiquée des anciens codes est simplement due à la petite quantité de mémoire disponible, ce qui oblige à réutiliser quelques lignes de code via des fichiers calculés ou attribués. GOTOs.Un autre problème est l'optimisation en définissant des variables auxiliaires pour chaque sous-expression répétée - les compilateurs n'ont tout simplement pas optimisé pour cela.De plus, il n'était pas permis d'écrire DO i=1,n+1;tu devais écrire n1=n+1; DO i=1,n1.En conséquence, les anciens codes sont submergés de variables superflues.Lorsque j'ai réécrit un code en Fortran 95, seulement 10 % des variables ont survécu.Si vous souhaitez rendre le code plus lisible, je vous recommande fortement de rechercher des variables faciles à éliminer.

Une autre chose que je pourrais mentionner est que pendant de nombreuses années, les tableaux arithmétiques et multidimensionnels complexes se sont révélés très inefficaces.C'est pourquoi vous trouvez souvent du code réécrit pour effectuer des calculs complexes en utilisant uniquement des variables réelles et des matrices adressées avec un seul index linéaire.

Eh bien, dans un sens, vous avez de la chance, car Fortran n'a pas beaucoup de constructions subtiles de flux de contrôle, d'héritage ou autres.D'un autre côté, il présente des pièges vraiment étonnants, comme le calcul arithmétique de la branche vers l'étiquette numérique, les variables implicitement typées qui ne nécessitent pas de déclaration, le manque de vrais mots-clés.

Je ne connais pas les "améliorations améliorant les performances".Je suppose que la plupart d'entre eux sont probablement inefficaces, car quelques décennies de technologie de compilateur ont rendu la plupart des allusions inutiles.Malheureusement, vous devrez probablement laisser les choses telles qu'elles sont, à moins que vous n'envisagiez de procéder à une réécriture massive.

Quoi qu’il en soit, le code de calcul scientifique de base devrait être assez lisible.Tout langage de programmation utilisant l'arithmétique infixe serait une bonne préparation à la lecture de l'arithmétique et du code d'affectation de Fortran.

J'adorais FORTRAN, j'y enseignais et codais.Je voulais juste ajouter ça.Je n'y ai pas touché depuis des années.
J'ai débuté en COBOL, lorsque je suis passé au FORTRAN, je me suis senti libéré.Tout est relatif, non ?J'appuie ce qui a été dit ci-dessus - reconnaissez qu'il s'agit d'un langage PROCÉDURAL - pas de subtilités - alors prenez-le tel que vous le voyez.
Cela vous frustrera probablement au début.

J'ai commencé sur Fortran IV (WATFIV) sur des cartes perforées, et mes premières années de travail étaient VS FORTRAN v1 (IBM, niveau Fortran 77).Beaucoup de bons conseils dans ce fil.

J'ajouterais qu'il faut faire la distinction entre les choses faites pour que la bête fonctionne, par rapport aux choses qui "optimisent" le code, et par rapport aux choses qui sont plus lisibles et maintenables.Je me souviens avoir eu affaire à des superpositions VAX en essayant de faire fonctionner le code de simulation DOE sur IBM avec de la mémoire virtuelle (elles ont dû être supprimées et le tout transformé en un seul espace d'adressage).

Je commencerais certainement par restructurer soigneusement les structures de contrôle FORTRAN IV au moins au niveau FORTRAN 77, avec une indentation et des commentaires appropriés.Essayez de vous débarrasser des structures de contrôle primitives comme ASSIGN et COMPUTED GOTO et arithmétique IF, et bien sûr, autant de GOTO que possible (en utilisant IF-THEN-ELSE-ENDIF).Utilisez certainement IMPLICIT NONE dans chaque routine, pour vous forcer à déclarer correctement toutes les variables (vous ne croiriez pas combien de bugs j'ai détectés dans le code d'autres personnes - fautes de frappe dans les noms de variables).Méfiez-vous des "optimisations prématurées" qu'il vaut mieux laisser le compilateur gérer lui-même.

Si ce code doit continuer à vivre et à être maintenable, vous avez le devoir envers vous-même et vos successeurs de le rendre lisible et compréhensible. Soyez simplement certain de ce que vous faites lorsque vous modifiez le code ! FORTRAN possède de nombreuses constructions particulières qui peuvent facilement faire trébucher quelqu'un venant du côté C du monde de la programmation.Rappelez-vous que FORTRAN remonte au milieu des années 50, quand il n'existait pas de science du langage et de conception de compilateurs, juste ad hoc hacker ensemble quelque chose (désolé, Dr.B!).

En voici un autre qui m'a mordu de temps en temps.Lorsque vous travaillez sur du code FORTRAN, assurez-vous de sauter les six colonnes initiales.De temps en temps, le code n'est mis en retrait que de cinq espaces et rien ne fonctionne.À première vue, tout semble bien et puis je réalise enfin que toutes les lignes commencent dans la colonne 6 au lieu de la colonne 7.

Pour tous ceux qui ne connaissent pas FORTRAN, les 5 premières colonnes sont destinées aux numéros de ligne (=étiquettes), la 6ème colonne est destinée à un caractère de continuation au cas où vous auriez une ligne de plus de 80 caractères (mettez simplement quelque chose ici et le compilateur saura que cette ligne fait en fait partie de celui qui le précède) et le code commence toujours dans la colonne 7.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top