Table des matières

, , ,

Fortran

Fortran est un langage de programmation normalisé destiné au calcul scientifique. Il intègre la programmation orientée objet et l'interfaçage avec le langage C depuis Fortran 2003 et la programmation parallèle (coarrays) depuis Fortran 2008. La norme Fortran 2018 améliore en particulier l'interfaçage entre C et Fortran et ajoute de nouveaux concepts pour la programmation parallèle (teams, events, collective subroutines). La norme Fortran 2023 (ISO/IEC 1539-1:2023) a été publiée le 17 novembre 2023.

Compilateurs

Le langage Fortran dispose de nombreux compilateurs, en particulier :

gfortran est très utilisé par les scientifiques, bien que le compilateur Intel ifort puisse être plus performant sur certains problèmes (voir une comparaison des différents compilateurs ici). Mais plutôt que de se fier aux benchmarks, qui se concentrent sur des problèmes spécifiques, il vaut mieux faire le test sur vos programmes. Il est de toute façon toujours conseillé de compiler ses programmes avec plusieurs compilateurs afin d'obtenir un code plus robuste : un compilateur peut afficher des messages de diagnostique différents, et à l'exécution certains bogues subtiles peuvent se révéler avec un compilateur mais pas un autre.

Un autre compilateur prometteur est actuellement en développement : LFortran, qui permettra de travailler en Fortran de façon interactive, à l'aide par exemple de Jupyter.

GFortran

GNU Fortran (GFortran), qui fait partie de la collection de compilateurs GCC, intègre à peu près intégralement la norme Fortran 2008 et commence à intégrer les nouveautés apportées par la norme Fortran 2018. L'installer dans Ubuntu ne présente pas de difficulté : installez le paquet gfortran de la dernière version majeure disponible dans le dépôt main.

Mais le dépôt universe propose plusieurs autres versions : par exemple, dans Ubuntu 20.10 le dépôt main propose gfortran 10.2 et le dépôt universe les versions 9.3, 8.4 et 7.5. Or les versions avec un numéro de version mineure plus élevé sont déboguées depuis plus longtemps. En particulier, pour des calculs très longs, la dernière version n'est pas toujours la plus rapide. Il est donc intéressant d'installer plusieurs versions et de les tester sur votre problème.

Options de diagnostic

Options d'optimisation

Exemple de commande avec optimisation poussée -O3 (l'exécutable est nommé par défaut a.out) :

gfortran -O3 test.f90
./a.out

Parmi les options d'optimisation de gfortran, citons :

L'option -static-libgfortran permet d'utiliser la version statique de la librairie gfortran, plutôt que la version partagée : cela peut permettre dans certains cas (à tester) de gagner un peu en vitesse (quelques pourcents) au détriment de la taille de l'exécutable, qui va embarquer les fonctions de la librairie que vous utilisez. Cette option est compatible avec OpenMP et les coarrays, contrairement à l'option -static.

Pour faire du calcul parallèle avec OpenMP, l'option de compilation est -fopenmp. Parmi les méthodes utilisables pour régler le nombre de threads, on peut alors utiliser la variable d'environnement (exemple avec ici 4 threads) :

export OMP_NUM_THREADS=4

OpenCoarrays

Contrairement à ifort, gfortran ne gère pas encore les cotableaux de façon native. Si vous voulez les utiliser vous aurez besoin d'installer OpenCoarrays :

sudo apt install libcoarrays-dev libcoarrays-mpich-dev

Vous pouvez également l'installer depuis les sources, par exemple dans un répertoire Logiciels de votre compte :

cd Logiciels
git clone https://github.com/sourceryinstitute/OpenCoarrays.git
cd OpenCoarrays
./install.sh

S'il vous propose d'installer la librairie MPICH, acceptez. Sinon, OpenCoarrays peut également fonctionner avec OpenMPI.

Définissez ensuite les variables d'environnement :

source /home/mon_login/Logiciels/OpenCoarrays/prerequisites/installations//opencoarrays/2.9.2/setup.sh

Ajoutez à la fin de votre fichier ~/.bash_profile la dernière commande afin de ne pas avoir à la taper à chaque fois que vous ouvrez votre terminal.

Au lieu d'utiliser directement gfortran, vous compilerez et exécuterez ainsi votre programme :

caf test.f90
cafrun -n 4 ./a.out 

où l'option -n permet de choisir le nombre d'images à exécuter en parallèle (ici 4 pour tourner sur un processeur à 2 coeurs / 4 threads).

Intel Fortran Compiler

Intel® oneAPI Toolkits est désormais disponible gratuitement pour tous les développeurs.

Installation

Basé sur Installing Intel® oneAPI Toolkits via APT.

Vous pouvez installer le paquet intel-basekit mais il utilise 16 Go sur votre disque dur ! Nous détaillons donc ci-dessous les instructions nécessaires pour installer juste les compilateurs Fortran (téléchargement : 560 Mo, sur disque : ~1.5 Go) :

wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main"
sudo apt update
sudo apt install intel-oneapi-compiler-fortran
source /opt/intel/oneapi/setvars.sh

La dernière commande sert à définir les variables d'environnement. Ajoutez-là à votre fichier ~/.bash_profile, sinon vous devrez la taper à chaque ouverture d'un terminal.

Vérifiez que les deux compilateurs Intel sont bien accessibles :

$ ifort --version
ifort (IFORT) 2021.8.0 20221119
Copyright (C) 1985-2022 Intel Corporation.  All rights reserved.
$ ifx --version
ifx (IFORT) 2023.0.0 20221201
Copyright (C) 1985-2022 Intel Corporation. All rights reserved.

Le compilateur ifx, basé sur LLVM, est depuis sa version 2023.0.0 conforme au standard Fortran 2018 et offre les mêmes fonctionnalités qu'ifort, qu'il va progressivement remplacer.

Utilisation

Voir le manuel pour plus d'informations :

man ifort

L'ajout d'informations de débogage se fait avec l'option -g.

Exemple de commande avec optimisation poussée -O3 (l'exécutable est nommé par défaut a.out) :

ifort -O3 test.f90
./a.out
ifx -O3 test.f90
./a.out

Parmi les options d'optimisation, on citera également -Ofast, ainsi que -xHost pour choisir le jeu d'instructions le plus élevé disponible sur le processeur de la machine.

Pour utiliser OpenMP, l'option de compilation est -qopenmp.

ifort et ifx supportent nativement la programmation parallèle à l'aide des cotableaux : il suffit d'utiliser l'option de compilation -coarray.

Parmi les méthodes utilisables pour régler le nombre de threads/images, on peut alors utiliser ces variables d'environnement (exemple avec ici 4 threads) :

export OMP_NUM_THREADS=4
export FOR_COARRAY_NUM_IMAGES=4

ou utiliser l'option de compilation -coarray-num-images=4 pour les cotableaux.

Editeurs et Environnement de Développement Intégré

La plupart des éditeurs de texte disposent d'une coloration syntaxique pour le Fortran : Kate, gedit, Geany, vim, emacs, etc.

Les grands IDE gèrent également le Fortran :

findent est un utilitaire en ligne de commandes permettant d'indenter automatiquement un code Fortran et de transformer un code du format fixe vers le format libre du Fortran moderne.

Débogueurs et outils d'analyse

On peut utiliser gdb, le débogueur GNU ou idb (Intel Debugger).

Avec gfortran, lors de la compilation on utilisera l'option -g (mode debug) :

gfortran -g test.f90
gdb ./a.out

Une fois dans gdb, on pourra exécuter le programme pas à pas avec les instructions suivantes : start, next (ne rentre pas dans les fonctions), step (rentre dans les fonctions), finish (pour continuer jusqu'à la fin d'une fonction), until n (continue jusqu'à la ligne n). Et afficher le contenu des variables avec : display i, watch i, print i. L'instruction help permettra d'afficher l'aide de ces instructions.

On peut activer toutes les vérifications (limites de tableau, dépassement de capacité…) pendant l'exécution avec l'option -fcheck=all de gfortran.

Pour visualiser les appels système lors de l'exécution, on peut utiliser strace :

strace ./a.out

Pour repérer les portions de code consommant le plus de temps processeur, on peut utiliser le profileur gprof du paquet binutils. Il faut compiler le programme avec l'option -pg et ne pas activer d'optimisation :

gfortran -pg test.f90
gprof ./a.out

Gestionnaire de paquets Fortran fpm

Depuis 2020, Fortran dispose du gestionnaire de paquets et système de construction fpm (Fortran Package Manager). Vous pouvez l'installer en ligne de commandes à l'aide de git :

git clone https://github.com/fortran-lang/fpm.git
cd fpm
./install.sh
export PATH=/home/mon_login/.local/bin/:$PATH

en remplaçant mon_login par votre identifiant de session.

Ajoutez à la fin de votre fichier ~/.bashrc la commande d'export afin de ne pas avoir à la taper à chaque fois que vous ouvrez votre terminal.

fpm est inspiré de Cargo, le couteau suisse du langage Rust. Créer, compiler et tester un nouveau projet de type Hello World devient aussi simple que de taper les commandes :

fpm new mon_projet
cd mon_projet
fpm run

fpm gère les dépendances, qu'il peut télécharger automatiquement depuis GitHub.

La documentation de fpm propose des tutoriels, des guides pratiques (how-to), des documents, un manuel de référence et des actualités. Cette documentation est disponible en français, ainsi que dans plusieurs autres langues (allemand, espagnol, néerlandais…)

Bibliothèques graphiques

Fortran ne dispose pas d'instructions graphiques. La visualisation des résultats peut se faire avec des programmes externes comme gnuplot ou ParaView, ou des bibliothèques graphiques, comme par exemple :

Un programme Fortran peut également générer facilement des fichiers graphiques au format Portable pixmap (PPM) (voir cet exemple).

Liens