On ne fait pas de la magie

«Toute technologie suffisamment avancée est indiscernable de la magie.» Arthur C. Clarke

Modernisation des codes de calcul Fortran

L’emploi des fonctionnalités du Fortran moderne permet d’obtenir un code plus simple à maintenir et à faire évoluer.

Lors des formations Fortran que j’anime, les questions d’évolution des anciens codes sont toujours évoquées et j’ai établi une liste des principaux points d’amélioration disponibles en utilisant Fortran 90/95.

Modules

Les modules permettent d’encapsuler :

– des définitions de constantes

– des données partagées entre plusieurs procédures

– des définitions de fonctions ou de sous-programmes

– des définitions d’interface

– des définitions de types personnalisés

Ces définitions peuvent être privées ou publiques et sont utilisables là où elles sont nécessaires avec l’instruction USE. Si nécessaire, il est possible de n’utiliser qu’une partie de ces définitions.
Les modules permettent notamment de remplacer les instructions INCLUDE et COMMON en proposant plus de flexibilité.

Passage de paramètres

La sécurité d’utilisation des fonctions et des procédures est grandement améliorée grâce aux déclarations INTENT qui évitent des effets de bord comme la modification involontaire d’un paramètre d’appel. L’utilisation des INTERFACE permet d’éviter les erreurs de type lors du passage de paramètres.

Tableaux

Les opérations sur les tableaux sont plus performantes avec les opérations directes sur les tableaux, l’utilisation des sections et des filtres (WHERE) et l’emploi des fonctions intrinsèques (ANY, ALL, SUM, PRODUCT, …).
Certaines parallélisations sont disponibles avec FORALL.. Le développeur a moins de préoccupations vis-à-vis de l’ordre de parcours d’une matrice pour optimiser les accès mémoire et donc le temps de calcul.

Précision paramétrable

La précision des calculs est facilement gérée grâce au paramétrage des types de données avec l’attribut KIND et les fonctions SELECT_INT_KIND ou SELECT_REAL_KIND

Gestion de mémoire

L’utilisation de la mémoire est beaucoup plus fine avec les tableaux dynamiques et les pointeurs, permettant d’allouer et de désallouer de la mémoire en fonction des besoins lors de l’exécution.

Fortran 2003/2008

Ces versions permettent d’aller encore plus loin avec les DO CONCURRENT et les coarrays, tout en proposant de la programmation orientée objet ou les fonctionnalités d’interface avec le C. J’en parlerai dans un prochain article.

Pourquoi moderniser un code ancien ?

Il existe de nombreux codes de calculs, écrits au fil du temps, qui fonctionnent très bien en fournissant dans un délai raisonnable les résultats souhaités. A quoi bon les modifier ? Je peux indiquer plusieurs raisons :

  • les tailles des modèles doivent être augmentées et les temps de calcul ou les besoins en mémoire explosent : l’optimisation peut permettre d’éviter ces difficultés
  • le code est complexe et ajouter de nouvelles fonctionnalités ou modifier des formules de calcul peut se révéler compliqué à réaliser : apparition de bugs, temps de calcul beaucoup plus longs, modification d’un très grand nombre d’instructions, etc. La restructuration du code permet d’intervenir ensuite beaucoup plus efficacement.
  • les nouvelles personnes intervenant sur le code ne connaissent pas ou peu Fortran et sont plus familières de Python ou C/C++. Intervenir dans une application ancienne peut être très rébarbatif et inefficace. Par exemple, un code écrit sans utiliser la notion de structure (si on vient du C) ou de classe (si on vient du Python) est difficile à appréhender et à maintenir.
  • le code n’est pas portable sur de nouvelles architectures ou ne permet pas au compilateur de les utiliser efficacement, par exemple en bloquant la vectorisation. Et le portage avec un nouveau compilateur, en utilisant IMPLICIT NONE, INTENT et INTERFACE permet de détecter des bugs cachés.
  • la structure du code ne permet pas d’utiliser efficacement des outils de tests automatisés ou des outils de gestion de version, car les fichiers source sont trop gros. Par exemple les fichiers de quelques milliers de lignes sont difficiles à suivre avec git.
  • la modernisation d’un code âgé de 20 ou 30 ans permet de prolonger sa durée de vie pour des durées équivalentes.

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *