Laissez-moi essayer de décomposer vos besoins:
- Maintenabilité
- Lecture / écriture de données textuelles
- Interfaces / capacités solides pour les factorisations LU
- Solveurs linéaires clairsemés
- Performances et évolutivité aux données volumineuses
À partir de cette liste, je considérerais les langues suivantes:
C, C ++, Fortran, Python, MATLAB, Java
Julia est une nouvelle langue prometteuse, mais la communauté se forme toujours autour d'elle et elle n'a été déployée dans aucun nouveau code majeur.
Lecture / écriture de données textuelles
C'est facile à obtenir dans n'importe quel langage de programmation. Assurez-vous que vous mettez correctement en mémoire tampon et fusionnez votre accès d'E / S, et vous obtiendrez de bonnes performances dans toutes les langues que vous devriez considérer. Évitez les objets de flux en C ++ à moins de savoir comment les utiliser de manière performante.
Interfaces / capacités solides pour les factorisations LU
Si vous effectuez des factorisations LU denses, vous souhaiterez utiliser LAPACK ou ScaLAPACK / Elemental pour une fonctionnalité parallèle. LAPACK et ScaLAPACK sont écrits en Fortran, Elemental est écrit en C ++. Les trois bibliothèques sont performantes et bien prises en charge et documentées. Vous pouvez vous y connecter à partir de n'importe quelle langue que vous devriez considérer.
Solveurs linéaires clairsemés
Les premiers solveurs linéaires clairsemés disponibles gratuitement sont presque tous disponibles via PETSc , écrit en C, qui est bien documenté et pris en charge. Vous pouvez vous connecter à PETSc à partir de n'importe quelle langue que vous devriez considérer.
Performances et évolutivité aux données volumineuses
Les seuls paradigmes de programmation parallèle que vous mentionnez sont basés sur la mémoire partagée, ce qui signifie que vous n'envisagez pas une approche informatique basée sur MPI (passage de messages) et à mémoire distribuée. D'après mon expérience, il est beaucoup plus facile d'écrire du code qui évolue bien au-delà d'une douzaine de cœurs à l'aide d'une solution de mémoire distribuée. Presque tous les «clusters» universitaires sont basés sur MPI de nos jours, les grandes machines à mémoire partagée sont chères et, par conséquent, rares. Vous devriez considérer MPI pour votre approche, mais mes conseils s'appliqueront quel que soit le paradigme de programmation que vous choisissez.
En ce qui concerne les performances sur le nœud, si vous écrivez vous-même des routines numériques, il est plus facile d'obtenir de bonnes performances en série dans Fortran. Si vous avez un peu d'expérience en C, C ++ ou Python, vous pouvez obtenir des performances très comparables (C et C ++ sont morts-même avec Fortran, Python et MATLAB arrivent dans un délai d'environ 25% sans trop d'effort). MATLAB le fait grâce à un compilateur JIT et une très bonne expressivité d'algèbre linéaire. Vous devrez probablement utiliser les noyaux numériques Cython, numpy, numexpr ou incorporés pour obtenir les performances revendiquées de Python. Je ne peux pas commenter les performances de Java, car je ne connais pas très bien le langage, mais je soupçonne qu'il n'est pas loin de Python s'il est écrit par un expert.
Une note sur les interfaces
J'espère que je vous ai convaincu que vous allez pouvoir faire tout ce que vous voulez dans n'importe quel langage de programmation que vous envisagez. Si vous utilisez Java, les interfaces C seront un peu difficiles. Python a une excellente prise en charge des interfaces C et Fortran via ctypes, Cython et f2py. LAPACK est déjà emballé et disponible via scipy. MATLAB possède toutes les fonctionnalités dont vous avez besoin dans ses bibliothèques natives, mais n'est pas facilement évolutif ou particulièrement facile à exécuter sur des clusters. Java peut prendre en charge les interfaces C et Fortran avec le JNI , mais n'est pas communément trouvé sur les clusters et dans les logiciels parallèles pour le calcul scientifique.
Maintenabilité
Une grande partie de cela va se résumer à une saveur personnelle, mais le consensus général sur la maintenabilité est que vous voulez minimiser le nombre de lignes de code dans votre logiciel, écrire du code modulaire avec des interfaces bien définies, et pour les logiciels de calcul, fournir des tests qui vérifient l'exactitude et la fonctionnalité de l'implémentation.
Recommandation
J'ai personnellement eu beaucoup de chance avec Python et je le recommande pour de nombreux projets de calcul. Je pense que vous devriez le considérer sérieusement pour votre projet. Python et MATLAB sont probablement les langages les plus expressifs disponibles pour le calcul scientifique. Vous pouvez facilement interfacer Python avec n'importe quel autre langage de programmation, vous pouvez utiliser f2py pour encapsuler votre implémentation Fortran actuelle et réécrire morceau par morceau les parties que vous souhaitez en Python tout en vérifiant que vous maintenez la fonctionnalité. Pour le moment, je recommanderais une combinaison de l'implémentation officielle de Python 2.7 avec scipy . Vous pouvez commencer très facilement avec cette pile à partir de la distribution Enthought Python disponible gratuitement .
Vous pouvez également effectuer la plupart de ces opérations en C, C ++ ou Fortran. Le C et le C ++ sont des langages très attrayants pour les développeurs professionnels avec beaucoup d'expérience, mais ils tripotent fréquemment les nouveaux développeurs et ne sont probablement pas en ce sens une bonne idée pour un code plus académique. Fortran et MATLAB sont populaires en calcul académique, mais sont faibles au niveau des structures de données avancées et de l'expressivité qu'offre Python (pensez à un objet dict Python, par exemple).
Questions connexes: