headerphoto

OpenMP - OpenMP kontra MPI

Standard MPI

Message Passing Interface (MPI) to standard biblioteki przesyłania komunikatów dla potrzeb programowania komputerów równoległych. Przesyłanie komunikatów wiąże się ściśle z organizacją pamięci typu "message-passing" w wielokomputerach i to właśnie im standard MPI jest specjalnie dedykowany. Funkcje i biblioteki składające się na standard MPI mają na celu efektywną komunikację między procesorami bez obciążania ich operacjami kopiowania pamięci. Rozwiązanie to zwiększa w rezultacie ogólną wydajność obliczeniową używanego komputera równoległego. Twórcy MPI zadbali także o kompatybilność programów pisanych z użyciem bibliotek MPI. Teoretycznie każdy program operujący na MPI powinien bezproblemowo dać się pomyślnie skompilować na dowolnej maszynie implementującej standard MPI. Warto dodać, że standard jest dostępny nieodpłatnie i do tego bardzo rozbudowany (MPI składa się z ponad 115 różnych funkcji).

Opisując standard MPI nie można zapomnieć o jego wadach. Jedną z nich jest dosyć złożony proces zrównoleglania (pierwotnie sekwencyjnego) kodu programu. Tak naprawdę program musi zostać kompletnie przebudowany pod kątem uruchamiania go przez różne procesy w ramach MPI. Łączy się to z brakiem możliwości wykonywania zrównoleglenia przyrostowego (ang. incremental parallelization) z użyciem wyłącznie MPI. Zrównoleglanie przyrostowe polega na implementacji równoległości dla wybranych fragmentów programu, dzięki czemu programista może przetestować poprawność samego algorytmu i stopniowo umożliwiać równoległe wykonywanie pozostałych części kodu1. Podsumowując, MPI to standard programowania równoległego o dużym potencjale, jednak dosyć trudny w programowaniu.

Standard OpenMP

Analizując zalety i wady standardu MPI łatwo wyobrazić sobie, jak powinien wyglądać idealny standard programowania maszyn równoległych. Przede wszystkim powinien być prosty w programowaniu, tak aby używać go mogli nie tylko doświadczeni programiści ale także ludzie nie związani ściśle z informatyką (np. fizycy, chemicy, czy biolodzy). Oni nie chcą zagłębiać się w tajniki setek funkcji MPI czy dzielenia kodu na procesy. Sami programiści, przyzwyczajeni do tworzenia oprogramowania sekwencyjnego, są często sceptyczni wobec nowej logiki programowania, stosowanej w przypadku maszyn równoległych. Dlatego, aby zmniejszyć dystans między programistami a rozwijającą się coraz szybciej techniką komputerów równoległych, podjęto próbę stworzenia nowego standardu programowania równoległego.

Pierwsza publiczna prezentacja OpenMP miała miejsce wiosną 1997 r. na konferencji "High Performance Computing, Networking, and Storage" podczas targów Supercomputing. Wtedy to grupa ekspertów zajmujących się wysokiej klasy komputerami równoległymi (zwanymi inaczej HPC) wraz z przedstawicielami ośrodków badawczo-naukowych, zaprezentowała nowy standard programowania równoległego dla komputerów z pamięcią współdzieloną. Na początku standard OpenMP opracowany został dla języka Fortran, jednak bardzo szybko przystosowano go na potrzeby języka C/C++. Idea OpenMP polegała na dostarczeniu potencjalnemu programiście zbioru dyrektyw kompilatora, bibliotek i zmiennych środowiskowych umożliwiających proste i komfortowe programowanie komputerów równoległych za pomocą zrównoleglania przyrostowego i tzw. wątków (które zostaną omówione w dalszej części tego rozdziału). Autorom zależało na tym, aby programiści nie byli już zmuszeni przebudowywać swoich sekwencyjnych programów pod kątem wykorzystania ich na maszynach równoległych (tak jak to miało miejsce w przypadku MPI). W ich zamyśle, zwykły program sekwencyjny po dodaniu dyrektyw OpenMP miał zachowywać się tak, jak gdyby był pisany specjalnie pod kątem wieloprocesorów. Takie podejście do zrównoleglania kodu nie zaburzało więc utartej logiki programowania większości "sekwencyjnych" programistów. Można powiedzieć więcej, otworzyło nowe, fascynujące możliwości łatwej implementacji elementów programowania równoległego w programach pierwotnie typowo sekwencyjnych.


1 M. Demichowicz, P. Mazur, OpenMP - środowisko programowania komputerów równoległych ze wspólną pamięcią, NAKOM, Poznań 2002, s. 119.