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.