C ++ oder Python für die Entwicklung einer CFD-Bibliothek

13

Was würden Sie sagen, wären die Vor- / Nachteile zweier Ansätze zur Codierung einer allgemeinen Bibliothek (endliches Volumen, fem, dg) für Computational Continuum Mechanics? So sehe ich die Dinge im Moment. Bitte gib deine eigenen Erfahrungen an und flamme mich nicht für meine :):

1) C ++:

  • Generisches Programmieren, virtuelle Funktionen, Überladen, Geschwindigkeit ...: Alle verfügbaren Genreic + OOP-Tools, um alles zu erstellen, was Sie wollen

  • Meistens sind Bibliotheken auf niedriger Ebene verfügbar (keine weit verbreitete Entwicklung wissenschaftlicher und technischer Bibliotheken wie die für Python).

2) Python + Wrapper für Parallel Computing (pyOpenCL und andere)

  • riesige Menge an unterstützenden Bibliotheken verschiedener Art

  • Code, was Sie denken: Die Implementierung ist sehr schnell erledigt

  • langsamere Ausführungszeit

Wenn Sie ein Framework codieren möchten, das verschiedene Methoden unterstützt, mit komplexen Geometrien und Problemen arbeitet, welches würden Sie wählen und warum?

tmaric
quelle
1
Ich bin mit pyOpenCL nicht sehr vertraut, aber im Allgemeinen ist Python viel zu langsam für selbst mittelgroße Probleme in 2D oder 3D, es sei denn, Ihre rechnergestützten "Kernel" sind in einer einfachen Sprache (Fortran, C usw.) implementiert. )
David Ketcheson

Antworten:

14

Ich würde versuchen, das Beste aus beiden Welten herauszuholen und die "Benutzeroberfläche" (dh den Funktionsrahmen, den der Benutzer Ihrer Bibliothek aufruft, um die Geometrie und andere Eigenschaften des Problems zu beschreiben) in Python zu programmieren, um das Schnelle zu erreichen Bearbeitungszeit, dann schreiben Sie die Simulationslaufzeit in C ++.

Tatsächlich würde ich wahrscheinlich sogar die Simulationslaufzeit in Python verspotten und sie dann Stück für Stück durch C ++ - Code ersetzen. Möglicherweise können Sie in Betracht ziehen, dass Ihr Python-Code eine C ++ - Quelle generiert, die kompiliert und online mit Ihrer Laufzeit verknüpft wird, sodass die eigentliche Simulation überhaupt nicht in Python aufgerufen werden muss - sondern nur die Ergebnisse am Ende zurückgibt. Das Schöne an diesem Setup ist, dass es von Natur aus agil ist: Sie beginnen mit der schnellsten und einfachsten Arbeitslösung, Sie finden schnell heraus, was funktioniert und was nicht, und sobald Sie etwas haben, das Ihnen gefällt, können Sie es beschleunigen.

(So ​​funktioniert Maples ODE / DAE-Löser , außer dass Maple anstelle von Python verwendet wird. Vollständige Offenlegung: Ich arbeite für sie.)

Erik P.
quelle
1
+1. Eines der netten Teile von Python ist die Möglichkeit, sich bei Bedarf von "Pure Python" zu entfernen.
Fomite
3

Sie können Cython auch für Ihre Algorithmen verwenden. Es ist im Wesentlichen Python mit zusätzlichen Typinformationen für einige Variablen, die "schnell" sein müssen. Es übersetzt Python-Code in C-Code, der anschließend von Ihrem bevorzugten C-Compiler kompiliert werden kann. Durch vorsichtiges Hinzufügen dieser Typinformationen kann Ihr Code bis zu 150-mal schneller als naiver Python-Code sein.

Daniel Eberts
quelle
2

Ich denke, es gibt mehr zu dieser Frage. In erster Linie wird ein Entwickler in der Regel bevorzugen, was er / sie kennt, es sei denn, es ergeben sich erhebliche Vorteile (z. B. in Bezug auf Produktivität, Entwicklungszeit und Tools). Persönlich lege ich größten Wert darauf, produktiv zu sein (Zeit ist normalerweise die knappste Ressource!), Und dies begünstigt Entscheidungen, die meiner Erfahrungsbasis nahe kommen.

Vielleicht sind auch relevante zu berücksichtigen

3) Entwicklungszeit

  • Wie viel Zeit ist für die Entwicklung reserviert
  • Wann sollen die Ergebnisse der Arbeit geliefert werden? und wie?
  • Gibt es bereits einen Code, der die Arbeit erledigen kann? (Einzigartigkeit?)

4) Wartung

  • Wie viele (Personal-) Ressourcen werden für die Wartung aufgewendet?
  • Wie viele Leute sollen an dem Code arbeiten?
  • Wird der Code irgendwann veröffentlicht? (Kriterien?)
  • Verlässt sich der Code auf Bibliotheken von Drittanbietern?

5) Lizenzproblem

  • ist der Code für die Forschung?
  • ist der Code für kommerzielle Anwendungen?

6) Produktivität und Spaßfaktor (oft übersehen!)

  • Wo kann man am produktivsten sein?
  • Wo kann man am meisten Spaß am Entwickeln haben?
  • Möglichkeiten, Teil eines (sozialen) Netzwerks zu sein?
Allan P. Engsig-Karup
quelle
2

Dies hängt davon ab, ob Ihr Code wie folgt geschrieben werden kann:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

oder muss eher so geschrieben werden:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

Im ersten Fall wählen Sie aus, was Sie am liebsten einkodieren möchten. Verwenden Sie im zweiten Fall keine Skriptsprache und bereiten Sie sich nicht auf die Ausführungszeit vor.

mbq
quelle
2

Als Folge von Allans Antwort (dass Ihre eigene Entwicklerzeit die wertvollste Ressource ist): Verwenden Sie, was andere bereits getan haben. Sie sagen, Sie möchten eine Bibliothek für die Computerkontinuumsmechanik entwickeln, aber es gibt bereits einige, die so groß sind, dass sie fast immer bereits alles haben, was Sie benötigen. Sehen Sie sich deal.II zum Beispiel für alles an, was als Finite-Elemente-Problem geschrieben werden kann, OpenFOAM für Fluiddynamik oder PyCLAW / CLAWPACK für hyperbolische Probleme. deal.II fordert Sie zum Beispiel auf, in C ++ zu programmieren, aber in Wirklichkeit ist der Programmiergrad oft so hoch, dass man sagen könnte, es sei eine domänenspezifische Sprache für FEM-Codes mit C ++ - Syntax.

Wolfgang Bangerth
quelle
2
Ich bin noch nie auf eine Bibliothek gestoßen, die alles hatte, was ich brauchte ...
Jack Poulson
Nun, aber Sie verstehen, was ich denke. Einige Bibliotheken haben "fast alles", was Sie benötigen. Um nur ein Beispiel zu nennen, das mir besonders vertraut ist: Ein Finite-Elemente-Löser für vollständig selbstanpassende 3D-Netze, die auf über 10.000 Prozessoren mit deal.II- und PETSc 126-Codezeilen ausgeführt werden. Das ist eindeutig mehr als null, aber es ist in der Tat eine sehr kleine Zahl angesichts der Komplexität dessen, was sich unter der Haube befindet.
Wolfgang Bangerth
Um Devil's Advocate zu spielen, ist es trivial, einen Code auf 10.000 Kernen auszuführen, aber es ist eine ganz andere Sache, ihn skalierbar zu machen. Nicht viele parallele Vorkonditionierer für nicht-elliptische Gleichungen können sogar mit 300 Kernen effizient ausgeführt werden.
Jack Poulson
Sicher. Das angeführte Beispiel ist jedoch skalierbar: math.tamu.edu/~bangerth/publications/2010-distributed.pdf .
Wolfgang Bangerth
Im Interesse der vollständigen Offenlegung: Ich bin einer der Autoren des oben genannten Papiers und Codes sowie der deal.II-Bibliothek im Allgemeinen.
Wolfgang Bangerth