Fortran est-il plus facile à optimiser que C pour les calculs lourds?

de temps en temps J'ai lu que Fortran est ou peut être plus rapide que C pour les calculs lourds. Est-ce vraiment vrai? Je dois avouer que je connais à peine Fortran, mais le code Fortran j'ai vu jusqu'à présent n'a pas montré que le langage a des caractéristiques que C n'ont pas.

si c'est vrai, dites-moi pourquoi. S'il vous plaît ne me dites pas quelles langues ou libs sont bons pour le nombre crunching, Je n'ai pas l'intention d'écrire une application ou lib pour le faire, je suis juste curieux.

363
demandé sur Martin Broadhurst 2008-09-28 20:02:52

23 réponses

les langues ont des ensembles de caractéristiques similaires. La différence de performance vient du fait que Fortran dit que l'aliasing n'est pas autorisé, à moins qu'une déclaration D'équivalence ne soit utilisée. Tout code qui a de l'aliasing n'est pas valide Fortran, mais c'est au programmeur et pas au compilateur de détecter ces erreurs. Ainsi, les compilateurs Fortran ignorent l'alias possible des pointeurs de mémoire et leur permettent de générer du code plus efficace. Regardez ce petit exemple en C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

cette fonction fonctionnerait plus lentement que la contrepartie Fortran après optimisation. Pourquoi donc? Si vous écrivez des valeurs dans le tableau de sortie, vous pouvez changer les valeurs de matrice. Après tout, les pointeurs peuvent se chevaucher et pointer vers le même morceau de mémoire (y compris le pointeur int !). Le compilateur C est forcé de recharger les quatre valeurs matricielles de la mémoire pour tous les calculs.

dans Fortran le compilateur peut charger les valeurs de matrice une fois et les stocker dans inscrire. Il peut le faire parce que le compilateur Fortran suppose que les pointeurs/tableaux ne se chevauchent pas en mémoire.

heureusement, le mot-clé restrict et l'alias strict ont été introduits dans la norme C99 pour résoudre ce problème. Il est bien supporté par la plupart des compilateurs C++ de nos jours. Le mot-clé vous permet de donner au compilateur un indice que le programmeur promet qu'un pointeur ne s'appelle pas avec un autre pointeur. Le strict-aliasing signifie que le programmeur promet que les pointeurs de type différent ne se chevaucheront jamais, par exemple un double* ne se chevauchera pas avec un int* (avec l'exception spécifique que char* et void* peuvent se chevaucher avec n'importe quoi).

si vous les utilisez vous obtiendrez la même vitesse de C et Fortran. Cependant, la possibilité d'utiliser le mot-clé restrict uniquement avec des fonctions critiques de performance signifie que les programmes C (et C++) sont beaucoup plus sûrs et plus faciles à écrire. Par exemple, considérons le code Fortran invalide: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30) , que la plupart des compilateurs Fortran compileront avec plaisir sans avertissement, mais introduit un bug qui ne s'affiche que sur certains compilateurs, sur certains matériels et avec quelques options d'optimisation.

405
répondu Nils Pipenbrinck 2018-02-22 20:31:39

Oui, en 1980; en 2008? dépend

quand j'ai commencé à programmer professionnellement la dominance de la vitesse de Fortran était juste contestée. Je me souviens que a lu à ce sujet dans Dr.Dobbs et a dit aux programmeurs plus âgés à propos de l'article--ils ont ri.

donc j'ai deux points de vue à ce sujet, théorique et pratique. en théorie Fortran aujourd'hui n'a aucun avantage intrinsèque à C/C++ ou même n'importe quel langage cela permet le code d'assemblage. dans la pratique Fortran jouit encore aujourd'hui des avantages d'héritage d'une histoire et d'une culture construite autour de l'optimisation du code numérique.

Jusqu'à et y compris Fortran 77, les considérations de conception de langage ont eu l'optimisation comme un objectif principal. En raison de l'état de la théorie et de la technologie du compilateur, cela signifiait souvent limitant caractéristiques et la capacité afin de donner au compilateur la meilleure chance de l'optimisation du code. Une bonne analogie est de penser Fortran 77 comme une voiture de course professionnelle qui sacrifie des caractéristiques pour la vitesse. De nos jours, les compilateurs se sont améliorés dans toutes les langues et les fonctionnalités pour la productivité des programmeurs sont plus valorisées. Cependant, il existe encore des endroits où les gens se préoccupent principalement de la vitesse dans l'informatique scientifique; ces gens ont très probablement hérité du code, de la formation et de la culture de gens qui étaient eux-mêmes programmeurs Fortran.

Quand on commence à parler de l'optimisation du code il y a beaucoup de problèmes et la meilleure façon d'obtenir une sensation pour cela est à rôder où les gens sont dont le travail est d'avoir le code numérique rapide . Mais gardez à l'esprit que ce code critique sensible est généralement une petite fraction de l'ensemble des lignes de code et très spécialisée: beaucoup de code Fortran est tout aussi "inefficace" que beaucoup d'Autres code dans d'autres langues et l'optimisation ne devrait même pas être un primaire préoccupation de ce code .

un endroit merveilleux pour commencer à apprendre sur L'histoire et la culture de Fortran est wikipedia. l'entrée de Wikipedia Fortran est superbe et j'apprécie beaucoup ceux qui ont pris le temps et l'effort de le faire de valeur pour la communauté Fortran.

(une version abrégée de cette réponse aurait été un commentaire dans l'excellent thread commencé par Nils mais je Je n'ai pas le karma pour faire ça. En fait, je n'aurais probablement rien écrit du tout, sauf que ce fil a un contenu d'information réel et le partage par opposition à flame wars et bigotry de langue, qui est ma principale expérience avec ce sujet. J'étais bouleversée et j'ai dû partager l'amour.)

149
répondu jaredor 2012-10-17 20:46:39

dans une certaine mesure Fortran a été conçu en gardant l'optimisation du compilateur à l'esprit. Le langage prend en charge les opérations de tableaux entiers où les compilateurs peuvent exploiter le parallélisme (spécialement sur les processeurs multicorps). Par exemple,

Dense multiplication de matrice est simplement:

matmul(a,b)

norme L2 d'un vecteur x est:

sqrt(sum(x**2))

en outre des déclarations telles que FORALL , PURE & ELEMENTAL procédures, etc. une aide supplémentaire pour optimiser le code. Même les pointeurs dans Fortran ne sont pas aussi flexibles que C à cause de cette raison simple.

la prochaine norme Fortran (2008) a des co-tableaux qui vous permettent d'écrire facilement du code parallèle. G95 (open source) et les compilateurs de CRAY le supportent déjà.

donc oui Fortran peut être rapide simplement parce que les compilateurs peuvent l'optimiser/le paralléliser mieux que C/C++. Mais encore une fois comme tout le reste dans la vie Il ya de bons Compilateurs et mauvais compilateur.

57
répondu user49734 2016-02-10 20:20:00

C'est drôle, que beaucoup de réponses ici de ne pas connaître les langues. Cela est particulièrement vrai pour les programmeurs C / C++ qui ont ouvert et ancien FORTRAN 77 code et discuter des faiblesses.

je suppose que la question de la vitesse est principalement une question entre C/C++ et Fortran. Dans un énorme code, cela dépend toujours du programmeur. Il y a certaines caractéristiques du langage que Fortran surpasse et certaines caractéristiques que C fait. Donc, en 2011, personne ne peut vraiment dire l'un est plus rapide.

en ce qui concerne la langue elle-même, Fortran prend aujourd'hui en charge toutes les fonctionnalités de OOP et est entièrement compatible avec le passé. J'ai utilisé le Fortran 2003 à fond et je dirais qu'il était tout simplement délicieux de l'utiliser. À certains égards, Fortran 2003 est toujours en retard sur C++ , mais examinons l'usage. Fortran est principalement utilisé pour le calcul numérique, et personne n'utilise de fonctionnalités fancy C++ OOP pour des raisons de vitesse. Dans le calcul haute performance, C++ n'a presque pas de place pour allez (jetez un oeil à la norme MPI et vous verrez que C++ a été déprécié!).

de nos jours, vous pouvez simplement faire de la programmation en langage mixte avec Fortran et C/C++. Il existe même des interfaces pour GTK+ dans Fortran. Il y a des compilateurs gratuits (gfortran, g95) et beaucoup d'excellents commerciaux.

35
répondu Hossein Talebi 2017-09-07 07:18:41

il y a plusieurs raisons pour lesquelles Fortran pourrait être plus rapide. Cependant, la quantité qu'ils importent est si insignifiante ou peut être travaillée de toute façon, que cela ne devrait pas avoir d'importance. La principale raison d'utiliser Fortran aujourd'hui est de maintenir ou d'étendre les applications existantes.

  • mots clés purs et élémentaires sur les fonctions. Ce sont des fonctions qui n'ont pas d'effets secondaires. Cela permet des optimisations dans certains cas où le compilateur connaît le même fonction sera appelée avec les mêmes valeurs. Note: GCC implémente" pur " comme extension du langage. D'autres compilateurs peuvent ainsi. L'analyse inter-modules peut également effectuer cette optimisation, mais elle est difficile.

  • ensemble standard de fonctions qui traitent des tableaux, et non des éléments individuels. Des choses comme sin(), log(), sqrt() prennent des tableaux au lieu de scalaires. Cela facilite l'optimisation de la routine. auto-vectorisation donne les mêmes avantages dans la plupart des cas si ces fonctions sont inline ou builtins

  • Builtin de type complexe. En théorie, cela pourrait permettre au compilateur de réordonner ou d'éliminer certaines instructions dans certains cas, mais il est probable que vous verriez le même avantage avec la structure { double re, im; }; idiom utilisée dans C. Cela permet un développement plus rapide bien que les opérateurs travaillent sur des types complexes dans fortran.

27
répondu Greg Rogers 2010-03-06 10:58:49

je pense que le point clé en faveur de Fortran est qu'il s'agit d'un langage légèrement plus adapté à l'expression de vecteurs et de tableaux de mathématiques. La question de l'analyse du pointeur mentionnée ci-dessus est réelle dans la pratique, puisque le code portable ne peut pas vraiment supposer que vous pouvez dire quelque chose à un compilateur. Il y a toujours un avantage à exprimer des calculs d'une manière plus proche de l'apparence du domaine. C n'a pas vraiment de tableaux du tout, si vous regardez attentivement, juste quelque chose qui se comporte comme il. Fortran a de vrais tableaux. Ce qui rend la compilation plus facile pour certains types d'algorithmes, en particulier pour les machines parallèles.

au fond de choses comme le système d'exécution et les conventions d'appel, C et Fortran moderne sont suffisamment similaires qu'il est difficile de voir ce qui ferait une différence. C++ est un problème totalement différent avec des caractéristiques de performance très différentes.

26
répondu jakobengblom2 2010-03-06 10:58:19

il n'y a pas de telle chose qu'une langue soit plus rapide qu'une autre, donc la bonne réponse est Non .

Ce que vous avez vraiment à se poser est "est un code compilé avec le compilateur Fortran X plus rapide que l'équivalent du code compilé avec le compilateur C Y?"La réponse à cette question dépend bien sûr des deux compilateurs que vous choisissez.

une autre question que l'on pourrait se poser serait celle de "Étant donné le même niveau d'effort optimiser dans leurs compilateurs, quel compilateur produirait plus rapidement du code?" La réponse à cette question serait en fait Fortran . Les compilateurs Fortran ont certains avantages:

  • Fortran a dû rivaliser avec L'assemblage à l'époque où certains ont juré de ne jamais utiliser de compilateurs, il a donc été conçu pour la vitesse. C a été conçu pour être flexible.
  • la niche de Fortran a été nombre crunching. Dans ce code de domaine est jamais assez vite. Donc il y a toujours eu beaucoup de pression pour garder le langage efficace.
  • la plupart des recherches sur l'optimisation des compilateurs sont effectuées par des personnes intéressées à accélérer le code Fortran de calcul automatique des nombres, de sorte que l'optimisation du code Fortran est un problème bien mieux connu que l'optimisation de tout autre langage compilé, et de nouvelles innovations apparaissent d'abord dans les compilateurs Fortran.
  • Biggie : c encourage beaucoup plus utilisation de pointeur que Fortran. Cela augmente drastiquement la portée potentielle de n'importe quel élément de données dans un programme C, ce qui les rend beaucoup plus difficiles à optimiser. Notez que L'Ada est aussi bien meilleur que le C dans ce domaine, et est un langage OO beaucoup plus moderne que le Fortran77. Si vous voulez un oo langauge qui peut générer du code plus rapide que C, c'est une option pour vous.
  • grâce à sa niche de numéro-croquant, les clients de compilateurs Fortran ont tendance à se soucier plus de optimisation que les clients des compilateurs C.

cependant, il n'y a rien qui empêche quelqu'un de mettre une tonne d'effort dans l'optimisation de leur compilateur C, et de le faire générer un meilleur code que le compilateur Fortran de leur plate-forme. En fait, les ventes plus importantes générées par les compilateurs C rendent ce scénario tout à fait réalisable

20
répondu T.E.D. 2011-05-12 13:33:15

il y a un autre article où Fortran est différent de C - et potentiellement plus rapide. Fortran a de meilleures règles d'optimisation que C. Dans Fortran, l'ordre d'évaluation d'une expression n'est pas défini, ce qui permet au compilateur de l'optimiser - si on veut forcer un certain ordre, on doit utiliser des parenthèses. En C, l'ordre est beaucoup plus strict, mais avec les options "- fast", ils sont plus détendus et "(...)" sont également ignorés. Je pense que Fortran a une voie qui se situe bien au milieu. (Bien, L'IEEE rend la vie plus difficile car certains changements d'ordre d'évaluation exigent qu'aucun débordement ne se produise, ce qui doit être ignoré ou entrave l'évaluation).

un autre domaine de règles plus intelligentes sont des nombres complexes. Non seulement Qu'il a fallu jusqu'à C 99 que C les avait, aussi les règles les régissent est mieux dans Fortran; depuis la bibliothèque Fortran de gfortran est partiellement écrit en C mais met en œuvre la sémantique Fortran, GCC a gagné l'option (qui peut également être utilisé avec programmes" normaux "C):

-fcx-fortran-règles La multiplication complexe et la division suivent les règles Fortran. La réduction de la portée se fait dans le cadre d'une division complexe, mais il n'y a pas de vérification si le résultat d'une multiplication ou d'une division complexe est "NaN + i*NaN", avec une tentative de sauvetage de la situation dans ce cas.

les règles d'alias mentionnées ci - dessus sont un autre bonus et aussi - au moins en principe- l'ensemble du tableau les opérations, qui si elles sont prises en compte correctement par l'optimiseur du compilateur, peuvent conduire au code plus rapide. Du côté opposé, est-ce que certaines opérations prennent plus de temps, par exemple si l'on fait une affectation à un tableau allocable, il y a beaucoup de vérifications nécessaires (réattribuer? [Fortran 2003], a la matrice de progrès, etc.), ce qui rend la simple opération plus complexe en coulisse - et donc plus lente, mais rend le langage plus puissant. D'autre part, les opérations de réseau avec flexible bounds and streps rend plus facile d'écrire du code - et le compilateur est généralement mieux optimiser le code qu'un utilisateur.

au total, je pense que C et Fortran sont à peu près aussi rapides l'un que l'autre; le choix devrait être plus quelle langue fait-on comme plus ou si l'utilisation de L'ensemble des opérations de Fortran et sa meilleure portabilité sont plus utiles -- ou la meilleure interface avec le système et les bibliothèques d'interface utilisateur graphique en C.

18
répondu 2008-10-30 13:04:47

il n'y a rien dans les langues Fortran et C qui rend l'un plus rapide que l'autre à des fins spécifiques. Il y a des choses spécifiques compilateurs pour chacune de ces langues qui rendent certaines favorables pour certaines tâches plus que d'autres.

pendant de nombreuses années, des compilateurs Fortran ont existé qui pouvaient faire de la magie noire à vos routines numériques, rendant de nombreux calculs importants incroyablement rapides. Le les compilateurs C contemporains ne pourraient pas le faire aussi bien. En conséquence, un certain nombre de grandes bibliothèques de code a grandi à Fortran. Si vous voulez utiliser ces bibliothèques éprouvées, mûres, merveilleuses, vous lancez le compilateur Fortran.

mes observations informelles montrent que de nos jours, les gens codent leurs calculs lourds dans n'importe quelle langue ancienne, et si cela prend un certain temps, ils trouvent du temps sur un cluster de calcul bon marché. La Loi de Moore nous ridiculise tous.

12
répondu jfm3 2008-09-28 16:35:02

je compare la vitesse de Fortran, C, et C++ avec le benchmark Levine-Callahan-Dongarra classique de netlib. La version en plusieurs langues, avec OpenMP, est http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors Le C est plus laid, car il a commencé par la traduction automatique, plus l'insertion de restrict et de pragmas pour certains compilateurs. C++ est simplement C avec les modèles STL le cas échéant. À mon avis, le LST est un sac mélangé quant à savoir s'il améliore maintenabilité.

il n'y a qu'un minimum d'exercice de la fonction automatique d'in-lining pour voir dans quelle mesure elle améliore l'optimisation, puisque les exemples sont basés sur la pratique Fortran traditionnelle où peu de confiance est placée sur l'in-lining.

le compilateur C / C++ qui a de loin l'usage le plus répandu manque d'auto-vectorisation, sur laquelle ces benchmarks s'appuient fortement.

Re le poteau qui est venu juste avant ceci: il y a un quelques exemples où les parenthèses sont utilisées dans Fortran pour dicter l'ordre d'évaluation plus rapide ou plus précis. Les compilateurs C connus n'ont pas d'options pour observer les parenthèses sans désactiver les optimisations plus importantes.

12
répondu 2008-10-30 13:18:12

j'ai fait quelques mathématiques avec FORTRAN et C pendant quelques années. De ma propre expérience je peux dire que FORTRAN est parfois vraiment mieux que C mais pas pour sa vitesse (on peut faire c effectuer aussi vite que FORTRAN en utilisant le style de codage approprié) mais plutôt en raison de bibliothèques très bien optimisées comme LAPACK, et en raison de la grande parallélisation. À mon avis, FORTRAN est vraiment maladroit à travailler avec, et ses avantages ne sont pas assez bons pour annuler cet inconvénient, donc maintenant j'utilise C+GSL pour faire des calculs.

10
répondu grzkv 2010-07-29 20:01:46

je suis programmeur hobbyiste et je suis" moyen " dans les deux langues. Je trouve plus facile d'écrire du code Fortran rapide que du code C (ou C++). Fortran et C sont des langages "historiques" (aujourd'hui standard), sont très utilisés, et ont un compilateur libre et commercial bien supporté.

Je ne sais pas si c'est un fait historique, mais Fortran se sent comme si C'était construit pour être mis en parallèle/distribué/vectorisé/quoi que ce soit-plusieurs-cœurs-isé. Et aujourd'hui c'est à peu près la "métrique standard" quand nous parlons de vitesse : "est-ce que ça se balance ?"

Par pure cpu croquer j'adore Fortran. Pour tout ce qui concerne IO je trouve plus facile de travailler avec C. (c'est difficile dans les deux cas de toute façon).

maintenant, bien sûr, pour le code intensif de mathématiques en parallèle, vous voulez probablement utiliser votre GPU. C et Fortran ont tous deux beaucoup d'interface plus ou moins bien intégrée CUDA/OpenCL (et maintenant OpenACC).

ma réponse modérément objective est : si vous savez les deux langues également bien / mal alors je pense que Fortran est plus rapide parce que je trouve qu'il est plus facile d'écrire du code parallèle/distribué dans Fortran que C. (Une fois que vous avez compris que vous pouvez écrire "freeform" fortran et pas seulement strict code F77)

Voici une deuxième réponse pour ceux qui sont prêts à me rétrograder parce qu'ils n'aiment pas la première réponse : les deux langues ont les fonctionnalités requises pour écrire du code de haute performance. Donc, il est dépendant de l'algorithme que vous mettez en œuvre (CPU intensive ? io intensive ? de mémoire intensive?), le matériel (cpu simple ? multi-core ? distribuer supercalculateur ? GPGPU ? FPGA ?), votre compétence et finalement le compilateur lui-même. C et Fortran ont un super compilateur. (je suis sérieusement étonné de voir à quel point les compilateurs Fortran sont avancés, tout comme les compilateurs C).

PS: je suis content que vous avez spécifiquement exclu libs parce que j'ai beaucoup de mauvaises choses à dire sur Fortran GUI libs. :)

9
répondu ker2x 2015-11-06 11:17:46

Je n'ai pas entendu dire que Fortan est beaucoup plus rapide que C, mais il pourrait être concevable que dans certains cas, il serait plus rapide. Et la clé n'est pas dans les caractéristiques linguistiques présentes, mais dans celles qui (habituellement) sont absentes.

un exemple sont des pointeurs C. Les pointeurs C sont utilisés à peu près partout, mais le problème avec les pointeurs est que le compilateur ne peut généralement pas dire s'ils pointent vers les différentes parties du même tableau.

Par exemple, si vous avez écrit une routine strcpy qui ressemblait à ceci:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

le compilateur doit fonctionner en partant de l'hypothèse que les D et s peuvent se chevaucher. Donc il ne peut pas effectuer une optimisation qui produirait des résultats différents quand les tableaux se chevauchent. Comme vous l'imaginez, cela réduit considérablement le genre d'optimisations qui peuvent être effectuées.

[il est à noter que le C99 a un "restreindre" mot clé explicitement dit le compilateurs que les pointeurs ne se chevauchent pas. Notez aussi que le Fortran a aussi des pointeurs, avec une sémantique différente de celle de C, mais les pointeurs ne sont pas omniprésents comme en C.]

mais pour en revenir à la question c vs. Fortran, il est concevable qu'un compilateur Fortran soit capable d'effectuer certaines optimisations qui pourraient ne pas être possibles pour un programme C (directement écrit). Donc je ne serais pas trop surpris par la demande. Cependant, je dois attendre que la différence de performances ne serait pas tout ce que beaucoup. [~5-10%]

8
répondu Pramod 2008-09-28 16:25:57

toute différence de vitesse entre Fortran et C sera davantage fonction des optimisations des compilateurs et de la bibliothèque mathématique sous-jacente utilisée par le compilateur particulier. Il n'y a rien d'intrinsèque à Fortran qui le rendrait plus rapide que C.

de toute façon, un bon programmeur peut écrire Fortran dans n'importe quelle langue.

8
répondu Kluge 2008-09-28 23:23:58

rapide et simple: les deux sont également rapides, mais Fortran est plus simple. Ce qui est vraiment plus rapide à la fin dépend de l'algorithme, mais il n'y a pas de différence de vitesse considérable de toute façon. C'est ce que j'ai appris lors d'un atelier Fortran au high performance computing center de Stuttgart, en Allemagne, en 2015. Je travaille à la fois avec Fortran et C et partage cette opinion.

explication:

C a été conçu pour écrire les systèmes d'exploitation. Il a donc plus de liberté que nécessaire pour écrire du code de haute performance. En général, ce n'est pas un problème, mais si on ne Programme pas soigneusement, on peut facilement ralentir le code.

Fortran a été conçu pour la programmation scientifique. Pour cette raison, il prend en charge l'écriture rapide de syntaxe de code, car c'est le but principal de Fortran. Contrairement à l'opinion publique, Fortran n'est pas obsolète langage de programmation. Sa dernière norme est 2010 et nouvelle les compilateurs sont publiés régulièrement, car la plupart des codes haute performance sont écrits dans Fortran. Fortran supporte en outre des fonctionnalités modernes comme les directives de compilateur (dans C pragmas).

exemple: Nous voulons donner une grande structure comme argument d'entrée à une fonction (fortran: sous-routine). Dans la fonction l'argument n'est pas modifié.

C prend en charge à la fois, appel par référence et appel par valeur, ce qui est une fonctionnalité très pratique. Dans notre cas, le programmeur pourrait par accident utiliser call by value. Cela ralentit considérablement les choses, car la structure doit d'abord être copiée dans la mémoire.

Fortran fonctionne avec appel par référence seulement, ce qui oblige le programmeur à copier la structure à la main, s'il veut vraiment un appel par opération de valeur. Dans notre cas, fortran sera automatiquement aussi rapide que la version C avec appel par référence.

7
répondu Markus Dutschke 2016-11-10 10:16:21

généralement FORTRAN est plus lent que C. C peut utiliser des pointeurs de niveau matériel permettant au programmeur de main-optimiser. FORTRAN (dans la plupart des cas) n'a pas accès à des hacks d'adressage de mémoire matérielle. (VAX FORTRAN est une autre histoire. J'utilise FORTRAN depuis les années 70. (Vraiment.)

cependant, à partir des années 90 FORTRAN a évolué pour inclure des constructions linguistiques spécifiques qui peuvent être optimisées en algorithmes intrinsèquement parallèles que peut crie vraiment sur un processeur multi-core. Par exemple, la vectorisation automatique permet à plusieurs processeurs de gérer simultanément chaque élément d'un vecteur de données. 16 processeurs -- 16 element vector -- le traitement prend 1 / 16ème du temps.

en C, vous devez gérer vos propres threads et concevoir votre algorithme avec soin pour le multi-traitement, puis utiliser un tas d'appels API pour s'assurer que le parallélisme se produit correctement.

In FORTRAN, vous devez seulement concevoir votre algorithme avec soin pour le multi-traitement. Le compilateur et de l'exécution peut traiter le reste pour vous.

vous pouvez lire un peu sur haute performance Fortran , mais vous trouverez beaucoup de liens morts. Vous êtes mieux de lire sur la programmation parallèle (comme OpenMP.org ) et comment FORTRAN supporte cela.

6
répondu S.Lott 2011-12-05 10:51:56

le code le plus rapide n'est pas vraiment à la hauteur de la langue, est le compilateur donc vous pouvez voir le ms-VB" compilateur "qui génère du code objet gonflé, lent et redondant qui est lié ensemble à l'intérieur d'un".exe", mais powerBasic génère un code bien meilleur. Le code objet produit par un compilateur C et C++ est généré dans certaines phases (au moins 2) mais par conception la plupart des compilateurs Fortran ont au moins 5 phases, y compris des optimisations de haut niveau donc par conception Fortran aura toujours la capacité de générer du code hautement optimisé. Donc, à la fin est le compilateur pas la langue que vous devriez demander, le meilleur compilateur que je connais est le compilateur Intel Fortran parce que vous pouvez l'obtenir sur LINUX et Windows et vous pouvez utiliser VS comme IDE, si vous êtes à la recherche d'un compilateur tigh pas cher, vous pouvez toujours relayer sur OpenWatcom.

plus d'informations à propos de cette: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html

4
répondu JPerez45 2010-07-17 03:26:08

Fortran a de meilleures routines d'e / s, par exemple la facilité de do implicite donne la flexibilité que la bibliothèque standard de C ne peut pas correspondre.

le compilateur Fortran traite directement les syntaxe impliqués, et en tant que telle syntaxe ne peut pas être facilement réduite pour l'argument passant la forme, C ne peut pas l'implémenter efficacement.

2
répondu Zeus 2015-04-05 18:17:45

la plupart des billets présentent déjà des arguments convaincants, donc je vais juste ajouter le proverbial 2 cents à un aspect différent.

étant fortran plus ou moins rapide en termes de puissance de traitement à la fin peut avoir son importance, mais si elle prend 5 fois plus de temps à développer quelque chose dans Fortran parce que:

  • il n'y a pas de bonne bibliothèque pour des tâches différentes du nombre pur crunching
  • il manque tout outil décent pour la documentation et les essais unitaires
  • c'est un langage à très faible expressivité, qui monte en flèche le nombre de lignes de code.
  • il a une très mauvaise manipulation des cordes
  • il a une quantité inane de problèmes parmi les différents compilateurs et architectures vous rendre fou.
  • il a une très mauvaise stratégie IO (lire/écrire des fichiers séquentiels. Oui, les fichiers d'accès aléatoires existent mais les avez-vous déjà vus utilisés?)
  • il n'a pas d'encourager les bonnes pratiques en matière de développement, la modularisation.
  • absence effective d'un compilateur opensource entièrement standard et entièrement conforme (gfortran et g95 ne supportent pas tout)
  • très faible niveau d'interopérabilité avec C (déformation: un trait de soulignement, de deux traits de soulignement, pas de souligner, en général, un trait de soulignement, mais deux si il y a un autre trait de soulignement. et ne creusez pas dans les blocs communs...)

, Alors la question n'est pas pertinente. Si quelque chose est lent, la plupart du temps vous ne pouvez pas l'améliorer au-delà d'une limite donnée. Si vous voulez quelque chose de plus rapide, changez l'algorithme. En fin de compte, le temps d'ordinateur est bon marché. Le temps de l'homme ne l'est pas. Valorisez le choix qui réduit le temps humain. Si cela augmente le temps d'ordinateur, c'est rentable de toute façon.

1
répondu Stefano Borini 2009-07-20 03:00:57

utilisant des normes et un compilateur modernes, non!

certains des gens ici ont suggéré que FORTRAN est plus rapide parce que le compilateur n'a pas besoin de se soucier de l'Alias (et donc peut faire plus d'hypothèses pendant l'optimisation). Toutefois, cette question a été traitée dans C depuis la norme C99 (je pense) avec l'inclusion du mot-clé restrict. Ce qui indique essentiellement au compilateur, que dans une portée give, le pointeur n'est pas aliasé. En outre, C permet une arithmétique pointeur, où des choses comme l'aliasing peut être très utile en termes de performance et l'affectation des ressources. Bien que je pense que la version plus récente de FORTRAN permet l'utilisation de pointeurs "appropriés".

pour les mises en œuvre modernes C général dépasse FORTRAN (bien qu'il soit très rapide aussi).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

EDIT:

une foire la critique à cet égard semble être que l'étalonnage des performances peut être biaisé. Voici une autre source (relative à C) qui met le résultat dans plus de contexte:

http://julialang.org/benchmarks /

vous pouvez voir que C dépasse généralement Fortran dans la plupart des cas (encore une fois voir les critiques ci-dessous qui s'appliquent ici aussi); comme d'autres l'ont déclaré, l'analyse comparative est une science inexacte qui peut être facilement chargée pour favoriser une langue par rapport à d'autres. Mais il ne met en contexte comment Fortran et C ont des performances similaires.

1
répondu cdcdcd 2016-12-19 23:21:57

Fortran peut gérer des réseaux, en particulier des réseaux multidimensionnels, très commodément. Découper les éléments d'un tableau multidimensionnel dans Fortran peut être beaucoup plus facile que dans C/C++. C++ a maintenant des bibliothèques qui peuvent faire le travail, comme Boost ou Eigen, mais qui sont après tout des bibliothèques externes. En Fortran ces fonctions sont intrinsèques.

si Fortran est plus rapide ou plus pratique pour le développement dépend principalement sur le travail que vous devez finir. Comme Calcul scientifique personne pour la géophysique, j'ai fait la plupart des calculs dans Fortran (Je veux dire moderne Fortran, >=F90).

1
répondu Kai 2018-07-02 18:31:03

c'est plus que quelque peu subjectif, parce qu'il entre dans la qualité des compilateurs et autres plus que toute autre chose. Cependant, pour répondre plus directement à votre question, en parlant du point de vue du langage / compilateur il n'y a rien au sujet de Fortran sur C qui va le rendre intrinsèquement plus rapide ou meilleur que C. Si vous faites des opérations mathématiques lourdes, il va descendre à la qualité du compilateur, la compétence du programmeur dans chaque langue et le soutien mathématique intrinsèque les bibliothèques qui soutiennent ces opérations pour finalement déterminer ce qui va être plus rapide pour une mise en œuvre donnée.

EDIT: D'autres personnes comme @Nils ont soulevé le bon point sur la différence dans l'utilisation des pointeurs en C et la possibilité d'aliasing qui peut-être rend les implémentations les plus naïves plus lentes en C. Cependant, il y a des façons de traiter cela en C99, via des indicateurs d'optimisation du compilateur et/ou dans la façon dont le C est réellement écrit. Ceci est bien couvert dans La réponse de @Nils et les commentaires qui suivent sa réponse.

0
répondu Tall Jeff 2008-09-28 16:47:10

Fortran ne définit généralement pas d'options telles que-fp:strict (ce dont ifort a besoin pour activer certaines des fonctionnalités en usage IEEE_arithmetic, une partie de la norme f2003). Intel C++ ne définit pas non plus-fp:strict par défaut, mais cela est nécessaire pour gérer les ERRNO, par exemple, et d'autres compilateurs C++ ne rendent pas pratique de désactiver ERRNO ou d'obtenir des optimisations telles que la réduction simd. gcc et g++ m'ont demandé de configurer Makefile pour éviter d'utiliser la combinaison dangereuse-O3 -ffast-math-fopenmp-march=native. En dehors de ces questions, cette question sur la performance relative devient plus délicate et dépend des règles locales sur le choix des compilateurs et des options.

-3
répondu tim18 2015-05-26 13:14:37