C ++ vs Fortran pour HPC

56

Dans mon programme de doctorat en sciences informatiques, nous travaillons presque exclusivement en C ++ et en Fortran. Il semble que certains professeurs préfèrent l'un à l'autre. Je me demande lequel est 'meilleur' ​​ou si l'un est meilleur que l'autre dans certaines circonstances.

drjrm3
la source
12
Un mélange de langage haut et bas est préférable à un usage exclusif, à mon avis. Par exemple, j'utilise Python + C ++.
Faheem Mitha
2
Les réponses à cette question seront presque purement subjectives et je ne suis donc pas sûr que cette question soit appropriée.
Jeff

Réponses:

62

Comme souvent, le choix dépend (1) du problème que vous essayez de résoudre, (2) des compétences que vous avez et (3) des personnes avec qui vous travaillez (sauf s’il s’agit d’un projet solo). Je vais laisser (3) de côté pour le moment car cela dépend de la situation de chacun.

Dépendance au problème: Fortran excelle dans le traitement des matrices. Si votre problème peut être décrit en termes de structures de données simples et de tableaux, Fortran est bien adapté. Les programmeurs Fortran finissent par utiliser des tableaux même dans des cas non évidents (par exemple pour représenter des graphiques). C ++ convient mieux aux structures de données complexes et hautement dynamiques.

La compétence dépend: il faut beaucoup plus d’expérience de programmation pour écrire de bons programmes C ++ que pour écrire de bons programmes Fortran. Si vous débutez avec une expérience limitée en programmation et que vous disposez de moins de temps pour apprendre cet aspect de votre travail, vous obtiendrez probablement un meilleur retour sur investissement en apprenant Fortran qu'en apprenant le C ++. En supposant, bien sûr, que votre problème convient à Fortran.

Cependant, la programmation ne se limite pas à Fortran et à C ++. Je recommanderais à quiconque se lancer dans la science informatique de commencer avec un langage dynamique de haut niveau tel que Python. Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!

Khinsen
la source
17
"Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!" En tant que personne travaillant dans HPC, je suis en désaccord avec cette partie; tout le reste est sur place.
Levi Morrison
19
"Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!" En tant que chercheur scientifique, je suis tout à fait d’accord avec cela.
Déclenche
3
"Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!" - J'aimerais ajouter mes 2 centimes - utiliser plusieurs centaines de nœuds, chacun avec plus de 10 cœurs pour exécuter un programme pendant plusieurs semaines, peut être considéré comme un horrible gaspillage d'une ressource des plus précieuses, si deux semaines de plus pouvaient produire une code qui ne fonctionne que dans quelques jours. Ces clusters HPC sont une ressource commune rare et coûteuse.
Dani_l
"Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!", Code pour une semaine mais fonctionne pour un mois, c'est assez habituel monsieur!
Fronthem
6
"Rappelez-vous toujours que votre temps est plus précieux que le temps de calcul!", Je préférerais coder pendant un mois et le faire en une semaine! - Vous pouvez en faire plus une fois que le code est écrit et les autres trouveront le code que vous écrivez plus utile.
Charles
37

Je pense que C ++ et Fortran sont assez bons et fonctionnent bien.

Cependant, je pense que Fortran convient mieux au calcul scientifique numérique , aux algorithmes pouvant être exprimés à l'aide de tableaux et ne nécessitant pas d'autres structures de données sophistiquées, donc dans des domaines tels que les différences / éléments finis, les solveurs PDE, les calculs de structure électronique. Fortran est une langue spécifique à un domaine. En particulier, je pense qu'il est plus facile d'écrire des programmes rapides en Fortran qu'en C ++, par un scientifique (pas nécessairement un expert en informatique).

C ++ est un langage polyvalent, donc on peut y exprimer n'importe quel algorithme, et c'est certainement mieux pour les algorithmes qui ne peuvent pas être exprimés en utilisant des tableaux, à partir du champ HPC, probablement des graphes, des générateurs de maillage, des manipulations symboliques, etc.

Il est également possible d'écrire des algorithmes de tableaux en C ++, mais selon mon expérience, cela demande beaucoup plus de connaissances en informatique et en général plus de travail (par exemple, il faut créer ou réutiliser des classes pour la manipulation de tableaux, et gérer manuellement la bibliothèque comme Teuchos de Trilinos). Les non-experts ont tendance à écrire de très bons programmes Fortran, mais des programmes C ++ horribles (parlant de ma propre expérience).

Disclaimer: Personnellement, j'aime beaucoup Fortran et je le préfère au C ++ pour l'informatique numérique. J'ai passé plus de 2 ans en programmation C ++ tous les jours et presque une année en Fortran moderne (dans la zone des éléments finis). J'utilise aussi beaucoup Python et Cython.

Ondřej Čertík
la source
1
Une place pour que la première réponse soit équilibrée. Je pense que C ++ et Fortran ne sont de loin pas les seules possibilités du HPC contemporain. Je pense qu'il est bon de connaître la force et les points faibles lorsque vous choisissez Fortran, C ++ ou Python (ou ce que vous préférez). J'ai vu 20 000 lignes de Fortran dans un seul fichier, cultivé de manière organique au cours de plusieurs décennies. Personnellement, je n'utiliserais que pour l'informatique en réseau lourd isolée. Pas même pour quoi que ce soit lié à la sortie. Jusqu'ici pour un commentaire partial.
Shuhalo
6
Je ne pouvais pas être plus en désaccord avec cette réponse. Notre code d'éléments finis n'aurait pas été possible d'écrire en Fortran. En fait, il a commencé il y a 15 ans sous la forme d'un mélange de C et de Fortran (ce dernier étant destiné aux parties à forte intensité de méthode de la méthode), avant de passer progressivement au C pur, puis au C ++, au fil de plusieurs années. Le code est devenu systématiquement plus court, plus rapide et plus facile à comprendre, et il était plus capable après chaque itération. Je suis d'accord avec d'autres qui soulignent que C ++ vous donne beaucoup de corde pour vous tirer dessus. Choisissez la langue avec laquelle vous êtes le plus à l'aise.
Bill Barth
6
Bill, avez-vous utilisé le Fortran moderne (ajouts de 90 et plus récents?). C'est très important (j'aurais dû être plus explicite dans ma réponse à ce sujet). Bien sûr, "20.000 lignes de Fortran" ou "f77" n’est en général pas meilleur que le C ++ bien écrit.
Ondřej Čertík
1
@ OndřejČertík: Je pense que si vous croyez que les programmes à éléments finis modernes utilisent des structures de données "simples", vous ne les avez pas examinées récemment. Essayez d'implémenter des éléments finis adaptatifs, des méthodes hp ou des réseaux multiples sur des maillages non structurés à l'aide de structures de données simples. Bill est sur place et je crois pouvoir dire que l’utilisation du «Fortran moderne» n’aurait guère fait plus qu’une petite différence.
Wolfgang Bangerth
6
@WolfgangBangerth, voir par exemple Phaml ( math.nist.gov/phaml ) pour une implémentation en Fortran de pratiquement tout ce que vous avez mentionné.
Ondřej Čertík
31

Je lance également mes deux cents en retard, mais je viens tout juste de voir ce fil et je sens que, pour la postérité, il y a quelques points qui doivent absolument être abordés.

Notez dans la suite que je parlerai de C et non de C ++. Pourquoi? Autrement, c’est aux pommes et aux oranges de comparer un langage orienté objet à typage dynamique à part entière avec un objet aussi statique que Fortran. Certes, certaines implémentations modernes des dernières normes Fortran peuvent faire plus que cela, mais très peu de personnes les utilisent réellement. Ainsi, lorsque nous parlons de Fortran, nous pensons à un langage simple, statique et impératif. C est là où C est aussi, je vais donc remplacer C par C ++ pour ce qui suit.

Tout d’abord, toute discussion sur le fait que Fortran / C ait de meilleurs compilateurs est sans objet. Les compilateurs C / Fortran dédiés appartiennent au passé. Gcc / gfortran et icc / ifc ne sont que deux frontaux distincts, c’est-à-dire que votre programme sera transformé en une description abstraite par le front-end, puis optimisé et assemblé par le back-end. Si vous écrivez sémantiquement le même code en Fortran ou en C, le compilateur produira dans les deux cas le même assemblage qui fonctionnera tout aussi rapidement.

Ceci mène maintenant à mon deuxième point: pourquoi voyons-nous encore des différences? Le problème est que la plupart des comparaisons sont faites par les programmeurs Fortran qui essayent quelque chose en C ou vice-versa. Avez-vous déjà remarqué comment la plupart des auteurs ou des poètes préfèrent écrire dans leur langue maternelle? Voudriez-vous écrire de la poésie dans une langue dans laquelle vous ne vous sentez pas totalement confiant ou chez vous? Bien sûr que non ... Je considère moi-même que C est mon langage de programmation "natif". Cependant, j'ai également passé trois ans à travailler dans un groupe utilisant uniquement le Fortran, dans lequel j'ai atteint un certain niveau de fluence. Cependant, je n’écrirais jamais rien seul à Fortran car je suis plus à l’aise avec C et, par conséquent, le code obtenu sera meilleur , quelle que soit votre définition.

Donc, la principale différence réside dans le programmeur, pas dans la langue. Donc, il n'y a pas de différences? Pas tout à fait. Voici quelques exemples:

  • SIMD: Qu'il s'agisse de SSE, SSE3 ou AltiVec, si vous souhaitez les utiliser dans Fortran, espérez mieux que le compilateur devine exactement ce que vous voulez et le fasse ainsi. Bonne chance. En C, vous avez généralement des fonctions intrinsèques pour chaque architecture ou, plus récemment, des types de vecteurs SIMD généraux dans gcc . La plupart des compilateurs Fortran n'utilisent que les instructions SIMD pour dérouler les boucles, mais si vous avez un noyau qui fonctionne sur des vecteurs courts de données de manière non évidente, le compilateur ne le verra probablement pas.

  • Différentes architectures matérielles: Toute l'architecture CUDA est construite autour de noyaux en C. Le groupe Portland dispose désormais d'un compilateur fortran compatible CUDA , mais il est commercial et surtout, il ne provient pas de NVIDIA. Il en va de même pour OpenCL, pour lequel le meilleur que j'ai pu trouver est un projet récent qui ne prend en charge que quelques appels de base.

  • Programmation parallèle: Oui, MPI et OpenMP fonctionnent parfaitement avec C et Fortran. Cependant, si vous voulez un réel contrôle de vos threads, c'est-à-dire que si vous avez un calcul de mémoire partagée entièrement dynamique, vous serez dans le froid avec Fortran. En C, vous avez les pthreads standards qui, sans être chauds et confus, vous permettront quand même de traverser la tempête. En général, la plupart des calculs reposant sur l'accès au système d'exploitation, tels que les threads, les processus, le système de fichiers, etc., sont mieux gérés avec C. Oh, et n'essayez pas de créer votre propre réseau avec Fortran.

  • Facilité d'utilisation: Fortran est plus proche de Matlab que C Une fois que vous avez défini tous les différents mots-clés et comment déclarer des variables, le reste du code ressemble à Matlab, ce qui le rend plus accessible aux utilisateurs ayant une expérience limitée de la programmation.

  • Interopérabilité: lorsque vous créez une structure en C, la présentation des données réelles est directe et déterministe. En Fortran, si vous utilisez des tableaux de pointeurs ou des données structurées, la présentation réelle des données dépend fortement du compilateur, non directe, et est généralement non documentée. Vous pouvez appeler C depuis Fortran et vice-versa, mais ne commencez pas à penser qu'il peut être aussi facile de faire passer autre chose qu'un tableau statique de l'un à l'autre et inversement.

Tout cela est un peu geek, de bas niveau, mais c'est de l'informatique haute performance dont nous parlons, n'est-ce pas? Si vous ne souhaitez pas exploiter au mieux les paradigmes matériels sous-jacents, c'est-à-dire implémenter et / ou développer les meilleurs algorithmes pour la mémoire partagée / distribuée, les threads, la vectorisation SIMD, les GPU utilisant SIMT, etc. je fais juste des maths sur un ordinateur.

Cela a pris beaucoup plus de temps que tout ce que je pensais, alors voici un résumé - un ensemble de messages à emporter:

  • Vous écrirez le meilleur code que vous pouvez dans la langue que vous connaissez le mieux.
  • Il n'y a aucune différence dans la qualité du code produit par deux compilateurs qui utilisent le même back-end - c'est nous qui écrivons du mauvais code dans une langue ou une autre.
  • Bien qu’il se sente plus bas niveau, Fortran est une abstraction assez élevée et ne vous permettra pas d’accéder directement à certaines fonctionnalités matérielles / OS, telles que SIMD, threads, réseaux, etc.
Pedro
la source
5
Bonne réponse. Je ne pense toutefois pas que votre dernier commentaire soit nécessairement vrai. Je suis moi-même programmeur C, mais vous avez accès à des tâches de bas niveau en Fortran grâce à de bonnes pratiques de programmation. Le moyen idéal d'utiliser des éléments tels que SIMD ops est d'écrire du code qui le suggère fortement (bloquer les boucles, par exemple) et de laisser le compilateur le faire pour vous. Pour le threading, utilisez simplement openMP (pthreads est également utilisable avec un peu de travail supplémentaire). Fortran a tout ce que vous mentionnez, mais à un niveau qui importe pour son utilisateur type: le numérique.
Reid.Atcheson
@ Reid.Atcheson: Eh bien, si vous bloquez tout ce que le compilateur va capturer, cela fonctionnera automatiquement aussi bien en C que dans Fortran. Le problème est cependant de savoir jusqu'où voulez-vous faire confiance à votre compilateur? Et pourquoi voulez-vous avoir confiance en cela lorsque vous savez exactement ce que vous voulez faire? OpenMP fait du threading, oui, mais par bloc. Vous pouvez le tromper en faisant en sorte que différents pools de threads fassent différentes choses, mais c'est simplement une mauvaise utilisation de OpenMP. Pthreads for Fortran ne sont que des wrappers pour les fonctions C. Je conviens cependant que Fortran est plus facile si vous n’êtes pas dans les détails.
Pedro
1
Bien sûr, vous n'allez pas obtenir une efficacité maximale à 99% en vous fiant au compilateur, mais vous pouvez facilement vous en approcher. Au-delà, vous devez soit utiliser des composants intrinsèques, soit des systèmes ASM intégrés. Vous devez faire des concessions quelque part pour l'efficacité globale du programmeur, c'est pourquoi les langages de programmation existent en premier lieu. Au stade où vous êtes assez fou pour entrer dans les détails des éléments intrinsèques ou de l’ASM (je l’ai déjà été quelques fois), Fortran n’est pas une béquille. De toute façon, vous sauriez comment lier votre code assemblé optimisé à la main.
Reid.Atcheson
@ Reid.Atcheson: Eh bien, je dirais que pour les applications HPC parallèles, vous risquez de vous retrouver bien en dessous de l'efficacité maximale de 99% ... Et les types de vecteurs gcc font de l'utilisation d'intrinsèques un problème non problématique :)
Pedro
1
@Pedro, post brillant. Absolument brillant. Merci beaucoup d'avoir posté ça. Je viens de le trouver en fouillant au hasard dans des discussions intéressantes.
Enquête
16

De mes 15 années de réflexion sur les logiciels scientifiques: si votre code est 25% plus rapide parce que vous l'écrivez en Fortran, mais que vous l'écrivez 4 fois plus longtemps (pas de STL, difficulté à mettre en œuvre des structures de données complexes, etc.), alors Fortran gagne uniquement si vous passez une fraction importante de votre journée à tordre les pouces et à attendre que vos calculs soient terminés. Étant donné que, pour presque tous, le plus précieux est notre temps, voici la conclusion: utilisez le langage qui vous permet de développer, de déboguer et de tester votre code le plus rapidement possible, en ne tenant pas compte du fait que cela peut être plus lent que possible. vous l'avez écrit en Fortran.

Wolfgang Bangerth
la source
13

Mon approche a été d’utiliser le C ++ pour tout sauf les noyaux informatiques, qui sont généralement mieux écrits en assembleur; Cela vous permet d'acquérir toutes les performances de l'approche HPC traditionnelle, mais vous permet de simplifier l'interface, par exemple en surchargeant les noyaux informatiques tels que SGEMM / DGEMM / CGEMM / ZGEMM en une seule routine, par exemple Gemm. Il est clair que le niveau d'abstraction peut être beaucoup plus élevé en évitant les pointeurs bruts et en basculant vers des classes opaques, mais il s'agit d'une première étape intéressante.

Je trouve que le plus gros inconvénient du C ++ est en grande partie l'augmentation du temps de compilation, mais, d'après mon expérience, les économies de temps de développement compensent largement. Un autre inconvénient est que les compilateurs C ++ des fournisseurs ont tendance à avoir plus de bogues que les compilateurs C et Fortran. Au cours de la dernière année, je pense avoir rencontré près de dix bogues dans les compilateurs C ++.

Cela dit, je pense que la suppression des paquets scientifiques écrits dans des langages de bas niveau (et Fortran) est la réticence à exposer des interfaces pratiques pour des structures de données sophistiquées: la plupart des gens sont satisfaits de l’interface BLAS Fortran, car elle ne nécessite que les pointeurs et les dimensions principales pour décrire les matrices, mais peu de gens diraient que l'interface habituelle du résolveur Fortran à 40 unités de Fortran est plutôt pratique (cf. UHM, SuperLU, PETSc et Trilinos).

En résumé, je préconise l'utilisation d'assembly pour les noyaux de calcul de bas niveau, mais les langages de niveau supérieur pour tout le reste, en particulier lorsque vous utilisez des structures de données non triviales.

y:=αx+y

Jack Poulson
la source
2
Pourquoi ne pas faire confiance à un compilateur C standard avec l'optimisation appropriée activée pour compiler de petits noyaux? À ce niveau de taille et de complexité du code, la différence entre ce qu'un compilateur pourrait en tirer n'est pas claire.
Peter Brune
1
J'ai parlé à plusieurs personnes qui m'ont dit que, même avec un usage restreint approprié, leur Fortran était toujours plus rapide que leur code C et / ou C ++ pour certaines opérations, telles qu'une transposition matricielle explicite. Je ne dis pas qu'il est impossible de rendre le code C ou C ++ aussi rapide, mais que le compilateur Fortran a tendance à faire un meilleur travail.
Jack Poulson
J'ai la même expérience avec le mot clé "restrict" (mon code Fortran simple était toujours un peu plus rapide). Mais mon expertise est limitée et je n’ai simplement pas le temps d’investir dans la compréhension de l’assemblage généré à partir de gcc. Donc, j'utilise simplement Fortran, c'est simple et rapide.
Ondřej Čertík
@JackPoulson: L'argument du compilateur est quelque chose que j'entends assez souvent de la part de la communauté Fortran. Malheureusement, la plupart des compilateurs, par exemple gcc ou ifc / icc, utilisent des interfaces de langage différentes pour le même système d’interface. Les machines effectuant l'optimisation et la génération de code sont identiques et, par conséquent, les différences dans les résultats sont très probablement dues aux différences dans la familiarité du programmeur avec la langue sous-jacente ...
Pedro
1
Juste pour donner un aperçu de l’affirmation maintes fois répétée et rarement validée selon laquelle Fortran est plus rapide pour les noyaux numériques: deal.II. Le premier était écrit en Fortran 77, le second en C, sans utiliser le mot «restreindre». Les deux avaient environ 10-15 lignes de code. Aujourd'hui, Trilinos utilise le code extrait de deal.II. Je suis sûr que l'on peut trouver beaucoup de cas où F77 est plus rapide que C. Le fait est que ce n'est plus le cas aujourd'hui.
Wolfgang Bangerth
8

Depuis que je suis nouveau ici, je parcourais d’anciennes questions et j’ai trouvé celle-ci. Espérons que ce n'est pas tabou de répondre aux anciens!

Étant donné que personne d'autre n'a mentionné cela, j'ai pensé que je le ferais. Fortran 2003 est presque entièrement supporté par la plupart des grands compilateurs (intel, ibm, cray, NAG, PCG) et même par gcc avec la (bientôt) future version 4.7. Fortran 2003 (et 2008) est un langage orienté objet, bien qu'un peu plus détaillé que le C ++. Une des choses qui me plaisent à propos de Fortran est le fait que le comité standard considère le calcul scientifique comme son public principal (je remercie Damian Rouson de me l'avoir signalé l'autre jour).

Je soulève cette question non pas pour que les programmeurs C ++ deviennent des programmeurs Fortran, mais pour que les gens de Fortran sachent qu’ils disposent de davantage d’options, outre le passage au C ++ ou l’émulation de concepts orientés objet dans Fortran 90/95.

J'ajouterai une mise en garde: il y a un coût à être à la pointe de ce qui est implémenté dans les compilateurs. Si vous entreprenez actuellement un projet majeur dans Fortran 2003, vous rencontrerez des bogues et devrez continuellement mettre à jour votre compilateur (surtout si vous utilisez gcc), bien que cela se soit considérablement amélioré au cours des derniers mois!

Jeremy Kozdon
la source
7

Le problème avec C ++ est que vous avez de nombreuses chances de ruiner les performances, par exemple en utilisant aveuglément STL, des exceptions, des classes (surcharge virtuelle et problèmes d'alignement), une surcharge d'opérateurs (nouvelles suppressions / redondances) ou des modèles (compilation sans fin et erreurs cryptiques). semble bénigne, mais vous pouvez perdre des heures de cette façon).

Cependant, plus vous aurez un meilleur accès aux bibliothèques générales et éventuellement une plus grande visibilité de votre code (même si cela dépend fortement du champ et que vous avez toujours du C pur). Et vous pouvez toujours compenser le manque de flexibilité de Fortran en enveloppant son code dans un langage de script tel que R, Lush, Matlab / Scilab ou même Python, Ruby ou Lua.

mbq
la source
1
C'est généralement une mauvaise idée d'appliquer des techniques de bas niveau dans des langages de haut niveau. Par exemple, la STL est conçue pour fonctionner à un niveau très abstrait. Il faut savoir à quoi l’interface est destinée, l’utiliser pour cette tâche, puis s’éloigner des compilateurs.
Shuhalo
2
Je pense que les arguments de mbq et de Martin sont injustes. Oui, il existe des moyens de se tirer dans le pied si vous essayez d'implémenter un vecteur numérique à des fins d'algèbre linéaire en utilisant std :: list <double>. Mais c’est un argument idiot: au moins C ++ a une classe de liste chaînée que vous pouvez utiliser, contrairement à Fortran. C'est comme si on disait "Les voitures roulent à une vitesse si élevée que vous pourriez vous écraser contre un mur et vous blesser; vous devriez plutôt utiliser des calèches." C'est une idée idiote de supprimer un langage de haut niveau qui prend également en charge des éléments de bas niveau (par exemple, C ++) afin de disposer de fonctionnalités de haut niveau.
Wolfgang Bangerth
@WolfgangBangerth Non, maintenant vous faites du mal à Fortran - il s'agit d'un "niveau bas", car les bactéries sont "moins évoluées" que les humains. Si vous voulez une analogie avec une voiture, cela devrait ressembler davantage à "vous pouvez utiliser à la fois Jeep et Lexus pour traverser un marécage, mais le premier fait moins mal".
mbq
1
J'apprécie votre opinion, mais je maintiens que Fortran n'est pas aussi évolué que le C ++ :-)
Wolfgang Bangerth
7

Trois faits:

  • Matrices n-dimensionnelles de style F77 en C: pas de problème avec CnD (un plug éhonté, certes)

  • Le système de modules du F90 est mal conçu et hostile à la création d’environnements. (Le nom d'un module ne doit pas nécessairement correspondre à son nom de fichier, par exemple)

  • Fortran ne supporte pas bien la refactorisation. Pour extraire quelques fonctionnalités d'une fonction, vous devez toucher quatre emplacements: code réel, déclarations de variables, déclarations d'arguments et liste d'arguments. C se débrouille avec deux endroits à toucher. Cela aggrave l'effet de l'incapacité à bien gérer les données (décrit ci-dessous): Comme la modularité à petite échelle est si pénible, presque tout le monde écrit des sous-routines gigantesques.

Une impression personnelle:

  • Fortran ne fonctionne pas bien pour gérer les données. Essayez de renvoyer un pointeur sur une structure de données opaque pour l'utilisateur dans F77 ou F90. ( transfer(), nous voilà)
Andreas Klöckner
la source
Salut Andreas! CnD est intéressant, je ne le savais pas. Ah, tu l'as écrit. :) (f90 prend également en charge le découpage en tranches, pouvant être alloué pour des tableaux et surtout - syntaxe de tableau pour la multiplication, l'addition, etc.) J'utilise CMake avec Fortran et cela fonctionne très bien avec les modules. Qu'est-ce exactement qu'une "liste d'arguments"? Je ne pense pas les utiliser. Il suffit donc de 3 emplacements pour les modifier. En C, vous devez généralement modifier le code actuel, les paramètres et un fichier d’en-tête, donc c’est aussi 3 endroits (le plus certainement en C ++). Oui, transfer () n'est pas très agréable, mais en général, vous n'en avez pas besoin en pratique.
Ondřej Čertík
3
Le refactoring moderne fortran est trivial avec des IDE appropriés, comme Photran in eclipse.
2
"Le nom d'un module ne doit pas nécessairement correspondre à son nom de fichier, par exemple" Vous devez plaisanter, vous pouvez avoir plusieurs modules dans un seul fichier. Certaines ne couvrent que quelques lignes. Ils sont beaucoup plus faciles à créer si vous n’avez pas à créer un fichier pour chacun d’eux.
Vladimir F
1
Je voulais juste ajouter à ce que @ user389 a dit que, bien que Photran soit génial et qu'il soit le seul IDE Fortran à autoriser le refactorisation, son analyseur échoue constamment. D'autre part, il n'est pas nécessaire de commenter le fait qu'Eclipse a besoin de beaucoup de mémoire.
astrojuanlu
5

Fortran est optimisé pour les calculs matriciels / matriciels et constitue une tâche ardue pour tout type d’analyse de texte. C et C ++ peuvent ne pas correspondre à Fortran en informatique numérique (c'est proche), mais je trouve qu'il est beaucoup plus facile de traiter du texte et d'organiser des données (c'est-à-dire des structures de données personnalisées) avec C / C ++.

Comme d'autres l'ont mentionné, ne comptez pas les langages interprétés dynamiques (Python et autres). Ils n'offrent peut-être pas la vitesse de fonte du visage de Fortan, mais ils vous permettent de vous concentrer davantage sur la résolution de votre problème de calcul que sur tous les détails de la mise en œuvre. Vous pouvez souvent implémenter une solution en Python et, si les performances sont inacceptables, procéder à un profilage, identifier les zones à problèmes et optimiser ce code à l'aide de Cython ou réimplémenter le programme complet dans un langage compilé. Une fois que vous avez défini la logique de résolution de problèmes, le reste n’est qu’une implémentation et, avec une bonne compréhension des bases de l’informatique, il devrait être simple à représenter dans n’importe quel langage de programmation.

Daniel Standage
la source
C'est vrai. Pour l'analyse de texte, j'utilise également Python.
Ondřej Čertík
Vous pouvez également implémenter une partie d'un script Python dans un langage compilé, par exemple C ++, et le brancher. Par exemple, Boost Python, Swig etc.
Faheem Mitha
4

Je travaille actuellement dans l'un des laboratoires nationaux. La plupart des gens autour de moi sont des ingénieurs en mécanique. En discutant avec des membres des groupes HPC, ils travaillent principalement sous Linux et principalement en C ++. Le groupe dans lequel je suis actuellement fait principalement des applications de bureau et nous utilisons Windows et par ordre décroissant: C #, FORTRAN, Python, VBA et VB (6, pas .NET). Certains des moteurs de simulation que nous utilisons ont été écrits dans d'autres laboratoires nationaux de FORTRAN.

Tangurena
la source
4

Désolé de creuser un vieux fil, mais il semble que même en 2015, Fortran soit beaucoup utilisé.

Je viens de tomber sur cette liste ( lien alternatif ) qui contient en gros une liste de 13 codes approuvés par le centre OCLF du DOE pour fonctionner sur la machine Summit à 300 petaFLOPS qui sera mise à la disposition des chercheurs en 2018. J'ai essayé de trouver la langue principale utilisée pour le code (basé sur une recherche rapide sur Google) et voici ce que j'ai trouvé:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

Donc, sur 13 codes, au moins 10 (sur la base de ma recherche rapide) semblent être écrits en Fortran. Pas mal pour une langue de 50 ans.

NOTE: Je suis bien conscient que les comparaisons de langue sont inutiles, mais étant donné le nombre de personnes (spécialement les utilisateurs de C ++) qui utilisent Fortran de mauvaise bouche, j'ai pensé qu'il pourrait être utile de le mentionner.

Stali
la source
3
Je ne suis pas d'accord, parce que mon expérience aux laboratoires nationaux a plutôt été l'inverse. La plupart des nouveaux projets que je vois chez Lawrence Livermore sont écrits en C ++, et la plupart des nouvelles bibliothèques open source de pointe (ou maintenues activement) dans les solveurs ODE, les discrétisations FEM et les bibliothèques informatiques scientifiques à usage général. semblent être en C ou C ++. Fortran semble être principalement utilisé dans des projets utilisant des bibliothèques existantes / existantes; Je ne vois pas beaucoup de nouveaux grands projets utilisant Fortran, indépendamment de ce que je pense de la langue.
Geoff Oxberry
Certains codes de théorie de la densité fonctionnelle également écrits en Fortran incluent VASP et CASTEP , bien que, comme le souligne @ GeoffOxberry, les nouveaux projets ont peut-être tendance à passer au C ++.
dr.blochwave
@blochwave Comme vous pouvez le lire sur le lien, les projets concernent une nouvelle machine (avec accélérateurs, etc.) qui sera en ligne en 2018. Ce n'est donc pas comme s'ils prenaient un code de 25 ans et le compilaient dans l'espoir de fonctionner avec de bons performance. Je suis tout à fait sûr que de grandes parties des codes de la liste ci-dessus ont été ou ont été réécrites, comme dans le nouveau code. Un certain nombre de "nouveaux" codes climatiques sont également en vigueur à Fortran et utilisés par de nombreuses agences dans plusieurs pays.
Stali
0

Ce que Jack P. essaie de dire, c'est que vous devriez mélanger et assortir. Un bon logiciel est soigneusement mis en couches. Différentes couches peuvent correspondre plus naturellement ou plus efficacement à différentes langues. Vous devez choisir la langue la plus appropriée pour chaque couche. Vous devez également comprendre comment les langues peuvent interagir, ce qui peut affecter la langue que vous choisissez pour quel calque.

Une meilleure question est de savoir quels exemples de logiciels parfaitement conçus méritent d’être étudiés pour apprendre à concevoir des logiciels en couches.

Robert van de Geijn
la source