Effizienz bei der Verwendung von Jewsc4py im Vergleich zu c / c ++ / fortran

11

Wie viel langsamer ist Haustierec4py vs c / c ++ / fortran?

Mir ist klar, dass dies erheblich vom ausgeführten Code abhängt, aber was ist mit etwas Einfachem wie einem Matrix-Vektor-Produkt?

Andrew Spott
quelle

Antworten:

11

Dies ist ein weit verbreitetes Anliegen in der wissenschaftlichen Programmiergemeinschaft, und ich würde die Leistungsunsicherheit als einen der wichtigsten "Mythen" in der Computerwissenschaft betrachten.

Wie @fcruz erläutert, petsc4pyhandelt es sich um einen Wrapper für die PETSc-Bibliotheken, nicht um eine Neuimplementierung von PETSc in Python. Daher können Sie erwarten, dass Leistungseinbußen entweder durch das Kopieren von Arrays nach und von PETSc oder durch Overhead in Ihren Treibercode- / Funktionsaufrufen entstehen. petsc4pywird sehr sorgfältig umgesetzt, und solange Sie das verstehennumpyBei mehrdimensionalen Array-Schnittstellen können Sie den Kopieraufwand vermeiden. In den meisten Anwendungsfällen, in denen ich arbeite, liegt der Leistungsverlust bei der Arbeit in Python in der Größenordnung von 10 bis 40%, und ich gewinne häufig auf andere Weise erheblich, die diesen Leistungseinbruch mehr als wettmachen. Tatsächlich sind mehrere erfahrene HPC Python-Entwickler, mit denen ich gesprochen habe, der Meinung, dass dieser Leistungsunterschied normalerweise noch weiter reduziert werden kann, und wenn Python rechenintensive Codes steuert, wird dies sicherlich der Fall sein.

Das petsc4pyRepository selbst enthält eine Reihe nützlicher Beispiele, um den Kompromiss zwischen Leistung und Flexibilität zu veranschaulichen. Suchen Sie im petsc4pyQuell-Repository nach der aufgerufenen Demo perftest, die ein nichtlineares Gleichungssystem mit einem Python-Treiber und einem C-Treiber (über einen App.f90in diesem Verzeichnis bereitgestellten Fortran-Kernel ) löst . Der Leistungsaufwand liegt hier in der Größenordnung von 10%.

Als konkretes Beispiel bin ich Teil eines Wissenschaftlerteams, das an PyClaw arbeitet , einem Softwarepaket, das in PETSc für das parallele Netzmanagement und Fortran-Kernel zur Lösung von Riemann-Problemen an Zellschnittstellen integriert ist. Wir haben die Leistungsverschlechterung durch die Umstellung von einem Fortran-Treiber ziemlich sorgfältig untersucht. Die Ergebnisse finden Sie unten auf Seite 5 in Tabelle 1 im Konferenzpapier . In unserem Fall haben wir ein wenig On-Core-Leistung gegen die Fähigkeit eingetauscht, unseren Code einfach mit PETSc und Fortran zu verbinden und parallel auf Zehntausenden von Kernen effizient zu laufen.

Aron Ahmadia
quelle
Ich habe auch ein ähnliches Problem mit einem kleinen unstrukturierten Code. PETSc stellt nur die Datenstrukturen und Löser bereit, aber ich muss noch das Netz (bis zu 4 GB Eingabedatei) einlesen, partitionieren, Zuordnungen erstellen, die Elemente durchlaufen, lokale (Element-) Steifheitsmatrizen usw. berechnen, bevor PETSc zusammensetzen und lösen kann . Wäre Python nicht langsamer für dieses nicht PETSc-bezogene Material, insbesondere für E / A, Zuordnungen und Berechnungen auf Elementebene? Weil der Rest des Codes sowieso einfach ist.
stali
Die Berechnungen auf Elementebene werden normalerweise als Kernel übergeben (siehe App.f90Quelle in perftest). Es gibt keinen Leistungsunterschied bei der E / A. Haben Sie sich bei FEniCS nach einem übergeordneten Paket umgesehen ?
Aron Ahmadia
Du hast recht. Ich habe die Idee, aber in meinem speziellen Fall gibt es viele solcher Kernel (Formfunktionen für verschiedene Arten von Elementen, Berechnungen auf Elementebene, Zuordnungen usw.), die ungefähr 90% des Codes ausmachen. Ich habe mir Fenics vor einiger Zeit angesehen und viele Details wie der Umgang mit externen Maschen und das Auferlegen von BCs usw. waren auf den ersten Blick nicht ganz klar oder scheinen (zumindest für mich) komplizierter zu sein. Außerdem verwende ich Fortran, das (aufgrund der hervorragenden PETSc-Dokumentation) für Nicht-CS-Leute wie mich recht einfach zu verwenden ist. Ich finde es eigentlich einfacher als Python :) für meine Arbeit.
stali
7

Petsc4py ist nur ein weiterer Weg, um auf PETSc zuzugreifen, aber von Python aus , oder es ist dasselbe zu sagen, dass Petsc4py die Bindungen bereitstellt, sodass Sie von Python aus auf PETSc-Datenstrukturen und -Routinen zugreifen können, die den Aufwand für die Entwicklung paralleler PDE-Löser verringern sollen (diese Skala).

PETSc bietet seinen Lösern mehrere Abstraktionsebenen, und Sie können sogar PETSc verwenden, um Ihren eigenen Löser zu implementieren. Auf der niedrigsten Ebene der Software-Abstraktion verwendet PETSc BLAS, LAPACK und MPI und wird bestenfalls so schnell wie die Implementierung dieser sein.

Jetzt verwendet Haustiere4py Cython, um die Bindungen an PETSc zu implementieren. Der Aufwand für die Verwendung von Cython hängt davon ab, wie viel Berechnungen mit PETSc durchgeführt werden. Wenn Sie die High-Level-PDE-Löser von PETSc verwenden, sollte der Overhead so gering sein, dass Sie sich keine Sorgen machen müssen.

Eine vielleicht wichtigere Frage als der Leistungsvergleich von PETSc mit GEMV ist, ob PETSc das richtige Werkzeug für Ihren Job ist. Wenn Sie nicht triviale parallele PDE-Löser implementieren müssen, hilft Ihnen PETSc höchstwahrscheinlich wirklich. Wenn Sie jedoch eine Reihe von GEMV ausführen müssen, möchten Sie eine BLAS-Bibliothek. Viel Glück!

fcruz
quelle