Lassen Sie mich versuchen, Ihre Anforderungen aufzuschlüsseln:
- Wartbarkeit
- Lesen / Schreiben von Textdaten
- Starke Schnittstellen / Fähigkeit für LU-Faktorisierungen
- Sparsame lineare Löser
- Leistung und Skalierbarkeit für große Datenmengen
Aus dieser Liste würde ich die folgenden Sprachen betrachten:
C, C ++, Fortran, Python, MATLAB, Java
Julia ist eine vielversprechende neue Sprache, aber die Community formiert sich immer noch darum herum und sie wurde in keinen größeren neuen Codes implementiert.
Lesen / Schreiben von Textdaten
Dies ist in jeder Programmiersprache leicht zu erreichen. Stellen Sie sicher, dass Sie Ihren E / A-Zugriff in geeigneter Weise puffern und zusammenführen, und dass alle Sprachen, die Sie berücksichtigen sollten, eine gute Leistung erbringen. Vermeiden Sie die Stream-Objekte in C ++, es sei denn, Sie wissen, wie Sie sie performant verwenden.
Starke Schnittstellen / Fähigkeit für LU-Faktorisierungen
Wenn Sie dichte LU-Faktorisierungen durchführen, sollten Sie LAPACK oder ScaLAPACK / Elemental für die parallele Funktionalität verwenden. LAPACK und ScaLAPACK sind in Fortran geschrieben, Elemental ist in C ++ geschrieben. Alle drei Bibliotheken sind performant und gut unterstützt und dokumentiert. Sie können aus jeder Sprache, die Sie berücksichtigen sollten, eine Schnittstelle zu ihnen herstellen.
Sparsame lineare Löser
Die führenden frei verfügbaren linearen Sparse-Löser sind fast alle über PETSc erhältlich , das in C geschrieben ist und gut dokumentiert und unterstützt wird. Sie können aus jeder Sprache, die Sie berücksichtigen sollten, eine Schnittstelle zu PETSc herstellen.
Leistung und Skalierbarkeit für große Datenmengen
Die einzigen Paradigmen für die parallele Programmierung, die Sie erwähnen, sind Shared Memory-basierte, was bedeutet, dass Sie keinen MPI-basierten Ansatz (Message-Passing) für die verteilte Speicherberechnung in Betracht ziehen. Nach meiner Erfahrung ist es mit einer Lösung mit verteiltem Speicher viel einfacher, Code zu schreiben, der weit über ein Dutzend Kerne skaliert. Fast alle "Universitätscluster" basieren heutzutage auf MPI, große Shared-Memory-Maschinen sind teuer und dementsprechend selten. Sie sollten MPI für Ihre Herangehensweise in Betracht ziehen, aber mein Rat gilt unabhängig von dem von Ihnen gewählten Programmierparadigma.
In Bezug auf die Leistung auf dem Knoten ist es in Fortran am einfachsten, eine gute serielle Leistung zu erzielen, wenn Sie selbst numerische Routinen schreiben. Wenn Sie ein wenig Erfahrung mit C, C ++ oder Python haben, können Sie eine sehr vergleichbare Leistung erzielen (C und C ++ sind sogar mit Fortran, Python und MATLAB innerhalb von 25% des Zeitaufwands ohne großen Aufwand tot). MATLAB tut dies durch einen JIT-Compiler und eine sehr gute lineare Algebra-Expressivität. Sie müssen wahrscheinlich entweder Cython, numpy, numexpr oder eingebettete numerische Kernel verwenden, um die beanspruchte Leistung von Python zu erhalten. Ich kann die Leistung von Java nicht kommentieren, da ich die Sprache nicht sehr gut kenne, aber ich vermute, dass es nicht weit von Pythons ist, wenn es von einem Experten geschrieben wird.
Ein Hinweis zu Schnittstellen
Ich hoffe, ich habe Sie überzeugt, dass Sie in jeder der von Ihnen in Betracht gezogenen Programmiersprachen alles tun können, was Sie wollen. Wenn Sie Java verwenden, sind die C-Schnittstellen eine kleine Herausforderung. Python bietet eine hervorragende Unterstützung für C- und Fortran-Interfaces durch ctypes, Cython und f2py. LAPACK ist bereits verpackt und über scipy erhältlich. MATLAB verfügt über alle Funktionen, die Sie in seinen nativen Bibliotheken benötigen, ist jedoch nicht leicht skalierbar oder auf Clustern besonders einfach auszuführen. Java kann C- und Fortran-Schnittstellen mit dem JNI unterstützen , ist jedoch nicht häufig in Clustern und in paralleler Software für wissenschaftliches Rechnen zu finden.
Wartbarkeit
Vieles davon hängt vom persönlichen Geschmack ab, aber der allgemeine Konsens über die Wartbarkeit besteht darin, dass Sie die Anzahl der Codezeilen in Ihrer Software minimieren, modularen Code mit genau definierten Schnittstellen schreiben und für Computersoftware bereitstellen möchten Tests, die die Richtigkeit und Funktionalität der Implementierung überprüfen.
Empfehlung
Ich persönlich hatte viel Glück mit Python und empfehle es für viele Computerprojekte. Ich denke, Sie sollten es für Ihr Projekt stark in Betracht ziehen. Python und MATLAB sind wahrscheinlich die ausdrucksstärksten Sprachen für das wissenschaftliche Rechnen. Sie können Python auf einfache Weise mit jeder anderen Programmiersprache verbinden. Mit f2py können Sie Ihre aktuelle Fortran-Implementierung verpacken und die gewünschten Teile in Python stückweise neu schreiben, während Sie sicherstellen, dass die Funktionalität erhalten bleibt. Zu diesem Zeitpunkt würde ich eine Kombination der offiziellen Python 2.7-Implementierung mit scipy empfehlen . Mit diesem Stack können Sie ganz einfach über die frei verfügbare Enthought Python Distribution loslegen .
Sie können das meiste auch in C, C ++ oder Fortran tun. C und C ++ sind sehr ansprechende Sprachen für professionelle Entwickler mit viel Erfahrung, stellen jedoch häufig neue Entwickler in Frage und sind in diesem Sinne wahrscheinlich keine gute Idee für einen akademischeren Code. Fortran und MATLAB sind im akademischen Bereich sehr beliebt, sie sind jedoch schwach in Bezug auf die erweiterten Datenstrukturen und die Expressivität, die Python bietet (denken Sie beispielsweise an ein Python-Diktat-Objekt).
Verwandte Fragen: