Programowanie równoległe i współbieżne
Ćwiczenie:
Ćwiczenie 11
Data oddania:
10.6.2013
Imię, Nazwisko:
Dawid Misiniec
Ocena:
Uwagi:
1.
Cel ćwiczenia:
Celem ćwiczenia było zapoznanie się z programem pisanym w środowisku
OpenMP
i porównanie jego działania z podobnym programem pisanym w środowisku
MPI.
2.
Przebieg ćwiczenia:
Przygo
towaną na potrzeby laboratorium aplikację musieliśmy przetestować,
ustawiając różną ilość wątków w kodzie źródłowym.
Listing programu:
#include <iostream>
#include <omp.h> //biblioteka OpenMP
#include <stdio.h>
using namespace std;
int main()
{
int liczba = 0;
cout << "Podaj liczbe: ";
cin >> liczba;
cout << endl;
int thread_id;
if (liczba > 0)
{
#pragma omp parallel for
//dyrektywa preprocesora służąca do
//
zrównoleglenia wątków
for (int i = 0; i < liczba; i++)
{
printf(" %d", i);
}
cout << "\n";
}
return 0;
}
Wynikiem działania powyższego kodu było:
3. Wnioski
Wypisywane liczby nie były poukładane po kolei,
Z
darzały się powtórzenia wyświetlonych wartości,
Zmiana wykorzystywanej liczby wątków jest możliwa dzięki edycji
zmiennej
OMP_NUM_THREADS=liczba_watkow
Funkcja printf();
musiała zastąpić polecenie cout << i << " "; z powodu
błędów wyświetlania
Aby
móc pracować w środowisku OpenMP konieczne jest dołączenie
biblioteki <omp.h>
4. OpenMP a MPI
OpenMP (ang. Open Multi-Processing)
– wieloplatformowy interfejs
programowania aplikacji (API) umożliwiający tworzenie programów
komputerowych dla systemów wieloprocesorowych z pamięcią dzieloną. Może
być wykorzystywany w językach programowania C, C++ i Fortran na wielu
architekturac
h, m.in. Unix i Microsoft Windows. Składa się ze zbioru dyrektyw
kompilatora, bibliotek oraz zmiennych środowiskowych mających wpływ na
sposób wykonywania się programu.
Dzięki temu, że standard OpenMP został uzgodniony przez głównych
producentów sprzętu i oprogramowania komputerowego, charakteryzuje się
on przenośnością, skalowalnością, elastycznością i prostotą użycia. Dlatego
może być stosowany do tworzenia aplikacji równoległych dla różnych platform,
od komputerów klasy PC po superkomputery.
OpenMP można stosować do tworzenia aplikacji równoległych na
klastrach komputerów wieloprocesorowych. W tym przypadku zwykle stosuje
się rozwiązanie hybrydowe, w którym programy są uruchamiane na klastrach
komputerowych pod kontrolą alternatywnego interfejsu MPI, natomiast do
urównoleglenia pracy węzłów klastrów wykorzystuje się OpenMP.
Alternatywny sposób polega na zastosowaniu specjalnych rozszerzeń
OpenMP dla systemów pozbawionych pamięci współdzielonej (np. Cluster
OpenMP Intela).
Message Passing Interface (MPI) (z ang. Interfejs Transmisji
Wiadomości) – protokół komunikacyjny będący standardem przesyłania
komunikatów pomiędzy procesami programów równoległych działających na
jednym lub więcej komputerach. Interfejs ten wraz z protokołem oraz
semantyką specyfikuje, jak jego elementy winny się zachowywać w dowolnej
implementacji. Celami MPI są wysoka jakość, skalowalność oraz przenośność.
MPI jest dominującym modelem wykorzystywanym obecnie w klastrach
komputerów oraz superkomputerach. Pierwsza wersja standardu ukazała się
w maju 1994 r. Standard MPI implementowany jest najczęściej w postaci
bibliotek, z których można korzystać w programach tworzonych w różnych
językach programowania, np. C, C++, Ada, Fortran.
OpenMP
jest otwartą biblioteką i jej użycie jest proste gdyż w większości
przypadków polega na dołączeniu biblioteki przez preambułe include. Program
OpenMP wykonuje swoje zadania w oparciu
o wątki, natomiast MPI robi to na
procesach i koniecznym jest
posługiwanie się zewnętrznym programem, aby
móc wykonać daną aplikację. W przypadku OpenMP wystarczy w zmiennej
środowiskowej OMP_NUM_THREADS ustawić ilość wywoływanych wątków.
5. Proces a w
ątek
Wątek (ang. thread) – część programu wykonywana współbieżnie w obrębie
jednego procesu
; w jednym procesie może istnieć wiele wątków.
Różnica między zwykłym procesem a wątkiem polega na współdzieleniu
przez wszystkie wątki działające w danym procesie przestrzeni adresowej oraz
wszystkich innych struktur systemowych (np. listy otwartych plików, gniazd
itp.)
– z kolei procesy posiadają niezależne zasoby.
Ta cecha ma dwie ważne konsekwencje:
Wątki wymagają mniej zasobów do działania i też mniejszy jest czas
ich tworzenia.
Dzięki współdzieleniu przestrzeni adresowej (pamięci) wątki jednego
zadania mogą się między sobą komunikować w bardzo łatwy sposób,
niewymagający pomocy ze strony systemu operacyjnego.
Przekazanie dowolnie dużej ilości danych wymaga przesłania jedynie
wskaźnika, zaś odczyt (a niekiedy zapis) danych o rozmiarze nie
większym od słowa maszynowego nie wymaga synchronizacji
(procesor gwarantuje
atomowość takiej operacji).
Wątki są udostępniane wprost przez system operacyjny MS Windows,
w systemach Linux, BSD
i innych dostępna jest biblioteka pthread, dająca
jednolity interfejs, ukrywający szczegóły implementacji. W językach
programowania
używających maszyn
wirtualnych (Python, Java
itp.)
są
dostępne również tzw. zielone wątki, które nie są obsługiwane przez system
operacyjny, ale samą maszynę wirtualną – to pozwala m.in. na realizację
współbieżności nawet wtedy, gdy docelowy system operacyjny nie udostępnia
wątków.