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?
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, petsc4py
handelt 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. petsc4py
wird sehr sorgfältig umgesetzt, und solange Sie das verstehennumpy
Bei 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 petsc4py
Repository selbst enthält eine Reihe nützlicher Beispiele, um den Kompromiss zwischen Leistung und Flexibilität zu veranschaulichen. Suchen Sie im petsc4py
Quell-Repository nach der aufgerufenen Demo perftest
, die ein nichtlineares Gleichungssystem mit einem Python-Treiber und einem C-Treiber (über einen App.f90
in 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.
App.f90
Quelle inperftest
). Es gibt keinen Leistungsunterschied bei der E / A. Haben Sie sich bei FEniCS nach einem übergeordneten Paket umgesehen ?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!
quelle