(Wie) schreibe ich Simulationen, die schneller laufen?


16

Ich habe begonnen, Python als Programmiersprache für alle meine Aufgaben in CFD zu verwenden. Ich habe sehr wenig Erfahrung in der Programmierung. Ich komme aus dem Maschinenbau und studiere Luft- und Raumfahrttechnik.

Manchmal wird der Rechenaspekt von CFD langwieriger als das Manipulieren der Gleichungen oder das Berechnen.

Welche allgemeinen Richtlinien beschleunigen die Ausführung unseres Programms? Was sind die Tricks, um Dinge parallel zu machen? Wie schreibe ich die Codes, die schneller laufen?

Woher bekomme ich Ressourcen (für einen Laien wie mich leicht verständlich), die die obigen Fragen beantworten?



@ Dan, das glaube ich nicht. Ich bitte um 'jede' mögliche Ressource, die zum Verständnis einer neuen Programmiertaktik beiträgt. Ich habe keine besonderen Anforderungen oder Bedingungen. Insbesondere frage ich nach den Ressourcen, die dazu beitragen, Codes eleganter zu gestalten.
Subodh

Sind Sie auf Python fixiert oder würden Sie C ++ in Betracht ziehen? In diesem Fall würde ich zwei Dinge vorschlagen: C ++ lernen, eine Open Source-Bibliothek finden (in meinem Fall OpenFOAM), Dinge nicht von Grund auf neu entwickeln, sondern lernen, einen fortgeschrittenen Teil des Codes durchforsten, seinen Aspekt kennen lernen, ändern und Experimentieren, alle mit einem bestimmten Zweck angetrieben: in Ihrem Fall zB aerodynamische Simulationen.
Tmaric

@ tomislav-maric, vielen dank. Ich bin kein strenger Pythonist. Tatsächlich habe ich als Neuling auf dem Gebiet viele Optionen vor mir. Ich lerne auch OpenFOAM. Daher stimme ich Ihrer Meinung zu, dass man anfangen und lernen sollte, an einem Projekt zu arbeiten (oder sich kurz die Hände schmutzig zu machen), und genau das sollte ich tun! Danke.
Subodh

@smj Übrigens, ich komme auch von einem Maschinenbauunternehmen und bin jetzt ein Doktorand in Computerwissenschaften (Maschinenbau hat mich NICHT darauf vorbereitet) ... Wenn Sie mit OF arbeiten, suchen Sie nach dem C ++ - Buch Liste auf Stapelüberlauf und fange an zu lernen. Sie benötigen 3 Dinge: C ++, OpenFOAM und Kenntnisse aus der Informatik. OpenFOAM und Computerwissenschaften können auf dendritische Weise erlernt werden: Finden Sie eine Aufgabe und erledigen Sie sie, indem Sie nach Ihren Wünschen lernen. Etwas fertig zu haben wird dich motivieren. Wie für C ++: Beginnen Sie mit dem C ++ - Primer und lernen Sie es. Viel Glück! :)
tmaric

Antworten:


19

Ich werde versuchen, Ihre Frage zu beantworten, da Sie speziell nach Python fragen. Ich werde meine eigene Methode zur Lösung eines Simulationsproblems beschreiben. Strategien für schnellere Simulationen werden in dieser Beschreibung angegeben.

Zuerst habe ich neue Simulationen in Python erstellt. Natürlich versuche ich, NumPy und SciPy so weit wie möglich zu nutzen. Während NumPy einen geeigneten Array-Datentyp für numerische Simulationen bietet, bietet SciPy umfangreiche numerische Routinen, die mit NumPy-Arrays arbeiten.

Sobald die Prototypen mehr oder weniger funktionieren, versuche ich herauszufinden, welche Teile des Programms oder Skripts den Engpass darstellen. Dafür gibt es typische Kandidaten:

  • Loops in Python sind langsam. Sehr langsam.
  • Da Python die Eingabe von Enten verwendet , kann der Aufruf von Funktionen langsam sein.

Ich benutze eine einfache Profilierungsstrategie, um zu erfahren, wo die gesamte Laufzeit verbracht wird. Mit der IPython- Shell (die ich nicht genug empfehlen kann) starte ich mein Skript mit

%timeit script.py

Dieser "magische Befehl" führt die Profilerstellung (unter Verwendung von timeit ) für Sie durch und zeigt Ihnen eine Liste mit Zeiten an, zu denen Ihr Skript beendet wurde. Verwenden Sie diese Liste, um herauszufinden, wo Ihr Code zu langsam ist.

Sobald Sie die Teile festgelegt haben, die beschleunigt werden müssen, können Sie die Verwendung kompilierter Sprachen in Betracht ziehen. Ich werde auf zwei Lösungen hinweisen.

Zunächst gibt es die Cython- Sprache. Cython ist eine Programmiersprache, die Python sehr ähnlich ist (tatsächlich ist Python-Code oft auch gültiger Python-Code). Der Cython-Compiler konvertiert die Cython-Dateien jedoch in C-Code, der dann in ein von Python verwendbares Modul kompiliert werden kann. Cython versteht NumPy-Arrays. Cython kann Ihnen auf zwei Arten helfen: Erstens können Sie Datentypen einführen. Dadurch werden Funktionsaufrufe beschleunigt. Wenn Sie über Arrays iterieren, wird Ihre Schleife schneller ausgeführt (wenn Sie sowohl die Dummy-Variable als auch das Array eingeben, erhalten Sie eine einfache C-Schleife!). Zweitens laufen in meinen Experimenten sogar die untypisierten Skripte etwas schneller, da sie kompiliert und nicht interpretiert werden.

Die andere kompilierte Sprache, die für Sie nützlich sein wird, ist Fortran. Es gibt verschiedene Möglichkeiten, Fortran mit Python zu verwenden ( f2py , fortwrap , Cython ). Da f2py für mich persönlich der einfachste Weg zu sein scheint, beschreibe ich kurz, was es tut. f2py kann Fortran-Code für Python-Module kompilieren. Damit können Sie NumPy-Arrays als Eingabe- und Ausgabevariablen aus dem Python-Raum verwenden. Im Fortran-Raum sind dies gewöhnliche Fortran-Arrays. Sie können diese mit voller Fortran-Geschwindigkeit bedienen.

Ich persönlich benutze Cython eher dort, wo die Anzahl der Funktionsaufrufe der Engpass ist. Für schleifenlastige Sachen bevorzuge ich f2py (vielleicht weil ich einen starken Fortran-Hintergrund habe).

Ein weiterer Hinweis zu Fortran: Das moderne Fortran liest und schreibt sehr ähnlich wie NumPy - die Syntax ist sehr eng. Dies macht es einfach, NumPy-Code in Fortran-Code zu konvertieren.

Beachten Sie, dass sowohl Cython als auch f2py in gewisser Weise Paralleismus unterstützen. Für Cython, finden Sie Hilfe finden hier , während für Fortran, da die Standardtechniken wie sind OpenMP oder MPI. Darüber hinaus gibt es auch P ython-Wrapper für MPI . Ich persönlich benutze mpi4py auf Python-Ebene sowie OpenMP in Fortran.

Lassen Sie mich ein bisschen Literatur empfehlen: das Buch Python Scripting For Computational Science von H.-P. Langtangen ist eine großartige Ressource für Python im Allgemeinen sowie für Strategien, um Python ein bisschen schneller zu machen. Leider erwähnt AFAIR nichts über Cython. Als zweite Ressource können Sie sich diese Folien ansehen . Diese geben Beispiele für alles, was ich in diesem Beitrag erwähnt habe (siehe auch den Code und die Quellen hier ). Es gibt viele andere gute Folien im Internet.

Wenn Sie spezielle Fragen haben, helfen wir Ihnen gerne weiter!


1
Weitere Informationen zu Python-Profilern finden Sie in den scipy-Vorlesungen zur Codeoptimierung .
Denis

7

Für CFD + Python gibt es eine Lösung: http://pythonflu.wikidot.com/ Dies sind Python-Bindungen über OpenFOAM (die bereits in den Kommentaren zu den Fragen erwähnt wurden). Diese Bindungen ermöglichen die Programmierung auf "Löserebene" (es gibt Beispiele, bei denen ursprüngliche OpenFOAM-Löser in Python repliziert werden und nicht langsamer als die Originale sind - die in einer anderen Antwort erwähnten langsamen Schleifen sind hier kein Problem, da die "inneren Schleifen" auftreten im C ++ - Code von OpenFOAM).

Der Vorteil dieser Bindungen ist auch, dass die gesamte Parallelisierung in OpenFOAM unterhalb der Solver-Ebene stattfindet, sodass Sie sich nicht damit befassen müssen (ebenso wie mit den anderen Dingen, die der OpenFOAM-Kern erledigt: Eingabe / Ausgabe, linearer Löser, Operator-Diskretisierung)

Wenn Sie also nur einen neuen Solver schreiben möchten und keine neuen Funktionen zum OF-Core hinzufügen möchten (Randbedingungen, linearer Solver usw.), ist PythonFlu möglicherweise ausreichend für Sie und Sie können C ++ vermeiden (das eine viel höhere Lernheilung aufweist als C ++) Python)

PS: wollte dies ursprünglich als Kommentar zur Diskussion der ursprünglichen Frage hinzufügen, aber mein Ruf lässt dies nicht zu


Hallo Bernhard! Willkommen bei Scicomp! :)
tmaric
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.