72 votes

Performances F # en informatique scientifique

Je suis curieux de savoir comment F# performance se compare aux performances de C++? J'ai posé une question similaire en ce qui concerne Java, et j'ai eu l'impression que Java n'est pas adapté pour les fortes numbercrunching.

J'ai lu que le F# est censé être plus évolutif et plus performant, mais comment est ce monde réel, de performance se compare à C++? questions spécifiques au sujet de la mise en œuvre actuelle sont:

  • Comment bien se faire à virgule flottante?
  • Elle permet de vecteur instructions
  • la gentillesse est-elle vers une optimisation de les compilateurs?
  • Quelle est l'ampleur de la mémoire pied d'impression a-t-elle? Elle permet un contrôle plus fin sur la mémoire de la localité?
  • a-t-elle la capacité pour la distribution de la mémoire des processeurs, par exemple Cray?
  • de quoi dispose-t-il qui peuvent être d'intérêt pour les sciences informatiques, où de fortes certain nombre de traitement est impliqué?
  • Y sont réels calcul scientifique implémentations qui l'utilisent?

Merci

62voto

Jon Harrop Points 26951

Je suis curieux de savoir comment F# performance se compare aux performances de C++?

Varie énormément en fonction de l'application. Si vous faites une vaste utilisation des complexes de structures de données dans un programme multi-threadé, puis F# est susceptible d'être une grande victoire. Si la plupart de votre temps est consacré au serrés numérique des boucles de la mutation des tableaux puis C++ peut être 2-3 fois plus rapide.

Étude de cas: Ray-traceur Mon test ici utilise une arborescence hiérarchique, l'abattage et numérique rayon de la sphère d'intersection de code pour générer une image de sortie. Cette référence est vieux de plusieurs années et le code C++ a été améliorée et des dizaines de fois au fil des ans et il est lu par des centaines de milliers de personnes. Don Syme chez Microsoft a réussi à écrire un F# de mise en œuvre qui est légèrement plus rapide que le plus rapide en C++ code lors de la compilation avec MSVC et parallélisée en utilisant OpenMP.

J'ai lu que le F# est censé être plus évolutif et plus performant, mais comment est ce monde réel, de performance se compare à C++?

Le développement de code est beaucoup plus facile et plus rapide avec F# qu'en C++, et cela s'applique à l'optimisation ainsi que la maintenance. Par conséquent, lorsque vous démarrez l'optimisation d'un programme de la même quantité d'effort permet d'obtenir beaucoup plus de gains de performances si vous utilisez F# au lieu de C++. Cependant, F# est un langage de niveau plus élevé et, par conséquent, des lieux un plafond moins élevé sur les performances. Donc, si vous avez le temps infini pour passer l'optimisation de vous devrait, en théorie, toujours être en mesure de produire plus vite, le code en C++.

C'est exactement le même avantage que le C++ n'a plus de Fortran et Fortran avait plus de main-écrit en assembleur, bien sûr.

Étude de cas: décomposition QR C'est une de base de la méthode numérique de l'algèbre linéaire fourni par les bibliothèques comme LAPACK. La référence LAPACK mise en œuvre est de 2077 lignes de Fortran. J'ai écrit un F# mise en œuvre en vertu de 80 lignes de code qui permet d'atteindre le même niveau de performance. Mais l'implémentation de référence n'est pas rapide: vendeur à l'écoute des implémentations comme Intel Math Kernel Library (MKL) sont souvent 10x plus rapide. Remarquablement, j'ai réussi à optimiser mon code F# bien au-delà de la performance de l'Intel de mise en œuvre en cours d'exécution sur Intel, tout en gardant mon code sous 150 lignes de code et entièrement générique (il peut traiter de simple et double précision, et complexe, et même symbolique matrices!): pour le grand mince matrices mon code F# est jusqu'à 3 fois plus rapide que le processeur Intel MKL.

Notez que la morale de cette étude de cas n'est pas que vous devriez vous attendre de votre F# pour être plus rapide que le vendeur à l'écoute des bibliothèques, mais, plutôt, que même les experts comme Intel va manquer productif de haut niveau optimisations si ils n'utilisent que le faible niveau de langues. Je soupçonne d'Intel optimisation numérique experts ne sont pas d'exploiter le parallélisme entièrement parce que leurs outils, il est extrêmement lourd alors que F# en fait sans effort.

Comment bien se faire à virgule flottante?

La Performance est similaire à la norme ANSI C, mais certaines fonctionnalités (par exemple, les modes d'arrondi) n'est pas disponible .NET.

Elle permet de vecteur instructions

Pas de.

la gentillesse est-elle vers l'optimisation des compilateurs?

Cette question n'a pas de sens: F# est un propriétaire .NET de langue de Microsoft avec un simple compilateur.

Quelle est l'ampleur de la mémoire pied d'impression a-t-elle?

Une application vide utilise 1.3 Mo ici.

Elle permet un contrôle plus fin sur la mémoire de la localité?

Mieux que la plupart de la mémoire-safe langues, mais pas aussi bon que C. Par exemple, vous pouvez unbox structures de données arbitraires dans F# en les représentant comme des "structures".

a-t-elle la capacité pour les processeurs à mémoire distribuée, par exemple Cray?

Dépend de ce que tu veux dire par "capacité". Si vous pouvez l'exécuter .NET sur Cray vous pouvez vous servir de la transmission de message en F# (tout comme le prochain de la langue), mais F# est destiné principalement pour les ordinateurs de bureau multicœur machines x86.

de quoi dispose-t-il qui peuvent être d'intérêt pour les sciences informatiques, où de fortes certain nombre de traitement est impliqué?

La mémoire de la sécurité signifie que vous n'obtenez pas de segmentation des défauts et des violations d'accès. Le soutien pour le parallélisme .NET 4 est bon. La possibilité d'exécuter du code à la volée via le F# session interactive dans Visual Studio 2010 est extrêmement utile pour les techniques interactives de l'informatique.

Y sont réels calcul scientifique implémentations qui l'utilisent?

Nos produits commerciaux pour le calcul scientifique en F#, qui ont déjà plusieurs centaines d'utilisateurs.

Cependant, votre ligne de remise en question indique que vous pensez de calcul scientifique à haute performance de calcul (par exemple, Cray) et non interactifs techniques de l'informatique (par exemple, MATLAB, Mathematica). F# est prévu pour le second.

43voto

Tomas Petricek Points 118959

En plus de ce que les autres ont dit, il y a un point important à propos de F# et c'est le parallélisme. La performance de l'ordinaire F# code est déterminé par le CLR, bien que vous pouvez être en mesure d'utiliser LAPACK de F# ou vous pouvez être en mesure de faire des appels natifs à l'aide de C++/CLI dans le cadre de votre projet.

Cependant, bien conçu, fonctionnel programmes ont tendance à être beaucoup plus facile à paralléliser, ce qui signifie que vous pouvez facilement obtenir des performances par l'utilisation de Processeurs multi-cœurs, qui sont certainement à la disposition de vous si vous faites des calculs scientifiques. Voici quelques liens utiles:

Concernant le calcul distribué, vous pouvez utiliser n'importe quel calcul distribué cadre qui est disponible pour les .NET plate-forme. Il y a un MPI.NET le projet, qui fonctionne bien avec F#, mais vous pourriez aussi être en mesure d'utiliser DryadLINQ, qui est un MSR projet.

40voto

Joh Points 1788
  • F# n'virgule flottante calcul plus rapide que la .NET CLR permet. Pas beaucoup de différence à partir de C# ou autre .NET languages.
  • F# ne permet pas de vecteur d'instructions par lui-même, mais si votre CLR a une API pour ces, F# ne devrait pas avoir de problèmes pour l'utiliser. Voir, par exemple, Mono.
  • Autant que je sache, il n'existe qu'un compilateur F# pour le moment, donc peut-être que la question devrait être "quel est le compilateur F# quand il s'agit de l'optimisation?". La réponse est dans tous les cas "potentiellement aussi bon que le compilateur C#, probablement un peu pire à l'heure actuelle". Notez que F# diffère, par exemple, le C# dans son soutien à l'in-lining au moment de la compilation, ce qui permet potentiellement à code plus efficace qui s'appuient sur les médicaments génériques.
  • La mémoire des empreintes de F# programmes sont semblables à celles des autres .NET languages. Le degré de contrôle que vous avez sur l'allocation et la collecte des ordures est le même que dans d'autres .NET languages.
  • Je ne sais pas à propos de l'appui pour mémoire distribuée.
  • F# a de très jolies primitives pour traiter les données à plat des structures, par exemple des tableaux et des listes. Regardez par exemple sur le contenu de la Matrice de module: carte, map2, mapi, iter, plier, zip... les Tableaux sont très populaires dans le calcul scientifique, je suppose en raison de leur soi bonne localité de mémoire propriétés.
  • Pour le calcul scientifique packages à l'aide de F#, vous voudrez peut-être chercher à ce que Jon Harrop est en train de faire.

16voto

Robert Harvey Points 103562

Comme avec toutes les langues/les comparaisons de performances, votre kilométrage dépend de la façon dont vous pouvez faire du code.

F# est un dérivé de OCaml. J'ai été surpris de découvrir qu'OCaml est beaucoup utilisé dans le monde de la finance, où de nombreux calculs de performances est très important. J'ai été plus surpris de découvrir qu'OCaml est l'un des plus rapides des langues, avec des performances à la hauteur avec le plus rapide des compilateurs C et C++.

F# est construit sur la CLR. Dans le CLR, le code est exprimé dans une forme de pseudo-code binaire appelé Common Intermediate Language). En tant que tel, il bénéficie de l'optimisation des capacités de l'équipe, et a des performances comparables à C# (mais pas nécessairement en C++), si le code est bien écrit.

CIL code peut être compilé en code natif dans une étape distincte préalablement à l'exécution en utilisant la génération d'Images Natives (NGEN). Cela accélère tous les logiciels que les CIL-à-compilation native n'est plus nécessaire.

Une chose à considérer est que les langages fonctionnels comme F# bénéficier d'une plus déclaratif style de programmation. Dans un sens, vous avez plus de spécification de la solution dans des langages tels que C++, ce qui limite la capacité du compilateur d'optimiser. Plus de programmation déclarative style peut théoriquement donner le compilateur d'autres occasions pour les algorithmes d'optimisation.

9voto

Yin Zhu Points 10438

Ça dépend de quel genre de calcul scientifique que vous faites.

Si vous faites de l' traditional heavy computing, par exemple, l'algèbre linéaire, diverses optimisations, alors vous ne devriez pas mettre votre code dans .Net framework, au moins ne convient pas en F#. Parce que c'est à l'algorithme de niveau, la plupart des algorithmes doivent être codées dans un des langages impératifs, d'avoir de bonnes performances en temps d'exécution et l'utilisation de la mémoire. D'autres ont mentionné parallèle, je dois dire que c'est probablement inutile quand tu fais le faible niveau des trucs comme parallèle une SVD mise en œuvre. Parce que, quand vous savez comment en parallèle une SVD, vous ne pourront tout simplement pas utiliser un haut niveau de langues, Fortran, C ou modification de C(par exemple, cilk) sont vos amis.

Cependant, beaucoup de scientifiques de l'informatique d'aujourd'hui n'est pas de ce genre, qui est une sorte de haut niveau applications, par exemple pour le calcul statistique et de data mining. Dans ces tâches, en plus de l'algèbre linéaire, ou de l'optimisation, il y a aussi beaucoup de flux de données, IOs, avenante, faire des graphiques, etc. Pour ces tâches, F# est vraiment puissant, par sa concision, fonctionnelle, de la sécurité, facile à parallèles, etc.

Comme d'autres l'ont mentionné, .Net bien supporte appel de Plate-forme, fait assez peu de projets à l'intérieur de MS sont utilisation .Net et P/Invoke ensemble à l'amélioration de la performance dans le goulot de la bouteille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X