Od autorów
PETSc
(Portable, Extensible Toolkit for Scientific computation)
jest biblioteką procedur służących do rozwiązywania zagadnień powstałych
w wyniku dyskretyzacji równań różniczkowych cząstkowych, rozwijaną od początku
lat 90-tych przez
B.Smith'a
i in. w
Argonne National Laboratory (USA).
Programy używające PETSc mogą działać na wielu architekturach, od komputerów
osobistych, po masywnie równoległe maszyny używające standardu
MPI (Message Passing Interface).
PETSc jest przeznaczone dla naukowców zajmujących się
scientific computing,
jest też bardzo przydatne dla tworzenia i testowania własnych algorytmów
rozwiązywania równań cząstkowych. Na przykład, przez ostatni rok z powodzeniem
stosowaliśmy PETSc do testowania nowych metod dekompozycji obszaru oraz
do rozwiązywania równań Naviera-Stokesa i mikropolarnych. Naszym zdaniem,
PETSc ma wiele zalet sprawiających, że warto korzystać z tego pakietu.
Co znajdziemy w pakiecie PETSc?
Pakiet daje zbiór narzędzi służących do rozwiązywania
zagadnień algebraicznych o dużym rozmiarze, zwłaszcza powstałych w wyniku
dyskretyzacji równań różniczkowych cząstkowych. Poza wszystkim innym, PETSc
jest także po prostu dobrą i bogatą biblioteką procedur numerycznych, opartych
na takich standardach jak
BLAS
i
LAPACK. Wśród funkcji oferowanych
przez PETSc znajdują się gotowe i przetestowane procedury rozwiązywania
wielkich układów:
-
równań liniowych, metodami bezpośrednimi i iteracyjnymi;
-
równań nieliniowych metodami typu Newtona;
-
równań różniczkowych zwyczajnych metodami wielokrokowymi.
Wszystkie te procedury są niezależne od faktycznie
używanych struktur danych. PETSc zorientowana jest na usprawnienie procesu
tworzenia dużych aplikacji numerycznych działających na komputerach równoległych,
dlatego w pakiecie znajdziemy:
-
procedury wysokiego poziomu, służące do manipulacji obiektami w rodzaju
wektor, macierz, itp., niezależne od tego, czy pracujemy na komputerze
sekwencyjnym, czy równoległym (to bardzo wygodne dla programisty!)
-
dostęp do procedur niskiego poziomu do precyzyjnego zarządzania rozproszeniem
danych pomiędzy procesorami, sposobu komunikacji, itd.
Wszystkie procedury związane z przetwarzaniem
równoległym są oparte na powszechnie uznanym standardzie MPI, zaimplementowanym
na większości obecnie używanych komputerów równoległych i stacji roboczych.
Przy tworzeniu kolejnych wersji biblioteki PETSc
aktywnie uczestniczyli (i uczestniczą!) jej użytkownicy. Dlatego PETSc
nie zapomina o wygodzie programisty i oferuje najrozmaitsze udogodnienia
przydatne podczas uruchamiania aplikacji:
-
zmianę parametrów i używanych metod bezpośrednio z linii komend;
-
przyjazne przeglądarki do generowanych obiektów np. macierzy lub wektorów;
-
system śledzenia (profiling) obliczeń zmiennoprzecinkowych i wykorzystania
pamięci;
-
rozległe możliwości wyłapywania błędów (debugging)
-
środowisko graficzne.
Dlaczego warto poznać PETSc?
Już omówienie zawartości pakietu sugeruje, że
jest ona całkiem smakowita. Obecnie skoncentrujemy się na omówieniu typów
aplikacji, gdzie użycie PETSc może przynieść istotne korzyści.
Optymalizacja pracy programistycznej
Tworzenie dużych aplikacji, a takimi są najczęściej solvery równań różniczkowych
cząstkowych, jest żmudne i czasochłonne. Stosowanie dobrych bibliotek prowadzi
do bardziej zwartego kodu i oszczędza programiście pisania procedur znanych
od dawna (w rodzaju metody gradientów sprzężonych). Wiadomo także, iż optymalizacja
kodu na zadaną architekturę komputera jest trudna - wymaga specjalistycznej
wiedzy i wielkiej praktyki - i prowadzi najczęściej do utraty przenośności
kodu na inne architektury. Te problemy potęgują się (a nawet rosną wykładniczo
szybko...) z chwilą, gdy nasz program ma dobrze działać na maszynie wieloprocesorowej
(poza samą trudnością programowania, a następnie testowania i odpluskwiania
programu, musimy także zadbać o komunikację, dystrybucję danych pomiędzy
procesory i dobrą skalowalność). Biblioteka PETSc w pewnym stopniu uwalnia
użytkownika od martwienia się o kodowanie (efektywnych) podstawowych solverów
i obiektów. To pozwala skupić się na właściwym algorytmie i jego optymalizacji.
Pamiętajmy także, że ostateczną miarą rzeczywistej
efektywności użytej metody rozwiązania danego problemu jest czas i koszt
działania komputera plus czas i koszt pisania programu!
Eksperymenty numeryczne
Nawet użycie sekwencyjnej wersji PETSc, działającej na zwykłej stacji roboczej
lub pececie, może być pożyteczne. Na przykład, jeżeli (z jakichkolwiek
powodów) chcemy porównać kilka metod iteracyjnych rozwiązywania dyskretnego
liniowego równania eliptycznego, to korzystając z PETSc jedyną trudną czynnością
będzie konstrukcja macierzy sztywności i wektora prawej strony. Cała reszta
jest już w pakiecie, w dodatku przyjemna w użyciu.
Często, badając nowe algorytmy dla równań cząstkowych
chcielibyśmy przeprowadzić eksperymenty, porównujące nasz algorytm z innymi
dostępnymi. Łatwo to osiągnąć używając PETSc, ze względu na mnogość zaimplementowanych
solverów i łatwość dodawania własnych, oraz możliwości profilingu: możemy
zbadać nie tylko liczbę iteracji, ale także wymagania pamięciowe, koszt
obliczeń, itp. Co więcej, prowadząc eksperymenty możemy szybko weryfikować
w praktyce pewne hipotezy.
Równoległość
Nie istnieje coś takiego jak prosta w implementacji aplikacja równoległa.
Architektury masywnie równoległe bardzo istotnie różnią się między sobą
i zazwyczaj wymagają od programu dużego dopasowania do własnych możliwości.
Ponadto, programując taką maszynę musimy w jakiś sposób zdecydować, jak
podzielić zadania między procesory oraz jak (i kiedy) je między sobą komunikować.
Są to, niestety, detale dość niskiego poziomu (bliskie sprzętu), będące
przyczyną wielu koszmarów dręczących tzw. zwykłych użytkowników maszyn
równoległych (np. numeryków, którzy oczywiście chcieliby pisać algorytmy
równoległe, ale na wyższym poziomie abstrakcji niż "spakuj tablicę 10
liczb zmiennoprzecinkowych i wyślij do procesora nr 0". Każdy więc
krok w stronę tworzenia procedur wysokiego poziomu dla naukowych obliczeń
równoległych jest pożądany.
Jednym z istniejących rozwiązań jest język Fortran
90 oraz tworzony obecnie standard HPF.
Fortran 90 w części zwalnia użytkownika od myślenia o równoległości, albowiem
to kompilator może decydować, kiedy urównoleglić jakąś prostą operację.
Tak na przykład działa kompilator F90 na Connection
Machine CM-200. Podobne podejście stosuje np. Cray, gdzie jest dostępny
tzw. zrównoleglacz kodu, dopisujący w programie odpowiednie dyrektywy dla
kompilatora, powodujące wykorzystanie przetwarzania wektorowego lub równoległego.
Innym rozwiązaniem, jak sądzimy, bardziej elastycznym,
jest wykorzystanie popularnego standardu MPI (Message Passing Interface)
razem z "klasycznymi" językami programowania, takimi jak C czy Fortran.
Właśnie ten drugi wariant wybrali autorzy PETSc, opierając na nim swoją
implementację. PETSc daje z jednej strony dużo stosunkowo łatwych w użyciu
narzędzi pozwalających na programowanie algorytmów równoległych bez potrzeby
zagłębiania się w detale komunikacji między procesorami, itp. Z drugiej
zaś strony, użytkownik wciąż może (jeśli chce) odzyskać pełną kontrolę
nad realizacją przetwarzania równoległego i używać bezpośrednio funkcji
standardu MPI.
Kiedy nie warto stosować PETSc?
Na pewno nie warto stosować PETSc do "małych"
problemów. Wtedy lepiej skorzystać z
Matlab'a
lub
Maple'a, czy nawet napisać własną
procedurę. PETSc
musi być pakietem zorientowanym na konkretny typ
zagadnień (wielkie układy pochodzące z dyskretyzacji równań cząstkowych
na maszynach równoległych), aby zachować balans pomiędzy efektywnością
a użytecznością. Ostatecznie, nie będziemy przecież używać superkomputera
do odwrócenia macierzy 2x2...
Wydaje się nam także, iż raczej nie warto używać
PETSc do zadań algebry liniowej z macierzami "gęstymi" (nawet dużego wymiaru).
Lepiej skorzystać bezpośrednio z optymalizowanych bibliotek numerycznych,
zazwyczaj dostarczanych przez producenta razem z superkomputerem, albo
korzystać wprost z BLASów lub procedur LAPACKa czy ScaLAPACKa.
W końcu, wymieńmy parę wad PETSc. Zazwyczaj użycie
PETSc prowadzi do wygenerowania kodu wynikowego o sporej objętości. Jest
to problem, ale z drugiej strony, nawet najmniejszy program w PETSc daje
nam wciąż dostęp do jej funkcjonalności i np. licznych procedur wychwytujących
błędy. Również szybkość działania niektórych procedur zostawia trochę do
życzenia. Poważną wadą PETSc jest dość stroma krzywa uczenia się: nie sposób
zacząć programować w PETSc bez zapoznania się z manualem, a ten z kolei
nie jest niestety najłatwiejszą lekturą...
Dlaczego i dla kogo napisaliśmy ten podręcznik?
Zachęceni przez prof.
M.Dryję,
używamy PETSc od ponad roku. Jak wspomnieliśmy, lektura oficjalnego
manuala
[2] nie jest zbyt przyjemna. Ponadto,
niektóre istotne kwestie są w
manualu potraktowane skrótowo lub
w ogóle pominięte. Wymagało to od nas eksperymentowania, przeglądania kodów
z przykładami (PETSc przychodzi z zestawem ponad 100 przykładowych programów
i pełnym zbiorem kodów źródłowych!) i badania sposobu implementacji konkretnych
rozwiązań. Przyznajemy, że czwórka głównych autorów PETSc wykonała gigantyczną
pracę (same kody źródłowe zajmują ok. 5 MB), a dostępne
man pages
[3] dla wszystkich funkcji i obiektów
PETSc są satysfakcjonujące. Tylko dzięki temu oraz bezpośredniemu kontaktowi
z autorami pakietu mogliśmy przebrnąć przez stromą drogę początkowej nauki
PETSc, aby teraz móc cieszyć się jej funkcjonalnością i bogactwem, i aby...
uczyć się dalej!
Niniejszy podręcznik ma na celu po pierwsze -
zainteresowanie tym nowoczesnym i wygodnym pakietem szerszego grona studentów,
a także osób zajmujących się obliczeniami naukowymi/eksperymentami numerycznymi
w Polsce, a po drugie - oszczędzenie początkującemu użytkownikowi PETSc
mozolnego przegryzania się przez oficjalny manual i man pages:
ułatwienie wstępnego zapoznania się z pakietem i szybkie (w miarę bezbolesne)
umożliwienie mu rozpoczęcia pisania własnych programów wykorzystujących
PETSc.
Adresujemy go przede wszystkim do tych osób, które
chcą prowadzić eksperymenty numeryczne w dziedzinie równań różniczkowych
cząstkowych typu eliptycznego, liniowych bądź nieliniowych. Dlatego ograniczyliśmy
się wyłącznie do wersji sekwencyjnej PETSc, kwestiom równoległości poświęcając
jedynie kilka komentarzy i uwag. Mimo to i tak objętość niniejszego podręcznika
dorównuje blisko połowie objętości oficjalnego manuala, choć dotyczy
jedynie 20% jego zawartości. Szczególny nacisk położyliśmy na zilustrowanie
omawianych funkcji możliwie licznymi przykładami praktycznych zastosowań.
Nie wszystkie przykłady są programami dającymi się uruchomić - często dla
większej przejrzystości kodu zrezygnowaliśmy z linii nie związanych bezpośrednio
z omawianym zagadnieniem. W każdym rozdziale znajdują się przykłady podsumowujące
i te dadzą się skompilować i uruchomić. Ponieważ ten podręcznik ma jedynie
pomóc w rozpoczęciu pracy z PETSc, nie będą też prezentowane i omawiane
techniki związane z optymalizacją kodu pod kątem obliczeń równoległych.
Jak wcześniej argumentowaliśmy, nawet w wersji sekwencyjnej (jednoprocesorowej)
pakiet jest bardzo przydatnym narzędziem.
Jeśli będzie takie zapotrzebowanie, być może napiszemy
kiedyś drugą część podręcznika, poświęconą technikom równoległym. Będziemy
także wdzięczni za wszystkie uwagi dotyczące niniejszej wersji podręcznika.
Prosimy je kierować pocztą elektroniczną na adres przykry@mimuw.edu.pl.
Będziemy je uwzględniać w miarę możliwości w wersji elektronicznej podręcznika.
Aby korzystać z PETSc niezbędna jest znajomość w
stopniu średnim programowania w języku C (podstawowe funkcje, wskaźniki,
tablice i struktury) na poziomie standardu ANSI C. W zasadzie znajomość
standardu Kernighan-Ritchie [12] też
w zupełności wystarczy.
Podziękowanie
Chcielibyśmy podziękować prof. M.Dryji
oraz mgr L.Marcinkowskiemu
za sugestie i uwagi poczynione wobec wstępnej wersji niniejszego podręcznika.
Podczas pracy nad redakcją podręcznika byliśmy częściowo finansowani z
grantu KBN 2 P03A 009 09.
Copyright (C) Marcin Bojko i Piotr Krzyzanowski,
1998.
Ostatnia modyfikacja: 12.X.98.