Ma question concerne les performances de Java par rapport au code compilé, par exemple C++/fortran/assembly dans les applications numériques hautes performances. Je sais que c'est un sujet controversé, mais je cherche des réponses/exemples spécifiques. Aussi wiki de la communauté. J'ai déjà posé des questions similaires, mais je pense que je l'ai formulé de façon générale et que je n'ai pas obtenu les réponses que je cherchais.C/C++ versus Java/C# dans les applications hautes performances
La multiplication matricielle matricielle double précision, communément appelée dgemm dans la bibliothèque blas, est capable d'atteindre des performances crêtes CPU de près de 100% (en termes d'opérations flottantes par seconde).
Il y a plusieurs facteurs qui permettent d'atteindre cette performance:
blocage du cache, pour atteindre la localisation de mémoire maximale boucle
déroulant pour réduire au minimum le contrôle frais généraux
instructions vectorielles, telles que SSE
pré-chargement de la mémoire
garantie pas de mémoire aliasing
J'ai vu beaucoup de repères en utilisant l'assemblage, C++, Fortran, Atlas, fournisseur BLAS (cas typiques sont la matrice de dimension 512 et au-dessus). D'autre part, j'ai entendu dire que les langages/implémentations compilés en octets de principe tels que Java peuvent être rapides ou presque aussi rapides que les langages compilés en machine. Cependant, je n'ai pas vu de repères précis montrant qu'il en est ainsi. Au contraire, il semble (de ma propre recherche) que les langages compilés sont beaucoup plus lents.
Avez-vous de bons benchmarks de multiplication matricielle matricielle pour Java/C#? est-ce que le compilateur juste-à-temps (implémentation réelle, pas hypothétique) est capable de produire des instructions qui satisfont les points que j'ai listés?
Merci
en ce qui concerne la performance: chaque CPU a des performances de pointe, en fonction du nombre de processeur instructions peut exécuter par seconde. Par exemple, un processeur Intel 2 ghz moderne peut atteindre 8 milliards de double précision ajouter/multiplier par seconde, ce qui donne 8 gflops de performance maximale. Matrix matrice multiplier est l'un des algorithmes qui est capable d'atteindre une performance presque complète en ce qui concerne le nombre d'opérations par seconde, la raison principale étant un ratio plus élevé de calcul sur les opérations de la mémoire (N^3/N^2)
. Numéros Je suis intéressé par quelque chose sur la commande N > 500
. En ce qui concerne la mise en œuvre: des détails de niveau supérieur tels que le blocage est effectué au niveau du code source. L'optimisation de niveau inférieur est gérée par le compilateur, peut-être avec des indications de compilateur en ce qui concerne l'alignement/alias. La mise en œuvre compilée en octets peut également être écrite en utilisant une approche par bloc, de sorte qu'en principe, les détails du code source pour une mise en œuvre décente seront très similaires.
Je peux écrire du code en Java qui utilise 100% du CPU - même sans rien faire de sens ;-) Je suppose que je comprends ce que vous voulez vraiment dire, mais votre phrasé est un peu ambigu. –
Toujours pas beaucoup plus clair pour moi ... voulez-vous dire qu'il y a une sorte de "idéal" qui stipule que pour une architecture CPU donnée la meilleure performance numérique imaginable est telle et telle, et c'est ce que vous appelez 100 pour cent? Y aurait-il une mesure concrète comme MFLOPS pour cela? Je ne suis pas un expert dans ce domaine. –
Je n'ai pas voté pour fermer cet article (je n'ai même pas encore le droit). Je trouve cela intéressant, essayant seulement de vous donner des commentaires pour clarifier votre message. –