web-dev-qa-db-fra.com

Fortran vs C++, Fortran détient-il encore un avantage en analyse numérique ces jours-ci?

Avec le développement rapide des compilateurs C++, en particulier ceux d'Intel, et les capacités d'application directe des fonctions SIMD dans vos codes C/C++, Fortran possède-t-il encore un avantage réel dans le monde des calculs numériques?

Je viens d’un contexte de mathématiques appliquées, mon travail implique beaucoup d’analyses numériques, de calculs, d’optimisations et autres, avec une exigence de performance strictement définie.

Je ne connais presque rien de Fortran, j'ai une certaine expérience de C/CUDA/matlab (si vous considérez ce dernier comme un langage informatique pour commencer), et ma tâche quotidienne consiste à analyser de très grandes données (par exemple, une matrice de 10 Go), et il semble que le programme consacre au moins 2/3 de son temps à accéder à la mémoire (c’est pourquoi j’envoie une partie de son travail à GPU). Pensez-vous que cela pourrait en valoir la peine d’essayer la routine fortran au moins? une partie de mes codes critique pour améliorer les performances de mon programme?

Étant donné que la complexité et les tâches doivent être résolues, je ne vais pas m'engager dans cette routine si seulement les performances sont significativement améliorées, merci d'avance.

45
user0002128

Fortran utilise une sémantique stricte en termes de repliement par rapport au C++ et est optimisé pour les performances numériques depuis des décennies. Les algorithmes qui utilisent le processeur pour travailler avec des tableaux de données peuvent souvent bénéficier d'une implémentation Fortran.

La fusillade dans les langages de programmation ne doit pas être prise trop au sérieux, mais parmi les 15 points de repère, Fortran se classe n ° 1 pour la vitesse sur quatre d’entre eux (pour Intel Q6600 one core), plus que n’importe quel autre langage. Vous pouvez voir que les points de repère où brille Fortran sont ceux qui sont fortement numériques:

Contre-exemple:

  • k-nucléotide 500% plus lent (cette référence se concentre fortement sur des structures de données plus sophistiquées et le traitement des chaînes, ce qui n'est pas la force de Fortran)

Vous pouvez également voir une page de résumé " combien de fois plus lente " qui montre que parmi toutes les implémentations, le code Fortran est en moyenne le plus proche de l'implémentation la plus rapide pour chaque référence - bien que les barres de quantile soient beaucoup plus grandes que pour C++, ce qui indique que Fortran n'est pas adapté à certaines tâches pour lesquelles C++ est bon, mais vous devriez le savoir déjà.

Les questions que vous devrez vous poser sont donc les suivantes:

  1. Est-ce que la rapidité de cette fonction est si critique que sa réimplémentation dans Fortran vaut mon temps?

  2. La performance est-elle si importante que mon investissement dans l'apprentissage de Fortran sera rentable?

  3. Est-il possible d'utiliser une bibliothèque comme ATLAS au lieu d'écrire le code moi-même?

Répondre à ces questions nécessiterait une connaissance détaillée de votre base de code et de votre modèle d'entreprise. Je ne peux donc pas y répondre. Mais oui, les implémentations Fortran sont souvent plus rapides que les implémentations C++.

Un autre facteur dans votre décision est la quantité de code exemple et la quantité d'implémentations de référence disponibles. La longue histoire de Fortran signifie qu'il existe une multitude de codes numériques disponibles au téléchargement et même lors d'un voyage à la bibliothèque. Comme toujours, vous devrez passer au crible pour trouver les bonnes choses.

56
Dietrich Epp

La réponse complète et correcte à votre question est la suivante: "Oui, Fortran présente certains avantages". 

Le C++ présente également certains avantages différents. Il en va de même de Python, R, etc. Ce sont des langages différents. Il est plus facile et plus rapide de faire certaines choses dans une langue et d'autres dans d'autres. Tous sont largement utilisés dans leurs communautés, et pour de très bonnes raisons.

Toute autre chose, en l'absence de questions plus spécifiques, n'est que bruit et langue-guerre-appât, c'est pourquoi j'ai voté en faveur de la clôture de la question et j'espère que d'autres le feront aussi.

15
Jonathan Dursi

Il est également intéressant de noter que Fortran est beaucoup plus facile à maîtriser que C++. En fait, Fortran a une spécification de langue plus courte que celle de C et la syntaxe est sans doute plus simple. Vous pouvez le prendre très rapidement.

Ce qui signifie que si vous êtes seulement intéressé par l’apprentissage de C++ ou de Fortran pour résoudre un problème spécifique que vous avez actuellement (par exemple, pour accélérer les goulots d’étranglement dans quelque chose que vous avez écrit dans un langage de prototypage), Fortran pourrait vous offrir un meilleur retour sur investissement. .

7
saolof

Fortran est tout simplement naturellement adapté à la programmation numérique. Vous avez tendance à avoir un grand nombre de nombres dans de tels programmes, généralement des tableaux arrangés. Les tableaux sont des citoyens de première classe en Fortran et il est souvent assez simple de convertir les noyaux numériques de Matlab en Fortran . En ce qui concerne les avantages potentiels en termes de performances, voir les autres réponses, qui couvrent cela très bien. La ligne de base est probablement que vous pouvez créer des applications numériques très efficaces avec la plupart des langages compilés aujourd'hui, mais vous pouvez passer d'une boucle à l'autre pour y arriver. Fortran a été soigneusement conçu pour permettre au compilateur de reconnaître la plupart des emplacements pour des optimisations, en raison des fonctionnalités du langage. Bien sûr, vous pouvez également écrire du code lent et arbitraire avec n’importe quel langage compilé, y compris Fortran . Dans tous les cas, choisissez les outils qui conviennent. Fortran convient aux applications numériques, C convient au développement lié au système. Pour finir, apprendre les bases du Fortran n’est pas difficile et il est toujours utile de se pencher sur d’autres langues. Cela ouvre une vue différente sur les problèmes que vous souhaitez résoudre.

7
haraldkl

Le code Fortran est préférable pour les opérations de type matrice et vecteur en général. Mais vous pouvez également produire des performances similaires avec du code c/c ++ en transmettant des astuces/suggestions au compilateur afin de produire des instructions vectorielles de qualité similaire. Une option qui m'a donné un bon coup de pouce était de ne pas supposer de pseudonyme de mémoire entre les variables d'entrée qui sont des objets de type tableau. De cette façon, le compilateur peut effectuer de manière agressive un déroulage de boucle interne et un traitement en pipeline pour ILP, où il peut chevaucher des charges et stocker des opérations à travers une itération de boucle avec des prélèvements corrects.

0
Pari Rajaram