Question

De temps en temps, je lisais que Fortran était ou pouvait ê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 que j’ai vu jusqu’à présent n’indique pas que le langage comporte des fonctionnalités que C n’a pas.

Si c'est vrai, dites-moi pourquoi. S'il vous plaît, ne me dites pas quelles langues ou quelles bibliothèques sont bonnes pour faire des calculs, je n'ai pas l'intention d'écrire une application ou une bibliothèque pour le faire, je suis simplement curieux.

Était-ce utile?

La solution

Les langues ont des ensembles de fonctionnalités similaires. La différence de performances provient du fait que Fortran déclare que les alias ne sont pas autorisés, sauf si une instruction EQUIVALENCE est utilisée. Tout code qui a un alias n'est pas Fortran valide, mais il appartient au programmeur et non au compilateur de détecter ces erreurs. Ainsi, les compilateurs Fortran ignorent le crénelage possible des pointeurs de mémoire et leur permettent de générer un code plus efficace. Jetez un coup d’œil à 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 serait exécutée plus lentement que son homologue Fortran après optimisation. Pourquoi Si vous écrivez des valeurs dans le tableau de sortie, vous pouvez modifier les valeurs de la matrice. Après tout, les pointeurs pourraient se chevaucher et pointer vers le même bloc de mémoire (y compris le pointeur int !). Le compilateur C est obligé de recharger en mémoire les quatre valeurs de la matrice pour tous les calculs.

Dans Fortran, le compilateur peut charger les valeurs de la matrice une fois et les stocker dans des registres. Cela est possible car le compilateur Fortran suppose que les pointeurs / tableaux ne se chevauchent pas en mémoire.

Heureusement, le mot clé restrict a été utilisé. introduit à la norme C99 pour résoudre ce problème. Il est également bien supporté par la plupart des compilateurs C ++. Le mot-clé vous permet d'indiquer au compilateur que le programmeur promet qu'un pointeur ne fait pas alias avec un autre pointeur. Le pseudonyme strict signifie que le programmeur promet que les pointeurs de types différents ne se chevaucheront jamais. Par exemple, un double * ne chevauchera pas avec un int * (à l'exception char * et void * peuvent se chevaucher avec quoi que ce soit).

Si vous les utilisez, vous obtiendrez la même vitesse que 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 aucun avertissement, mais introduit un bogue qui n’apparaît que sur certains compilateurs, sur certains matériels et avec certaines options d’optimisation.

Autres conseils

Oui, en 1980; En 2008? dépend

Lorsque j’ai commencé à programmer de manière professionnelle, la vitesse de prédilection de Fortran venait juste d’être contestée. Je me souviens de lire à propos de Dr. Dobbs et en parlant de cet article aux programmeurs plus âgés - ils ont ri.

J'ai donc deux points de vue à ce sujet, théorique et pratique. En théorie Fortran n’a aujourd’hui aucun avantage intrinsèque au C / C ++, ni même à aucun langage autorisant le code assembleur. En pratique Fortran bénéficie encore aujourd’hui des avantages d’une histoire et d’une culture fondées sur l’optimisation du code numérique.

Jusqu'en Fortran 77 (inclus), les considérations relatives à la conception des langues avaient pour objectif principal l'optimisation. En raison de l'état de la théorie et de la technologie du compilateur, cela impliquait souvent de limiter les fonctionnalités afin de donner au compilateur la meilleure solution pour optimiser le code. Une bonne analogie est de penser que la Fortran 77 est une voiture de course professionnelle qui sacrifie les caractéristiques pour la vitesse. De nos jours, les compilateurs ont été améliorés dans toutes les langues et les fonctionnalités de productivité des programmeurs ont plus de valeur. Cependant, il existe encore des endroits où les gens sont principalement concernés par la rapidité du calcul scientifique; ces personnes ont très probablement hérité du code, de la formation et de la culture de personnes qui étaient elles-mêmes programmeurs Fortran.

Lorsque l’on commence à parler d’optimisation du code, de nombreux problèmes se posent et le meilleur moyen d’en avoir une idée est pour rechercher les personnes dont le travail consiste à avoir un code numérique rapide . Mais gardez à l’esprit que ce code extrêmement sensible est généralement une petite fraction de l’ensemble des lignes de code et est très spécialisé: une grande partie du code Fortran est tout aussi «inefficace». comme beaucoup d'autres codes dans d'autres langues et l'optimisation ne devrait même pas être une préoccupation majeure de tel code .

Wikipédia est un lieu de départ idéal pour découvrir l’histoire et la culture de Fortran. L'entrée Fortran dans Wikipedia est superbe et j'apprécie beaucoup ceux qui ont pris le temps et les efforts nécessaires il a une valeur pour la communauté Fortran.

(Une version abrégée de cette réponse aurait été un commentaire dans l'excellent fil de discussion lancé par Nils , mais je n'ai pas le karma pour le faire. En fait, je n'aurais probablement pas écrit Ce fil a un contenu et un partage d’informations réels, contrairement aux guerres de flammes et à la bigoterie linguistique, qui est ma principale expérience en la matière. J’étais bouleversé et je devais partager cet amour.)

Dans une certaine mesure, Fortran a été conçu en gardant à l'esprit l'optimisation du compilateur. Le langage prend en charge les opérations sur un tableau complet où les compilateurs peuvent exploiter le parallélisme (en particulier sur les processeurs multicœurs). Par exemple,

La multiplication matricielle dense est simplement:

matmul(a,b)

La norme L2 d'un vecteur x est:

sqrt(sum(x**2))

En outre, des instructions telles que FORALL , PURE & amp; Les procédures ELEMENTAL , etc. contribuent également à optimiser le code. Même les pointeurs en Fortran ne sont pas aussi souples que C en raison de cette simple raison.

Le prochain standard Fortran (2008) comporte 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à.

Alors oui, Fortran peut être rapide simplement parce que les compilateurs peuvent l’optimiser / le paralléliser mieux que le C / C ++. Mais encore une fois, comme dans toute vie, il y a de bons compilateurs et de mauvais compilateurs.

C’est drôle qu’il y ait beaucoup de réponses ici pour ne pas connaître les langues. Cela est particulièrement vrai pour les programmeurs C / C ++ qui ont ouvert et utilisent l'ancien code FORTRAN 77 et discutent des faiblesses.

Je suppose que la question de la vitesse est principalement une question entre C / C ++ et Fortran. Dans un code énorme, cela dépend toujours du programmeur. Fortran surpasse certaines fonctionnalités du langage et C, certaines fonctionnalités. Donc, en 2011, personne ne peut vraiment dire lequel est le plus rapide.

En ce qui concerne le langage lui-même, Fortran prend actuellement en charge les fonctionnalités Full OOP et est totalement compatible avec les versions antérieures. J'ai utilisé le Fortran 2003 à fond et je dirais que c'était un plaisir de l'utiliser. Sous certains aspects, Fortran 2003 est toujours en retard sur C ++, mais regardons l’utilisation. Fortran est principalement utilisé pour le calcul numérique et personne n'utilise des fonctions de programmation orientée objet C ++ sophistiquées pour des raisons de rapidité. Dans l'informatique haute performance, le C ++ n'a presque pas de place où aller (jetez un coup d'œil au standard MPI et vous verrez que le C ++ est obsolète!).

De nos jours, vous pouvez simplement faire de la programmation en plusieurs langues avec Fortran et C / C ++. Il existe même des interfaces pour GTK + en Fortran. Il existe des compilateurs gratuits (gfortran, g95) et de nombreux excellents logiciels commerciaux.

Fortran pourrait être plus rapide pour plusieurs raisons. Cependant, leur montant est si insignifiant ou peut être modifié de toute façon, cela ne devrait pas y avoir d'importance. De nos jours, la principale raison d'utiliser Fortran est la maintenance ou l'extension des applications existantes.

  • Mots-clés PURE et ELEMENTAL sur les fonctions. Ce sont des fonctions qui n'ont pas d'effets secondaires. Cela permet des optimisations dans certains cas où le compilateur sait que la même fonction sera appelée avec les mêmes valeurs. Remarque: GCC implémente " pure " comme une extension de la langue. D'autres compilateurs peuvent aussi bien. L'analyse inter-module peut également permettre cette optimisation, mais elle est difficile.

  • ensemble standard de fonctions qui traitent des tableaux, pas d'éléments individuels. Des choses comme sin (), log (), sqrt () prennent des tableaux à la place de scalaires. Cela facilite l'optimisation de la routine. La vectorisation automatique offre les mêmes avantages dans la plupart des cas si ces fonctions sont intégrées ou intégrées

  • Type complexe intégré. En théorie, cela pourrait permettre au compilateur de réorganiser ou d’éliminer certaines instructions dans certains cas, mais vous verriez probablement le même avantage avec struct {double re, im; }; Idiome utilisé en C. Cela permet un développement plus rapide, car les opérateurs travaillent sur des types complexes dans fortran.

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 mathématiques basées sur les vecteurs et les matrices. Le problème d'analyse du pointeur souligné ci-dessus est réel dans la pratique, car le code portable ne peut pas vraiment supposer que vous pouvez dire quelque chose à un compilateur. Il existe TOUJOURS un avantage pour les calculs d’expression de manière plus proche de l’apparence du domaine. C n’a pas vraiment de tableaux du tout, si vous regardez bien, juste quelque chose qui se comporte de la sorte. Fortran a de véritables arrawys. Ce qui facilite la compilation de certains types d’algorithmes, en particulier des machines parallèles.

Au fond des choses comme le système d’exécution et les conventions d’appel, C et Fortran moderne sont suffisamment similaires pour qu’il soit difficile de voir ce qui pourrait changer les choses. Notez que C est vraiment une base C: C ++ est un problème totalement différent avec des caractéristiques de performances très différentes.

Il n’existe pas de langage plus rapide, c’est pourquoi la réponse correcte est non .

Ce que vous devez vraiment demander, c’est "le code compilé avec le compilateur Fortran X est-il plus rapide que le code équivalent 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 poser serait celle-ci: "Avec le même effort d’optimisation de leurs compilateurs, quel compilateur produirait du code plus rapide?" La réponse à cette question serait en fait Fortran . Les compilateurs Fortran ont des avantages certian:

  • Fortran a dû rivaliser avec Assembly à 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.
  • Le créneau de Fortran a été le calcul du nombre. Dans ce domaine, le code jamais est assez rapide. Il y a donc toujours eu beaucoup de pression pour que la langue soit efficace.
  • La plupart des recherches sur l'optimisation des compilateurs sont effectuées par des personnes intéressées par une accélération du code de compression de données Fortran. L'optimisation du code Fortran est donc un problème bien mieux connu que celui de tout autre langage compilé. De nouvelles innovations apparaissent dans les compilateurs Fortran.
  • Biggie : C encourage l'utilisation beaucoup plus de pointeurs que Fortran. Cela augmente considérablement la portée potentielle de tout élément de données dans un programme C, ce qui le rend beaucoup plus difficile à optimiser. Notez qu'Ada est également bien meilleur que le C dans ce domaine et qu'il est un langage OO beaucoup plus moderne que le Fortran77 que l'on trouve couramment. Si vous souhaitez un langage en langage d’utilisation pouvant générer du code plus rapide que le langage C, cette option vous convient.
  • En raison de son nouveau créneau, les clients des compilateurs Fortran ont tendance à se préoccuper davantage de l'optimisation que les clients des compilateurs C.

Cependant, rien n'empêche quelqu'un de faire beaucoup d'efforts pour optimiser son compilateur C et de le faire générer un meilleur code que le compilateur Fortran de sa plate-forme. En fait, les ventes plus importantes générées par les compilateurs C rendent ce scénario tout à fait réalisable.

Il existe un autre élément pour lequel Fortran est différent de C - et potentiellement plus rapide. Fortran a de meilleures règles d'optimisation que C. En Fortran, l'ordre d'évaluation d'une expression n'est pas défini, ce qui permet au compilateur de l'optimiser - si l'on veut forcer un certain ordre, il faut utiliser des parenthèses. En C, l'ordre est beaucoup plus strict, mais avec "-fast". options, elles sont plus détendues et "(...)". sont également ignorés. Je pense que Fortran a un chemin qui se situe bien au milieu. (Eh bien, l’IEEE rend la vie plus difficile car certains changements d’ordre d’évaluation exigent qu’il n’y ait pas de débordement, ce qui doit être ignoré ou gêner l’évaluation.)

Les nombres complexes constituent un autre domaine de règles plus intelligentes. Non seulement il a fallu attendre C 99 pour que C les ait, mais les règles qui les régissent sont meilleures à Fortran; Puisque la bibliothèque Fortran de gfortran est partiellement écrite en C mais implémente la sémantique Fortran, GCC a obtenu l’option (qui peut également être utilisée avec les programmes "normaux" C):

  

-fcx-fortran-rules   La multiplication et la division complexes suivent les règles de Fortran. La réduction de la plage est effectuée dans le cadre d'une division complexe, mais il n'est pas vérifié si le résultat d'une multiplication ou d'une division complexe est "NaN + I * NaN", dans le but de sauver la situation dans ce cas.

Les règles de pseudonymes mentionnées ci-dessus constituent un autre atout, mais aussi, du moins en principe, les opérations de type tableau entier qui, si elles sont correctement prises en compte par l’optimiseur du compilateur, permettent d’obtenir du code plus rapidement. En revanche, certaines opérations prennent plus de temps, par exemple. si on fait une assignation à un tableau pouvant être alloué, de nombreuses vérifications sont nécessaires (réallocation? [fonctionnalité Fortran 2003], le tableau avance-t-il, etc.), ce qui rend l'opération simple plus complexe en coulisse - et donc plus lente, mais rend le langage plus puissant. D'autre part, les opérations de tableau avec des limites et des marches flexibles facilitent l'écriture de code - et le compilateur optimise généralement mieux le code qu'un utilisateur.

Au total, je pense que C et Fortran sont à peu près aussi rapides; le choix devrait être davantage quelle langue veut-on davantage ou si l’utilisation des opérations de type tableau entier de Fortran et sa meilleure portabilité sont plus utiles - ou le meilleur interface entre les bibliothèques système et d’interface utilisateur graphique de C.

Il n’existe rien des langues Fortran et C, qui rend l’une plus rapide que l’autre à des fins spécifiques. Des compilateurs spécifiques à chacune de ces langues ont des aspects qui rendent certaines favorables à certaines tâches plus que d’autres.

Pendant de nombreuses années, les compilateurs Fortran ont existé et pourraient faire de la magie noire à vos routines numériques, ce qui rendrait incroyablement rapides des calculs importants. Les compilateurs C contemporains ne pourraient pas le faire aussi bien. En conséquence, plusieurs grandes bibliothèques de code se sont développées à Fortran. Si vous souhaitez utiliser ces merveilleuses bibliothèques bien testées, matures et abouties, vous sortez le compilateur Fortran.

Mes observations informelles montrent que ces jours-ci, les gens codent leurs calculs complexes dans n’importe quelle langue ancienne, et s’ils mettent un peu de temps, ils trouvent le temps sur un cluster de calcul bon marché. La loi de Moore nous rend ridicules.

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

L’exercice d’intégration automatique de fonctions automatiques est minime pour voir dans quelle mesure elle améliore l’optimisation, car les exemples sont basés sur la pratique Fortran traditionnelle, qui accorde peu d’importance à l’intégration.

Le compilateur C / C ++, qui a de loin l'usage le plus répandu, ne dispose pas de la vectorisation automatique, sur laquelle reposent ces tests de performances.

En ce qui concerne le message publié juste avant, il existe quelques exemples d'utilisation de parenthèses dans Fortran pour indiquer l'ordre d'évaluation plus rapide ou plus précis. Les compilateurs C connus ne disposent pas d'options pour observer les parenthèses sans désactiver les optimisations plus importantes.

Je faisais quelques mathématiques approfondies avec FORTRAN et C pendant quelques années. De par ma propre expérience, je peux dire que FORTRAN est parfois vraiment meilleur que C mais pas pour sa rapidité (on peut faire en sorte que C fonctionne aussi vite que FORTRAN en utilisant un style de codage approprié), mais plutôt à cause de librairies très bien optimisées comme LAPACK, et à cause de grande parallélisation. À mon avis, il est vraiment difficile de travailler avec FORTRAN et ses avantages ne sont pas suffisants pour supprimer cet inconvénient; c’est pourquoi je me sers maintenant de C + GSL pour effectuer des calculs.

Je suis un programmeur amateur et je suis "moyen". aux deux langues. Je trouve qu'il est plus facile d'écrire du code Fortran rapide que du code C (ou C ++). Fortran et C sont tous deux "historiques". langages (aujourd’hui standard), sont très utilisés et ont bien pris en charge les compilateurs libres et commerciaux.

Je ne sais pas si c'est un fait historique, mais Fortran a le sentiment qu'il est construit pour être mis en parallèle, distribué, vectorisé ou peu importe ce qu'il est. Et aujourd’hui, c’est à peu près la "métrique standard". quand on parle de vitesse: "est-ce que ça change?"

Pour le calcul pur du processeur, j'aime Fortran. Pour tout ce qui touche IO, il est plus facile de travailler avec C. (c’est quand même difficile dans les deux cas).

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

Ma réponse moyennement objective est la suivante: si vous connaissez les deux langues de manière égale / médiocre, je pense que Fortran est plus rapide car il est plus facile d’écrire du code parallèle / distribué en Fortran que C. (une fois que vous avez compris que vous pouvez écrire " forme libre "fortran et pas seulement du code F77 strict)

Voici une deuxième réponse pour ceux qui sont disposés à me baisser parce qu'ils n'aiment pas la première réponse: les deux langues disposent des fonctionnalités nécessaires pour écrire du code haute performance. Cela dépend donc de l’algorithme que vous implémentez (intensif en cpu? Intensif? Intensif en mémoire?), Du matériel (un seul cpu? Supercalculateur? Superordinateur? GPGPU? FPGA?), De vos compétences et, finalement, du compilateur. C et Fortran ont tous les deux un compilateur génial. (Je suis vraiment étonné par la façon dont les compilateurs Fortran sont avancés, mais aussi par les compilateurs C).

PS: Je suis heureux que vous ayez spécifiquement exclu les bibliothèques parce que j'ai beaucoup de mauvaises choses à dire sur les bibliothèques à interface graphique Fortran. :)

Je n’ai pas entendu dire que Fortan est nettement plus rapide que C, mais il est peut-être concevable qu’il soit plus rapide dans certains cas. Et la clé ne réside pas dans les fonctionnalités linguistiques présentes, mais dans celles qui (généralement) sont absentes.

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

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

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

Le compilateur doit travailler en supposant que les tableaux d et s pourraient se chevaucher. Donc, il ne peut pas effectuer une optimisation qui produirait des résultats différents lorsque les tableaux se chevauchent. Comme on pouvait s'y attendre, cela limite considérablement le type d'optimisations pouvant être effectuées.

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

Mais revenons à la question C vs. Fortran, il est concevable qu’un compilateur Fortran soit capable d’optimiser certaines optimisations qui pourraient ne pas être possibles pour un programme C (écrit directement). Donc, je ne serais pas trop surpris par la demande. Cependant, je m'attends à ce que la différence de performance ne soit pas si importante. [~ 5-10%]

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

Quoi qu’il en soit, un bon programmeur peut écrire en Fortran dans n’importe quelle langue.

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 dans un atelier Fortran au centre de calcul de haute performance Stuttgard, en Allemagne, en 2015. Je travaille à la fois avec Fortran et C et partage cet avis.

Explication:

C a été conçu pour écrire des systèmes d’exploitation. Par conséquent, il a plus de liberté que nécessaire pour écrire du code 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 code rapide, car c’est l’objectif principal de Fortran. Contrairement à l'opinion publique, Fortran n'est pas un langage de programmation obsolète. Son dernier standard date de 2010 et de nouveaux compilateurs sont publiés régulièrement, car la plupart des codes haute performance sont écrits en Fortran. Fortran prend en charge les fonctionnalités modernes en tant que directives de compilation (dans les pragmas C).

Exemple: Nous voulons donner une grande structure en tant qu'argument d'entrée à une fonction (fortran: sous-programme). Dans la fonction, l'argument n'est pas modifié.

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

Fortran fonctionne uniquement sur appel par référence, ce qui oblige le programmeur à copier manuellement la structure, s’il souhaite réellement une opération appel par valeur. Dans notre cas, fortran sera automatiquement aussi rapide que la version C avec appel par référence.

En règle générale, FORTRAN est plus lent que C. Il peut utiliser des pointeurs de niveau matériel permettant au programmeur d'optimiser manuellement. FORTRAN (dans la plupart des cas) n'a pas accès à la mémoire matérielle adressant des hacks (VAX FORTRAN est une autre histoire.) Je me sers de FORTRAN de façon intermittente depuis les années 70. (Vraiment.)

Cependant, depuis les années 90, FORTRAN a évolué pour inclure des constructions de langage spécifiques qui peuvent être optimisées dans des algorithmes intrinsèquement parallèles que peut crier réellement sur un processeur multicœur. 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 éléments vectoriels - le traitement prend 1/16 du temps.

En C, vous devez gérer vos propres threads et concevoir votre algorithme avec soin pour le multitraitement, puis utiliser de nombreux appels d'API pour vous assurer que le parallélisme se déroule correctement.

Sous FORTRAN, il vous suffit de concevoir soigneusement votre algorithme pour le multitraitement. Le compilateur et le run-time peuvent gérer le reste pour vous.

Vous pouvez en savoir plus sur Haute performance Fortran , mais vous trouvez beaucoup de liens morts. Il vaut mieux que vous lisiez sur la programmation parallèle (comme OpenMP.org ) et sur le soutien de FORTRAN.

Le code le plus rapide n’est pas vraiment à la portée du langage, c’est le compilateur, qui vous permet de voir le ms-vb "compilateur". qui génère un code d'objet saturé, lent et redondant, lié dans un ".exe", mais powerBasic génère un code bien meilleur. Le code objet créé par les compilateurs C et C ++ est généré en quelques phases (au moins 2) mais, par conception, la plupart des compilateurs Fortran comportent au moins 5 phases, y compris des optimisations de haut niveau. Par conséquent, Fortran aura toujours la capacité de générer du code hautement optimisé. Donc, à la fin, le compilateur n'est pas le langage que vous devriez demander, le meilleur compilateur que je connaisse est le compilateur Intel Fortran, car vous pouvez l'obtenir sur LINUX et Windows et vous pouvez utiliser VS comme IDE, si vous recherchez une compilateur Tigh pas cher, vous pouvez toujours relayer sur OpenWatcom.

Plus d'infos à ce sujet: http://ed-thelen.org/1401Project/1401-IBM -Systems-Journal-FORTRAN.html

Fortran a de meilleures routines d’E / S, par exemple. la fonctionnalité implicite do offre une flexibilité à laquelle la bibliothèque standard de C ne peut pas correspondre.

Le compilateur Fortran gère directement le plus complexe syntaxe impliquée, et en tant que telle, la syntaxe ne peut pas être facilement réduite en passant à l'argument, C ne peut pas le mettre en œuvre efficacement.

En utilisant les standards et le compilateur modernes, non!

Certaines personnes ici suggèrent que FORTRAN est plus rapide, car le compilateur n'a pas à se soucier de l'aliasing (et peut donc faire davantage d'hypothèses lors de l'optimisation). Cependant, cela a été traité en C depuis la norme C99 (je pense) avec l’inclusion du mot clé restrict. Ce qui indique fondamentalement au compilateur, que dans une portée, le pointeur n'est pas aliasé. De plus, C permet une arithmétique correcte du pointeur, où des alias peuvent être très utiles en termes de performance et d’allocation de ressources. Bien que je pense que la version plus récente de FORTRAN permette l’utilisation de "correct" pointeurs.

Pour les implémentations modernes, C est plus performant que FORTRAN (même s’il est très rapide aussi).

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

EDIT:

L’une des critiques honnêtes semble être que l’évaluation comparative peut être biaisée. Voici une autre source (relative à C) qui place le résultat dans plus de contexte:

http://julialang.org/benchmarks/

Vous pouvez constater que C surpasse généralement Fortran dans la plupart des cas (voir à nouveau les critiques ci-dessous qui s'appliquent également ici); comme d'autres l'ont déjà dit, l'analyse comparative est une science inexacte qui peut facilement être utilisée pour favoriser une langue par rapport à d'autres. Mais cela met en contexte comment Fortran et C ont des performances similaires.

Fortran peut gérer les tableaux, en particulier les tableaux multidimensionnels, de manière très pratique. Le découpage d'éléments d'un tableau multidimensionnel en Fortran peut s'avérer beaucoup plus simple qu'en C / C ++. C ++ a maintenant des bibliothèques peuvent faire le travail, tels que Boost ou Eigen, mais ils sont après toutes les bibliothèques externes. En Fortran, ces fonctions sont intrinsèques.

Que Fortran soit plus rapide ou plus pratique à développer dépend principalement du travail que vous devez terminer. En tant que spécialiste du calcul scientifique en géophysique, j’ai effectué l'essentiel du calcul en Fortran (je veux dire le Fortran moderne, > = = F90).

C’est plus qu’un peu subjectif, car cela touche plus particulièrement à la qualité des compilateurs. Cependant, pour répondre plus directement à votre question, du point de vue de la langue et du compilateur, rien ne dit de Fortran sur C que le rendra intrinsèquement plus rapide ou meilleur que C. Si vous effectuez des opérations mathématiques lourdes, cela se résumera au la qualité du compilateur, les compétences du programmeur dans chaque langue et les bibliothèques de support mathématique intrinsèques prenant en charge ces opérations afin de déterminer en fin de compte celle qui sera la plus rapide pour une implémentation donnée.

EDIT: D'autres personnes telles que @Nils ont soulevé un point positif sur la différence d'utilisation des pointeurs en C et sur la possibilité de création d'alias qui ralentit peut-être les implémentations les plus naïves en C. Cependant, il existe des solutions C99, via les indicateurs d’optimisation du compilateur et / ou la manière dont le C est écrit. Ceci est bien couvert dans la réponse de @Nils et les commentaires qui suivent sur sa réponse.

La plupart des articles présentent déjà des arguments convaincants, je vais donc simplement ajouter les 2 centimes proverbiaux à un aspect différent.

Avoir une puissance de traitement plus ou moins rapide peut avoir son importance, mais s’il faut cinq fois plus de temps pour développer quelque chose en Fortran, car:

  • il ne manque aucune bonne bibliothèque pour des tâches différentes de la gestion des chiffres pure
  • il ne manque d’outil décent pour la documentation et les tests unitaires
  • c'est un langage à très faible expressivité, qui grimpe en flèche le nombre de lignes de code.
  • le traitement des chaînes est très médiocre
  • il y a une quantité infime de problèmes parmi différents compilateurs et architectures qui vous rendent fous.
  • il a une stratégie IO très mauvaise (lecture / écriture de fichiers séquentiels. Oui, des fichiers à accès aléatoire existent, mais les avez-vous jamais vus utilisés?)
  • cela n’encourage pas les bonnes pratiques de développement, la modularisation.
  • absence effective de compilateur opensource entièrement standard et entièrement conforme (gfortran et g95 ne supportent pas tout)
  • très mauvaise interopérabilité avec C (remplacement: un soulignement, deux soulignements, aucun soulignement, en général un soulignement mais deux s'il y a un autre soulignement. et il suffit de ne pas fouiller dans les blocs COMMON ...)

Ensuite, le problème n'est pas pertinent. 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 passé sur l'ordinateur est bon marché. Le temps humain n'est pas. Valorisez le choix qui réduit le temps humain. Si cela augmente le temps d’ordinateur, c’est quand même rentable.

Traditionnellement, Fortran ne définit pas les options telles que -fp: strict (requis par ifort pour activer certaines des fonctionnalités de USE IEEE_arithmetic, composant du standard f2003). Intel C ++ ne définit pas non plus par défaut -fp: strict, mais cela est nécessaire pour la gestion des ERRNO, par exemple, et les autres compilateurs C ++ ne permettent pas de désactiver ERRNO ou d'obtenir des optimisations telles que la réduction simd. gcc et g ++ m'ont obligé à configurer Makefile pour éviter d'utiliser la dangereuse combinaison -O3 -ffast-math -fopenmp -march = native. Outre ces problèmes, cette question de la performance relative devient plus délicate et dépend des règles locales relatives au choix des compilateurs et des options.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top