Skuteczność używania Petsc4py vs. C / C ++ / Fortran

11

O ile wolniej jest Petsc4py vs C / C ++ / Fortran?

Zdaję sobie sprawę, że będzie to w znacznym stopniu zależeć od wykonywanego kodu, ale co z czymś prostym, takim jak produkt macierz-wektor?

Andrew Spott
źródło

Odpowiedzi:

11

Jest to szeroko rozpowszechniony problem społeczności naukowców zajmujących się programowaniem naukowym i uważam, że niepewność wyników jest jednym z głównych „mitów” w nauce obliczeniowej.

Jak dyskutuje @fcruz , petsc4pyjest to opakowanie bibliotek PETSc, a nie ponowna implementacja PETSc w Pythonie. W związku z tym można oczekiwać, że wszelkie kary związane z wydajnością będą wynikać z kopiowania tablic do i z PETSc, lub z nakładów na wywołania kodu / funkcji sterownika. petsc4pyjest bardzo starannie wdrażany i tak długo, jak rozumiesznumpywielowymiarowe interfejsy tablicowe, można uniknąć narzutu kopiowania. W większości przypadków użycia, w których pracuję, spadek wydajności w pracy w Pythonie jest rzędu 10-40%, i często zyskuję znacznie na inne sposoby, które więcej niż rekompensują to uderzenie wydajności. W rzeczywistości kilku bardziej doświadczonych programistów HPC Python, z którymi rozmawiałem, uważa, że ​​tę różnicę wydajności można zwykle jeszcze bardziej zmniejszyć, a kiedy Python generuje drogie obliczeniowo kody, z pewnością tak będzie.

Samo petsc4pyrepozytorium zawiera szereg użytecznych przykładów ilustrujących kompromis między wydajnością a elastycznością. Poszukaj w petsc4pyrepozytorium źródłowym demo o nazwie perftest, która rozwiązuje nieliniowy układ równań przy użyciu zarówno sterownika Python, jak i sterownika C (na jądrze Fortran podanym App.f90w tym katalogu). Narzut wydajności jest tutaj rzędu 10%.

Jako konkretny przykład, jestem częścią zespołu naukowców pracujących nad PyClaw , pakietem oprogramowania, który łączy się z PETSc do zarządzania równoległą siecią i starszych jąder Fortran do rozwiązywania problemów Riemanna na interfejsach komórkowych. Przeprowadziliśmy dość dokładne badanie obniżenia wydajności po przełączeniu ze sterownika Fortran, a wyniki można zobaczyć na dole strony 5 w Tabeli 1 w dokumencie konferencyjnym . W naszym przypadku wymieniliśmy trochę wydajności na rdzeń, aby móc łatwo połączyć nasz kod z PETSc i Fortranem i działać wydajnie równolegle na dziesiątkach tysięcy rdzeni.

Aron Ahmadia
źródło
Mam również podobne obawy związane z małym nieustrukturyzowanym kodem. PETSc zapewnia tylko struktury danych i solvery, ale wciąż muszę czytać w siatce (do 4 GB pliku wejściowego), partycjonować, tworzyć odwzorowania, zapętlać elementy, obliczać lokalne macierze sztywności (elementów) itp. Zanim PETSc będzie mógł złożyć i rozwiązać . Czy Python nie działałby wolniej w przypadku tych rzeczy niezwiązanych z PETSc, szczególnie operacji we / wy, mapowań i obliczeń na poziomie elementu. Ponieważ reszta kodu i tak jest prosta.
stali
Obliczenia na poziomie elementu są zwykle przekazywane jako jądro (patrz App.f90źródło w perftest). Nie ma różnicy w wydajności we / wy. Czy szukałeś pakietu FEniCS dla pakietu wyższego poziomu?
Aron Ahmadia
Masz rację. Rozumiem, ale w moim konkretnym przypadku istnieje wiele takich jąder (funkcje kształtu dla różnych typów elementów, obliczenia poziomu elementów, odwzorowania itp.), Co stanowi około 90% kodu. Spojrzałem kiedyś na Fenicsa i wiele szczegółów, takich jak radzenie sobie z zewnętrznymi siatkami i nakładanie BC itp., Nie były całkiem jasne na pierwszy rzut oka lub wydają się bardziej skomplikowane (przynajmniej dla mnie). Poza tym używam Fortrana, który jest dość prosty w użyciu (biorąc pod uwagę doskonałą dokumentację PETSc) dla osób spoza CS, takich jak ja. W mojej pracy jest to dla mnie łatwiejsze niż Python :).
stali
7

Petsc4py to po prostu inny sposób na uzyskanie dostępu do PETSc, ale z Pythona , lub to samo powiedzieć, że Petsc4py zapewnia powiązania, dzięki czemu z Pythona można uzyskać dostęp do struktur danych i procedur PETSc, które mają zmniejszyć wysiłek związany z opracowaniem równoległych solverów PDE (ta skala).

PETSc zapewnia kilka poziomów abstrakcji dla swoich solverów, a nawet możesz użyć PETSc do implementacji własnego solvera. Na najniższym poziomie abstrakcji oprogramowania PETSc używa BLAS, LAPACK i MPI, a co najwyżej będzie tak szybkie, jak ich wdrożenie.

Teraz Pets4py używa cytonu do implementacji powiązań z PETSc. Narzut związany z używaniem cytonu zależy od tego, ile obliczeń należy wykonać z PETSc. Jeśli używasz solverów PDE wysokiego poziomu z PETSc, koszty ogólne powinny być na tyle małe, że nie musisz się o nie martwić.

Być może ważniejsze pytanie niż porównanie wydajności PETSc z GEMV dotyczy tego, czy PETSc jest właściwym narzędziem do pracy. Jeśli potrzebujesz zaimplementować nietrywialne równoległe solwery PDE, najprawdopodobniej PETSc naprawdę ci pomoże. Jeśli jednak potrzebujesz zrobić kilka GEMV, potrzebujesz biblioteki BLAS. Powodzenia!

fcruz
źródło