Déjame intentar y desglosar tus requisitos:
- Mantenibilidad
- Leer / escribir datos de texto
- Interfaces fuertes / capacidad para factorizaciones LU
- Solucionadores lineales dispersos
- Rendimiento y escalabilidad a datos grandes
De esta lista, consideraría los siguientes idiomas:
C, C ++, Fortran, Python, MATLAB, Java
Julia es un nuevo lenguaje prometedor, pero la comunidad todavía se está formando a su alrededor y no se ha implementado en ningún código nuevo importante.
Leer / escribir datos de texto
Esto es fácil de entender en cualquier lenguaje de programación. Asegúrese de almacenar y fusionar adecuadamente su acceso de E / S, y obtendrá un buen rendimiento de cualquiera de los idiomas que debe considerar. Evite los objetos de flujo en C ++ a menos que sepa cómo usarlos de manera eficaz.
Interfaces fuertes / capacidad para factorizaciones LU
Si está realizando factorizaciones LU densas, querrá usar LAPACK o ScaLAPACK / Elemental para la funcionalidad paralela. LAPACK y ScaLAPACK están escritos en Fortran, Elemental está escrito en C ++. Las tres bibliotecas son eficaces y están bien respaldadas y documentadas. Puede interactuar con ellos desde cualquiera de los idiomas que debe considerar.
Solucionadores lineales dispersos
Los principales solucionadores lineales dispersos disponibles gratuitamente están casi todos disponibles a través de PETSc , escrito en C, que está bien documentado y respaldado. Puede interactuar con PETSc desde cualquiera de los idiomas que debe considerar.
Rendimiento y escalabilidad a datos grandes
Los únicos paradigmas de programación paralelos que menciona son basados en memoria compartida, lo que significa que no está considerando un enfoque de computación de memoria distribuida basada en MPI (transmisión de mensajes). En mi experiencia, es mucho más fácil escribir código que se escala mucho más allá de una docena de núcleos utilizando una solución de memoria distribuida. Casi todos los "clústeres" universitarios están basados en MPI en estos días, las grandes máquinas de memoria compartida son caras y, en consecuencia, raras. Debería considerar MPI para su enfoque, pero mi consejo se aplicará independientemente del paradigma de programación que elija.
Con respecto al rendimiento en el nodo, si está escribiendo rutinas numéricas usted mismo, es más fácil obtener un buen rendimiento en serie en Fortran. Si tiene un poco de experiencia en C, C ++ o Python, puede obtener un rendimiento muy comparable (C y C ++ están muertos, incluso con Fortran, Python y MATLAB tienen una sobrecarga de tiempo del 25% sin mucho esfuerzo). MATLAB hace esto a través de un compilador JIT y muy buena expresividad de álgebra lineal. Es probable que necesite usar núcleos numéricos Cython, numpy, numexpr o incrustar para obtener el rendimiento reclamado de Python. No puedo comentar sobre el rendimiento de Java, porque no conozco muy bien el lenguaje, pero sospecho que no está lejos de Python si está escrito por un experto.
Una nota sobre interfaces
Espero haberte convencido de que podrás hacer todo lo que quieras en cualquiera de los lenguajes de programación que estás considerando. Si está utilizando Java, las interfaces C serán un poco desafiantes. Python tiene una excelente compatibilidad con la interfaz C y Fortran a través de ctypes, Cython y f2py. LAPACK ya está envuelto y disponible a través de scipy. MATLAB tiene toda la funcionalidad que necesita en sus bibliotecas nativas, pero no es fácilmente escalable o particularmente fácil de ejecutar en clústeres. Java puede soportar interfaces C y Fortran con el JNI , pero no se encuentra comúnmente en clústeres y en software paralelo para computación científica.
Mantenibilidad
Mucho de esto se reducirá al gusto personal, pero el consenso general sobre la capacidad de mantenimiento es que desea minimizar la cantidad de líneas de código en su software, escribir código modular con interfaces bien definidas y, para el software computacional, proporcionar pruebas que verifican la corrección y la funcionalidad de la implementación.
Recomendación
Yo personalmente he tenido mucha suerte con Python y lo recomiendo para muchos proyectos computacionales. Creo que deberías considerarlo fuertemente para tu proyecto. Python y MATLAB son probablemente los lenguajes más expresivos disponibles para la computación científica. Puede conectar fácilmente Python con cualquier otro lenguaje de programación, puede usar f2py para ajustar su implementación actual de Fortran y reescribir pieza por pieza las partes que desee en Python mientras verifica que mantiene la funcionalidad. En este momento, recomendaría una combinación de la implementación oficial de Python 2.7 con scipy . Puede comenzar fácilmente con esta pila desde la distribución de Enthought Python disponible gratuitamente .
También podría hacer la mayor parte de esto en C, C ++ o Fortran. C y C ++ son lenguajes muy atractivos para desarrolladores profesionales con mucha experiencia, pero con frecuencia tropiezan con nuevos desarrolladores y, en este sentido, probablemente no sean una gran idea para un código más académico. Fortran y MATLAB son populares en computación académica, pero son débiles en las estructuras de datos avanzadas y la expresividad que ofrece Python (piense en un objeto dict Python, por ejemplo).
Preguntas relacionadas: