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:
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:
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:

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.
Spis treści Wstęp
 

Copyright (C) Marcin Bojko i Piotr Krzyzanowski, 1998.
Ostatnia modyfikacja: 12.X.98.