Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 26/10/2011, 12:58]
hector [Environnement de Développement Intégré]
fortran [Le 09/06/2021, 12:05]
vmagnin [Compilateurs] typo
Ligne 1: Ligne 1:
-{{tag>​programmation compilation IDE}}+{{tag>​programmation ​calcul_numérique ​compilation IDE}}
  
 ====== Fortran ====== ====== Fortran ======
  
-Fortran est un langage de programmation ​encore largement répandu pour réaliser des calculs scientifiquesLes versions les plus usitées sont le Fortran 77 et le Fortran 90, à noter qu'il supporte ​la programmation orientée objet depuis 2003.+Fortran est un langage de programmation ​normalisé destiné au calcul scientifiqueIl 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).
  
 ===== Compilateurs ===== ===== Compilateurs =====
  
-Parmi les compilateurs ​existants figurent +Le langage Fortran dispose de [[https://​fortran-lang.org/​compilers/​|nombreux ​compilateurs]], en particulier : 
-  * les compilateurs ​libres ​[[apt://g77|g77]] (obsolètenon supporté ​depuis ​Karmic) ,  ​GNU-[[apt://​gfortran|gfortran]] et [[http://​www.g95.org/|g95]] +  * Le compilateur libre GNU Fortran (GFortran). Le compilateur [[http://​www.g95.org/​|g95]] n'est plus développé depuis 2013. 
-  * le propriétaire Intel Fortran Compiler ​(disponible sous Linux en version non-commerciale).+  * 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. 
 + 
 +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. 
 + 
 +==== GFortran ==== 
 + 
 +[[https://​gcc.gnu.org/​wiki/​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é : [[:​tutoriel:​comment_installer_un_paquet|installez le paquet]] **[[apt>​gfortran|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 === 
 + 
 +  * ''​-std''​ permet de spécifier la norme à respecter, par exemple ''​-std=f2008''​ pour Fortran 2008. On peut lui associer l'​option ''​-pedantic''​ pour être encore plus strict. 
 +  * ''​-Wall -Wextra''​ permettront d'​obtenir un maximum d'​avertissements lors de la compilation. 
 + 
 +=== Options d'​optimisation === 
 + 
 +Exemple de commande avec optimisation poussée ''​-O3''​ (l'​exécutable est nommé par défaut ''​a.out''​
 + 
 +<​code>​ 
 +gfortran -O3 test.f90 
 +./a.out 
 +</​code>​ 
 + 
 +Parmi les [[https://​gcc.gnu.org/​onlinedocs/​gcc/​Optimize-Options.html|options d'​optimisation]] de gfortrancitons : 
 + 
 +  * ''​-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. 
 + 
 +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 === 
 + 
 +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>​ 
 +cd Logiciels 
 +git clone https://​github.com/​sourceryinstitute/​OpenCoarrays.git 
 +cd OpenCoarrays 
 +./​install.sh 
 +</​code>​ 
 +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 : 
 +<​code>​ 
 +source /​home/​mon_login/​Logiciels/​OpenCoarrays/​prerequisites/​installations//​opencoarrays/​2.9.2/​setup.sh 
 +</​code>​ 
 + 
 +[[:​tutoriel:​comment_modifier_un_fichier|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 : 
 +<​code>​ 
 +caf test.f90 
 +cafrun -n 4 ./a.out  
 +</​code>​  
 +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). 
  
-Pour des programmes simples, gfortran est largement suffisant mais pour des projets nécessitant un temps de calcul conséquent,​ on peut lui préférer la version d'​Intel ([[http://​www.polyhedron.com/​compare.html|voir une comparaison des différents compilateurs ici)]] 
  
  
 ==== Intel Fortran Compiler ==== ==== Intel Fortran Compiler ====
 +
 +Intel® oneAPI Toolkits est désormais disponible gratuitement pour tous les développeurs.
  
 === Installation === === Installation ===
  
-//Basé sur [[http://ubuntuforums.org/showthread.php?t=89571]].//+//Basé sur [[https://software.intel.com/​content/​www/​us/​en/​develop/​articles/installing-intel-oneapi-toolkits-via-apt.html|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) :
 +<​code>​
 +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
 +</​code>​
  
-  - Installer ​les packages pré-requis : <​code>​sudo apt-get install rpm build-essential</​code>​ +La dernière commande sert à définir ​les variables ​d'environnement. [[:tutoriel:​comment_modifier_un_fichier|Ajoutez-là à votre fichier]] **~/.bash_profile**, sinon vous devrez la taper à chaque ouverture ​d'un terminal. 
-  - S'​enregistrer sur le site d'Intel pour obtenir la version non-commerciale du compilateurAller sur [[http://​software.intel.com/​en-us/​articles/​non-commercial-software-download/​]] et cliquer sur //Intel® Fortran Composer XE for Linux//. Vous recevrez un email avec votre numéro de série + 
-  - Extraire l'​archive <​code>​tar xvzf l_fcompxe_*.tgz</​code>​ +Vérifiez que les deux compilateurs Intel sont bien accessibles : 
-  - Lancer le script ​d'installation<​code>​cd l_fcompxe_* +<​code>​ 
-sudo ./​install.sh</code> +ifort --version 
-  Choisir l'​option 1 pour installer puis de nouveau l'​option 1 pour rentrer le numéro de série donné dans l'​email,​ choisir encore l'​option 1 pour une installation par défaut. +ifort (IFORT2021.2.0 20210228 
-  ​Presser Entrer pour lire la licence et taper '​accept'​ pour l'​accepter. ​ +Copyright (C) 1985-2021 Intel Corporation.  ​All rights reserved
-  - Presser Entrer pour garder le répertoire par défaut puis Entrée pour démarrer l'​installation ​(prendre un café en attendant). +  
-  Faire de même pour installer le débogueur puis presser Entrée pour continuer +ifx --version 
-  - Si l'​installation semble s'​être arrêtée depuis un certain temps, faire Ctrl+C pour fermer. +ifx (IFORT) 2021.2.0 Beta 20210317 
-  - Il reste maintenant à modifier votre fichier ​.bashrc dans le dossier personnel en rajoutant à la fin les lignes suivantes : <​code>​ +Copyright ​(C1985-2021 Intel CorporationAll rights reserved.
-PATH="/​opt/​intel/​fc/​9.0/​bin:​$PATH"​ +
-export PATH +
-LD_LIBRARY_PATH="/​opt/​intel/​fc/​9.0/​lib:​$LD_LIBRARY_PATH"​ +
-export LD_LIBRARY_PATH +
-</​code>​Ces lignes sont à adapter en fonction de votre version et architecture ; pour une version 64bits, il fallait rajouter ​([[http://​ubuntuforums.org/​showthread.php?​t=1384001|voir ici]]: <​code>​ +
-source /​opt/​intel/​Compiler/​11.1/​072/​bin/​ifortvars.sh ia64 +
-LD_LIBRARY_PATH="/​opt/​intel/​Compiler/​11.1/​072/​lib/​intel64:​$LD_LIBRARY_PATH"​ +
-export LD_LIBRARY_PATH+
 </​code>​ </​code>​
-  - Enfin, faire un lien symbolique :<​code>​ + 
-sudo ln -s /​opt/​intel/​Compiler/​11.1/​072/​lib/​intel64/​ifort /​bin</​code>​+Le nouveau compilateur ifx, encore en version Beta, est basé sur LLVM mais ne permet pas encore d'​utiliser les cotableaux (coarrays) pour le calcul parallèle, même si l'​option apparaît dans son aide
  
 === Utilisation === === Utilisation ===
Ligne 50: Ligne 120:
 <​code>​man ifort</​code>​ <​code>​man ifort</​code>​
  
-Exemple ​de commande :+L'​ajout d'​informations ​de débogage se fait avec l'​option ''​-g''​.
  
-<​code>​ifort ​-O -c test.f90</​code>​+Exemple de commande avec optimisation poussée ''​-O3''​ (l'​exécutable est nommé par défaut ''​a.out''​) :
  
 +<​code>​
 +ifort -O3 test.f90
 +./a.out
 +</​code>​
  
-===== Environnement de Développement Intégré =====+<​code>​ 
 +ifx -O3 test.f90 
 +./a.out 
 +</​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=
 +export FOR_COARRAY_NUM_IMAGES=
 +</​code>​ 
 +===== Editeurs et Environnement de Développement Intégré ===== 
 + 
 +La plupart des éditeurs de texte disposent d'une coloration syntaxique pour le Fortran : [[:Kate]], [[apt>​gedit|gedit]],​ [[:Geany]], [[:vim]], [[:emacs]], etc.
  
-Plusieurs ​IDE sont disponibles avec une configuration plus ou moins aisée en fonction du logiciel. Citons ​:+Les grands ​IDE gèrent également le Fortran ​:
  
-  * [[:Geany]] +  * [[:code_blocks|Code::​Blocks]] : il en existe une version [[https://​cbfortran.sourceforge.io/​|CBFortran]] dédiée au Fortran. ​
   * [[:​Eclipse]] avec le [[http://​www.eclipse.org/​photran/​|plugin Photran]] ​   * [[:​Eclipse]] avec le [[http://​www.eclipse.org/​photran/​|plugin Photran]] ​
   * [[:​KDevelop]] ​   * [[:​KDevelop]] ​
   * [[:​Anjuta]] ​   * [[:​Anjuta]] ​
-  * [[code_blocks|Code::Blocks]] : voir [[http://darmar.vgtu.lt/]]  +  * [[:netbeans]] (cf [[http://​netbeans.org/​community/​releases/​67/​cpp-setup-instructions.html]]
-  * [[netbeans]]+ 
 + 
 +===== Débogueurs et outils d'​analyse ===== 
 + 
 +On peut utiliser [[:gdb]], le débogueur GNU ou [[http://en.wikipedia.org/wiki/​Intel_Debugger|idb]] //(Intel Debugger).//​ 
 + 
 +Avec gfortran, lors de la compilation on utilisera l'​option ''​-g''​ (mode debug) : 
 +<​code>​ 
 +gfortran -g test.f90 
 +gdb ./a.out 
 +</​code>​ 
 +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 [[apt>​strace]] :  
 +<​code>​ 
 +strace ./a.out 
 +</​code>​ 
 + 
 +Pour repérer les portions de code consommant le plus de temps processeur, on peut utiliser le profileur gprof du paquet [[apt>​binutils]]. Il faut compiler le programme avec l'​option ''​-pg''​ et ne pas activer d'​optimisation : 
 +<​code>​ 
 +gfortran -pg test.f90 
 +gprof ./a.out 
 +</​code>​ 
 + 
 +===== 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 : 
 +<​code>​ 
 +git clone https://​github.com/​fortran-lang/​fpm.git 
 +cd fpm 
 +./​install.sh 
 +export PATH=/​home/​mon_login/​.local/​bin/:​$PATH 
 +</​code>​ 
 +en remplaçant ''​mon_login''​ par votre identifiant de session. 
 + 
 +[[:​tutoriel:​comment_modifier_un_fichier|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 : 
 +<​code>​ 
 +fpm new mon_projet 
 +cd mon_projet 
 +fpm run 
 +</​code>​ 
 + 
 +fpm gère les dépendances,​ qu'il peut télécharger automatiquement depuis GitHub. 
 + 
 +===== 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 : 
 +  * [[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/​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. 
 + 
 + 
 +===== Liens ===== 
 +  * La page française [[wpfr>​Fortran|Fortran]] fournit de nombreuses informations,​ liens et références bibliographiques concernant le Fortran. 
 +  * [[https://​fortran-lang.org/​|Fortran-lang.org]] se veut depuis 2020 la page d'​accueil du langage Fortran. La communauté développe en particulier le gestionnaire de paquets Fortran fpm, une bibliothèque standard stdlib et le compilateur interactif LFortran. Les utilisateurs de Fortran se retrouve dans le [[https://​fortran-lang.discourse.group/​|Discourse Fortran]]. 
 +  * [[https://​groups.google.com/​g/​comp.lang.fortran|comp.lang.fortran]] est un groupe de discussion Usenet actif depuis 1983.  
 +  * [[http://​fortranwiki.org/​fortran/​show/​HomePage|Fortran Wiki]] offre en anglais de nombreuses ressources proposées par les développeurs Fortran.
  
  
-===== Débogueurs ===== 
  
-  * [[gdb]], le débogueur GNU, débogue le fortran, mais de façon incomplète dans sa version actuelle (n'​affiche pas les tableaux). ​ 
-  * [[idb]] pallie ce problème. 
  • fortran.txt
  • Dernière modification: Le 09/09/2021, 15:31
  • par 86.67.213.205