Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
fortran [Le 01/05/2021, 14:47] vmagnin [GFortran] Autres options |
fortran [Le 03/09/2021, 15:09] vmagnin [Fortran] Ajouts de Fortran 2018 |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
====== Fortran ====== | ====== 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 dernière norme est Fortran 2018 et la suivante est en préparation (nommée 202X pour l'instant). | + | 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 actuelle est Fortran 2018 : elle 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 prochaine norme est prévue pour 2023 (nommée Fortran 202X pour l'instant). |
===== Compilateurs ===== | ===== Compilateurs ===== | ||
Le langage Fortran dispose de [[https://fortran-lang.org/compilers/|nombreux compilateurs]], en particulier : | Le langage Fortran dispose de [[https://fortran-lang.org/compilers/|nombreux compilateurs]], en particulier : | ||
- | * Le compilateur libre GNU Fortran (GFortran). Le compilateur [[http://www.g95.org/|g95]] n'est plus développé depuis 2013. | + | * Le compilateur libre GNU Fortran (GFortran). |
* Le propriétaire Intel Fortran Compiler (ifort), et son successeur ifx basé sur LLVM (actuellement en version beta), téléchargeables gratuitement pour tous les développeurs depuis début 2021. | * Le propriétaire Intel Fortran Compiler (ifort), et son successeur ifx basé sur LLVM (actuellement en version beta), téléchargeables gratuitement pour tous les développeurs depuis début 2021. | ||
* Le compilateur commercial [[http://www.pgroup.com/resources/docs.htm| PGI]] édité par [[wp>The_Portland_Group]], qui devrait être remplacé prochainement par le compilateur [[https://github.com/flang-compiler/flang|Flang]] intégré à LLVM. | * Le compilateur commercial [[http://www.pgroup.com/resources/docs.htm| PGI]] édité par [[wp>The_Portland_Group]], qui devrait être remplacé prochainement par le compilateur [[https://github.com/flang-compiler/flang|Flang]] intégré à LLVM. | ||
- | gfortran est très utilisé par les scientifiques, bien que le compilateur Intel ifort puisse être plus performant sur certains problèmes ([[https://polyhedron.com/?page_id=175|voir une comparaison des différents compilateurs ici)]]. | + | gfortran est très utilisé par les scientifiques, bien que le compilateur Intel ifort puisse être plus performant sur certains problèmes ([[https://polyhedron.com/?page_id=175|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 : [[https://lfortran.org/|LFortran]], qui permettra de travailler en Fortran de façon interactive, à l'aide par exemple de Jupyter. | Un autre compilateur prometteur est actuellement en développement : [[https://lfortran.org/|LFortran]], qui permettra de travailler en Fortran de façon interactive, à l'aide par exemple de Jupyter. | ||
Ligne 40: | Ligne 40: | ||
* ''-Ofast'' : permet d'aller au-delà de ''-O3'', mais ne respecte pas la norme Fortran de façon stricte. | * ''-Ofast'' : permet d'aller au-delà de ''-O3'', mais ne respecte pas la norme Fortran de façon stricte. | ||
* ''-Os'' : permet de minimiser la taille de l'exécutable. Cela peut en particulier être intéressant si l'exécutable occupe en mémoire une place similaire à celle des caches du processeur, afin de réduire les allers-retours coûteux entre cache et mémoire vive. | * ''-Os'' : permet de minimiser la taille de l'exécutable. Cela peut en particulier être intéressant si l'exécutable occupe en mémoire une place similaire à celle des caches du processeur, afin de réduire les allers-retours coûteux entre cache et mémoire vive. | ||
+ | |||
+ | L'option ''-static-libgfortran'' permet d'utiliser [[https://gcc.gnu.org/onlinedocs/gfortran/Link-Options.html|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) : | ||
+ | <code> | ||
+ | export OMP_NUM_THREADS=4 | ||
+ | </code> | ||
=== OpenCoarrays === | === 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 [[http://www.opencoarrays.org/|OpenCoarrays]], par exemple si vous voulez l'installer dans un répertoire Logiciels de votre compte : | + | Contrairement à ifort, gfortran ne gère pas encore les cotableaux de façon native. Si vous voulez les utiliser vous aurez besoin d'installer [[http://www.opencoarrays.org/|OpenCoarrays]] : |
+ | <code> | ||
+ | sudo apt install libcoarrays-dev libcoarrays-mpich-dev | ||
+ | </code> | ||
+ | |||
+ | Vous pouvez également l'installer depuis les sources, par exemple dans un répertoire Logiciels de votre compte : | ||
<code> | <code> | ||
cd Logiciels | cd Logiciels | ||
Ligne 50: | Ligne 62: | ||
./install.sh | ./install.sh | ||
</code> | </code> | ||
- | S'il vous propose d'installer la librairie MPI [[https://www.mpich.org/|mpich]], acceptez. Sinon, OpenCoarrays peut également fonctionner avec [[https://www.open-mpi.org/|OpenMPI]]. | + | S'il vous propose d'installer la librairie [[https://www.mpich.org/|MPICH]], acceptez. Sinon, OpenCoarrays peut également fonctionner avec [[https://www.open-mpi.org/|OpenMPI]]. |
Définissez ensuite les variables d'environnement : | Définissez ensuite les variables d'environnement : | ||
Ligne 82: | Ligne 94: | ||
rm 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 add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" | ||
+ | sudo apt update | ||
sudo apt install intel-oneapi-compiler-fortran | sudo apt install intel-oneapi-compiler-fortran | ||
source /opt/intel/oneapi/setvars.sh | source /opt/intel/oneapi/setvars.sh | ||
Ligne 106: | Ligne 119: | ||
<code>man ifort</code> | <code>man ifort</code> | ||
+ | |||
+ | 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'') : | Exemple de commande avec optimisation poussée ''-O3'' (l'exécutable est nommé par défaut ''a.out'') : | ||
Ligne 118: | Ligne 133: | ||
./a.out | ./a.out | ||
</code> | </code> | ||
+ | |||
+ | 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 supporte 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//) : | ||
+ | <code> | ||
+ | export OMP_NUM_THREADS=4 | ||
+ | export FOR_COARRAY_NUM_IMAGES=4 | ||
+ | </code> | ||
+ | ou utiliser l'option de compilation ''-coarray-num-images=4'' pour les cotableaux. | ||
===== Editeurs et Environnement de Développement Intégré ===== | ===== Editeurs et Environnement de Développement Intégré ===== | ||
Ligne 157: | Ligne 185: | ||
===== Gestionnaire de paquets Fortran fpm ===== | ===== Gestionnaire de paquets Fortran fpm ===== | ||
- | Depuis 2020, [[https://github.com/fortran-lang/fpm|fpm (Fortran Package Manager)]] est en développement. Bien que disponible en version 0.2.0 alpha au 30 avril 2021, il est déjà pleinement utilisable pour des projets simples. Vous pouvez l'installer en ligne de commandes à l'aide de git : | + | Depuis 2020, [[https://github.com/fortran-lang/fpm|fpm (Fortran Package Manager)]] est en développement. Bien que disponible en version 0.4.0 alpha au 30 août 2021, il est déjà pleinement utilisable pour des projets simples. Vous pouvez l'installer en ligne de commandes à l'aide de git : |
<code> | <code> | ||
git clone https://github.com/fortran-lang/fpm.git | git clone https://github.com/fortran-lang/fpm.git | ||
Ligne 179: | Ligne 207: | ||
===== Bibliothèques graphiques ===== | ===== Bibliothèques graphiques ===== | ||
- | Fortran ne dispose pas d'instructions graphiques. La visualisation des résultats se fait soit avec des programmes externes comme [[gnuplot]] ou [[apt>paraview|ParaView]], soit avec des bibliothèques graphiques, comme par exemple : | + | Fortran ne dispose pas d'instructions graphiques. La visualisation des résultats peut se faire avec des programmes externes comme [[gnuplot]] ou [[apt>paraview|ParaView]], ou des bibliothèques graphiques, comme par exemple : |
* [[apt>libplot-dev libplplotfortran0|PLplot]], | * [[apt>libplot-dev libplplotfortran0|PLplot]], | ||
* [[https://github.com/vmagnin/gtk-fortran/wiki|gtk-fortran]] qui permet de créer des interfaces GTK en Fortran, | * [[https://github.com/vmagnin/gtk-fortran/wiki|gtk-fortran]] qui permet de créer des interfaces GTK en Fortran, | ||
* [[https://github.com/kookma/ogpf|ogpf]] qui permet d'appeler simplement gnuplot depuis un programme en Fortran, grâce à son interface orientée objet. Il peut être installé en tant que paquet fpm. | * [[https://github.com/kookma/ogpf|ogpf]] qui permet d'appeler simplement gnuplot depuis un programme en Fortran, grâce à son interface orientée objet. Il peut être installé en tant que paquet fpm. | ||
+ | Un programme Fortran peut également générer facilement des fichiers graphiques au format [[https://fr.wikipedia.org/wiki/Portable_pixmap|Portable pixmap (PPM)]] (voir cet [[https://github.com/certik/fortran-utils/blob/master/src/ppm.f90|exemple]]). | ||
===== Liens ===== | ===== Liens ===== | ||
* La page française [[wpfr>Fortran|Fortran]] fournit de nombreuses informations, liens et références bibliographiques concernant le Fortran. | * La page française [[wpfr>Fortran|Fortran]] fournit de nombreuses informations, liens et références bibliographiques concernant le Fortran. |