Qu'est-ce qui fait que Fortran est rapide?

41

Fortran occupe une place particulière dans la programmation numérique. Vous pouvez certes créer de bons logiciels rapides dans d’autres langues, mais Fortran continue de très bien fonctionner malgré son âge. De plus, il est plus facile de créer des programmes rapides en Fortran. J'ai créé des programmes rapides en C ++, mais vous devez faire plus attention aux choses comme les alias de pointeur. Donc, il doit y avoir une raison à cela, et très technique. Est-ce parce que le compilateur peut optimiser davantage? J'aimerais vraiment connaître les détails techniques, donc si j'utilise un autre langage, je peux prendre ces choses en considération.

Par exemple, je sais, ou plutôt je pense, qu’une chose est que la norme spécifie que les pointeurs sont contigus en mémoire, ce qui signifie un accès plus rapide à la mémoire. Je pense que vous pouvez le faire en C ++ en donnant un drapeau au compilateur. De cette façon, il est utile de savoir ce que Fortran fait de bien, de sorte que si nous utilisons une autre langue, nous pouvons l'imiter.

jbcolmenares
la source
7
Je dirais que cela pourrait être une meilleure question pour stackoverflow, même si je pense que c'est une bonne question. Une recherche rapide ( stackoverflow.com/search?q=fortran+fast ) m'amène à cette question qui pourrait vous aider: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann
3
Vous devez spécifier le type de fortran que vous utilisez. Il existe une différence substantielle entre 77 et 90 ans et plus. Je suppose au moins 90 si nous parlons de pointeurs ...
qubyte
Je lis toujours que Fortran est plus rapide que C. Bien peut-être, mais est-ce plus rapide, 2% ou plutôt plus rapide, 50%?
Shuhalo
4
C'est un mythe urbain. À moins que le compilateur ne puisse utiliser des instructions spéciales, vous pouvez optimiser à la main presque tous les programmes, quel que soit le compilateur, pour générer à peu près le même langage machine.
Mike Dunlavey

Réponses:

50

Les concepteurs de langues sont confrontés à de nombreux choix. Ken Kennedy a insisté sur deux points: (1) de meilleures abstractions et (2) un code de niveau supérieur ou inférieur (plus ou moins similaire à une machine). Alors que les langages fonctionnels tels que Haskell et Scheme se concentrent sur le premier, les langages informatiques scientifiques traditionnels tels que Fortran et C / C ++ se concentrent sur le second. Dire qu'une langue est plus rapide qu'une autre est généralement trompeur: chaque langue a un domaine problématique pour lequel elle excelle. Fortran se débrouille mieux dans le domaine des codes numériques basés sur des tableaux que d’autres langages pour deux raisons fondamentales: son modèle de tableau et son caractère explicite.

Modèle de tableau

Les programmeurs Fortran font en grande partie des manipulations de tableaux. Pour cela, Fortran facilite plusieurs optimisations du compilateur qui ne sont pas disponibles dans d'autres langues. Le meilleur exemple est la vectorisation: connaître la structure des données permet au compilateur d'invoquer des éléments intrinsèques au niveau de l'assemblage sur le tableau.

Explicit du langage

Bien qu’il semble qu’un langage simple devrait compiler «mieux» qu’un langage plus complexe, ce n’est vraiment pas le cas. Quand on écrit en langage assembleur , un compilateur ne peut pas faire grand chose: il ne voit que des instructions très fines. Fortran exige explicitement (donc plus de travail de la part du programmeur) que dans les cas qui rapportent de réels avantages à l’informatique par tableaux. Fortran utilise des types de données simples, un flux de contrôle de base et des espaces de noms limités. en revanche, il n’indique pas à l’ordinateur comment charger des registres (ce qui peut être nécessaire pour le temps réel ). Là où Fortran est explicite, cela permet des choses comme l’inférence de type complète, qui aide les novices à se lancer. Cela évite aussi une chose qui ralentit souvent le C:pointeurs opaques .

Fortran peut être lent

Fortran n’est pas rapide pour toutes les tâches: c’est pourquoi peu de gens l’utilisent pour construire des interfaces utilisateur graphiques ou même pour un calcul scientifique hautement non structuré. Une fois que vous quittez le monde des tableaux pour les graphiques, les arbres de décision et autres domaines, cet avantage de vitesse disparaît rapidement. Voir les points de repère du langage informatique pour des exemples et des chiffres.

aterrel
la source
7
Les problèmes d'interface graphique / E / S peuvent être facilement résolus en encapsulant Fortran dans un langage "plus général". J'utilise fréquemment R à cette fin.
mbq
2
shootout.alioth.debian.org n'est plus disponible! Et la nouvelle version contient beaucoup moins d'informations :(
astrojuanlu
23

La conception de Fortran permet au compilateur d'effectuer des optimisations plus fortes dans certains cas, optimisations qui ne sont généralement pas disponibles pour C.

Un exemple célèbre est la gestion du crénelage . En Fortran, vous ne pouvez accéder à une zone de mémoire spécifique que par le symbole spécifique associé à cette zone de mémoire. Cette connaissance permet au compilateur d'utiliser des astuces intelligentes lorsqu'il est temps de mettre en cache: il sait si une valeur a potentiellement changé ou non. Jusqu'à F90, cela a été vérifié facilement. Lorsque Fortran 90 a été introduit pointers, l'hypothèse n'était plus vraie: vous pouviez accéder à la même zone mémoire via deux symboles (ou plus). C'est la raison pour laquelle vous devez spécifier targetles tableaux que vous souhaitez adresser via des pointeurs.

Un autre fait intéressant est que de nombreuses constructions permettent au compilateur d’effectuer une parallélisation sans intervention de l’utilisateur. Un tel luxe est possible grâce au "principe agnostique de plate-forme" de Fortran en tant que langue.

Il y a beaucoup d'autres astuces subtiles comme celle-ci. De plus, rappelez-vous que personne n'utilise Fortran aujourd'hui, à l'exception des calculs numériques, ce qui signifie que la caractéristique principale et le point de vente des compilateurs Fortran est la vitesse de code résultante. En conséquence, les fournisseurs se sont concentrés sur cela.

Néanmoins, vous pouvez produire du code performant également avec d'autres langues. Il peut toutefois nécessiter des soins spéciaux ou une intervention humaine. Le point général, cependant, est que les performances ne sont pas un problème tant qu’il n’y en a pas et que le temps de travail coûte beaucoup plus cher que le temps passé sur un ordinateur. Les pratiques de codage doivent donc mettre l’accent sur le gain de temps humain plutôt que sur le temps passé sur un ordinateur.

Stefano Borini
la source
2
Lorsque vos ordinateurs atteignent plus de 100 millions de dollars, le temps passé (étudiants diplômés) ne semble plus aussi cher en comparaison.
Phil Miller
6
@Novelocrat: La quantité de code qui fonctionne sur $ 100 millions ordinateur a été écrit par heures de travail qui vont bien indénombrables au - delà de la $ 100 millions, même au prix étudiant diplômé. Rappelez-vous que les coûts d'une personne sont deux fois son revenu. Le reste va dans les impôts et corrélé. En outre, un ordinateur ne subit pas de brûlure. Une personne fait et va changer de travail.
Stefano Borini
1
@StefanoBorini J'ai une longue histoire de PC qui ont expérimenté le burn
out
1
"De plus, rappelez-vous que personne n'utilise le Fortran aujourd'hui, à l'exception des calculs numériques", Fortran = "FORmula TRANslation". Fortran a toujours été principalement utilisé et conçu pour les calculs numériques. Fortran occupe une part importante du temps passé sur les ordinateurs hautes performances.
user21387
Aujourd'hui et toujours, Fortran est utilisé dans le même but: les calculs numériques.
séquence
12

Je ne pense pas que Fortran soit si proche du métal (voir autre réponse), mais il a tendance à s'optimiser très facilement. Les boucles sont simples et le langage supporte facilement les extensions de vectorisation (bien, quand je l’utilisais dans mon premier emploi, nous visions une large gamme de gros fer vectoriels).

Il y a aussi le grand facteur d'inertie. Fortran contient une grande partie du code numérique. Par conséquent, les constructeurs de serveurs et de superordinateurs haut de gamme veillent à ce qu'ils écrivent correctement en optimisant les compilateurs Fortran. Les compilateurs sont bons (même sur des machines avec un manque relatif de compilateurs de haute qualité), de sorte que les utilisateurs continuent à utiliser le Fortran et même à y écrire du nouveau code. Les constructeurs veillent donc à ce que leur prochaine génération dispose de bons compilateurs, etc.

Winwaed
la source
8

Attention aux mythes urbains ici. Si deux compilateurs génèrent le même code d'assembly, les programmes résultants auront les mêmes performances.

Pour toute logique, il existe un programme en langage assembleur qui minimise son temps d'exécution. Ce programme ne se soucie pas du compilateur qui l’a généré.

Cela dit, les langages compilés existent pour faciliter la vie du programmeur. Une partie du coût est qu’ils peuvent inciter l’utilisateur à utiliser des fonctionnalités qui ne nécessitent pas un temps d’exécution minimal. Le principal exemple de ceci est newen C ++. (Combien de temps cela pourrait-il être lent - il ne s'agit que de trois caractères?) Il vous prie pratiquement d'allouer de la mémoire de manière dynamique et de ne pas prêter attention aux coûts d'exécution. Si c'est ce que vous voulez faire, c'est génial, mais Fortran pourrait être plus rapide simplement parce que cela ne vous a pas incité à le faire.

Mais au - delà, je ne l' ai jamais vu un programme qui, comme le premier écrit, n'a pas eu grande place à l' amélioration de la performance du genre que le compilateur ne pourrait jamais nettoyer pour vous. Par exemple, passer une grande partie du temps à appeler expet / ou à logrépéter le même argument. Comme autre exemple, appeler DGEMM pour multiplier les matrices et découvrir qu'une fraction importante du temps est utilisé pour appeler LSAME simplement pour déchiffrer ses arguments de caractère en entrée.

C'est en même temps que les gens disent que Fortran est plus rapide en raison de l'aliasing du pointeur ou du déroulement de la boucle. C'est comme dire qu'un bus fabriqué par Porsche serait certainement plus rapide qu'un bus fabriqué par Chevrolet. Il faut un peu de bon sens.

Mike Dunlavey
la source
4
Je ne pense pas que ce soit juste un mythe urbain. La prise en charge par Fortran des opérations sur l'ensemble du réseau, des fonctions PURE / ELEMENTAL, etc. peut aider les compilateurs à optimiser / vectoriser ou même à paralléliser. Voir par exemple, thinkparallel.com/2007/08/14/… . Ce que les compilateurs font réellement est une histoire différente (dépend du fournisseur).
Stali
@stali: Cela dépend de plus que le vendeur. Cela dépend du programme en cours de compilation. J'ai vu des gens généraliser "il existe un programme que Fortran peut faire fonctionner rapidement" et "Fortran est plus rapide pour tous les programmes". Si vous le signalez, les gens peuvent commencer à casser et à couper les cheveux en quatre, et ce qui en découle finalement, n’est fondamentalement rien de plus que ce que les gens veulent penser.
Mike Dunlavey