Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm



Podobne dokumenty
Przetwarzanie Równoległe i Rozproszone

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Wprowadzenie do OpenMP

Programowanie systemów z pamięcią wspólną specyfikacja OpenMP. Krzysztof Banaś Obliczenia równoległe 1

Równoległość i współbieżność

Równoległość i współbieżność

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Algorytmy i Struktury Danych

Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie Rozproszone i Równoległe

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

OpenMP. Programowanie aplikacji równoległych i rozproszonych. Wykład 2. Model programowania. Standard OpenMP. Dr inż. Tomasz Olas

Komputerowe Obliczenia Równoległe: Wstęp do OpenMP i MPI

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie współbieżne Wstęp do OpenMP. Rafał Skinderowicz

Programowanie maszyn z pamięcią wspólną w standardzie OpenMP.

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Przekazywanie argumentów wskaźniki

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie obiektowe zastosowanie języka Java SE

Elementy składowe: Przenośność oprogramowania Model SPMD Szczegółowe wersje (bindings) dla różnych języków programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

O superkomputerach. Marek Grabowski

61 Topologie wirtualne

Nowoczesne technologie przetwarzania informacji

Mechanizmy pracy równoległej. Jarosław Kuchta

Wyklad 11 Języki programowania równoległego

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 7. Karol Tarnowski A-1 p.

Podstawy języka skryptowego Lua

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

PRZEWODNIK PO PRZEDMIOCIE

Wstęp do programowania. Wykład 1

Programowanie maszyn z pamięcią wspólną w standardzie OpenMP ciąg dalszy.

Podstawy programowania skrót z wykładów:

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Wstęp do programowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Ćwiczenie nr: 9 Obliczenia rozproszone MPI

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski

Dr inż. hab. Siergiej Fialko, IF-PK,

Programowanie maszyn z pamięcią wspólną w standardzie OpenMP.

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Ćwiczenie nr: 9 Obliczenia rozproszone MPI

Programowanie - wykład 4

1 Podstawy c++ w pigułce.

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Poziom kwalifikacji: I stopnia. Liczba godzin/tydzień: 2W E, 2L PRZEWODNIK PO PRZEDMIOCIE

HPC na biurku. Wojciech De bski

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

76.Struktura oprogramowania rozproszonego.

Open MP wer Rafał Walkowiak Instytut Informatyki Politechniki Poznańskiej Wiosna

Programowanie w języku C++ Grażyna Koba

Modele programowania równoległego. Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP

Tworzenie oprogramowania

16. Taksonomia Flynn'a.

Java jako język programowania

Wstęp do programowania

4. Procesy pojęcia podstawowe

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

Wstęp do Programowania, laboratorium 02

Paweł Skrobanek. C-3, pok

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

Część 4 życie programu

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Wstęp do programowania

JAVA W SUPER EXPRESOWEJ PIGUŁCE

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

1 Podstawy c++ w pigułce.

Środowiska i platformy programistyczne

Wersja dokumentacji1.01. TeleToken API

Programowanie w języku C++

5. Model komunikujących się procesów, komunikaty

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

Tworzenie i obsługa wirtualnego laboratorium komputerowego

Szablony funkcji i klas (templates)

Obliczenia rozproszone MPI

INTERFEJ SYSTEMU MIZAR-4

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

PRZEWODNIK PO PRZEDMIOCIE

Programowanie procesorów graficznych GPGPU

Transkrypt:

Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm Streszczenie Tematem pracy jest standard OpenMP pozwalający na programowanie współbieŝne w systemach komputerowych z pamięcią dzieloną i jego implementacja w kompilatorze GNU GCC. Przedstawiony jest zarys interfejsu programistycznego OpenMP dla języków programowania C/C++. Abstrakt The aim of this work is to present OpenMP standard used for parallel programming on shared memory computer systems. Implementation of OpenMP in GNU GCC compiler collection is discussed. The outline of OpenMP API for C/C++ programming languages is presented. 1. Wstęp Wiele zadań realizowanych przez oprogramowanie moŝna wykonać szybciej, jeŝeli obliczenia które mają być wykonane, będą wykonywane współbieŝnie. Jest to podstawową ideą programowania równoległego. Obecnie typowym środowiskiem sprzętowym w którym są stosowane techniki przetwarzania równoległego są komputery wieloprocesorowe i klastry takich komputerów. Ma to wpływ na aktualne typowe zastosowania programowania równoległego, jako standardowej techniki programistycznej w obliczeniach numerycznych. Programowanie równoległe jest równieŝ popularne w systemach przetwarzania graficznego 3D. Obecnie obserwuje się wchodzenie na rynek komputerów PC procesorów wielordzeniowych. Coraz częściej standardowy komputer klasy PC jest wyposaŝony w procesor będący układem dwurdzeniowym, którego efektywność działania jest równowaŝna dwóm niezaleŝnym procesorom. Popularność komputerów klasy PC będzie powodowała ewolucję zastosowań programowania równoległego, które najprawdopodobniej zacznie być wykorzystywane jako standardowa technika programistyczna w zwykłych aplikacjach. Jednym ze sposobów programowania równoległego jest stosowanie technologii OpenMP [1,2]. OpenMP jest popularnym standardem definiującym interfejs programistyczny, pozwalający na proste i efektywne programowanie aplikacji wykonywanych współbieŝnie.

Nie jest to jedyna popularna forma programowania równoległego, są inne których uŝyteczność zaleŝy od architektury sprzętu komputerowego na którym wykonywany będzie program. 2. Architektura komputera a programowanie współbieŝne Ze względu na sposób dostępu do współdzielonej pamięci wyróŝnimy dwie podstawowe architektury sprzętu komputerowego: a) z pamięcią dzieloną wiele procesorów ma bezpośredni dostęp do całego obszaru pamięci. Architektura ta obrazuje pojedynczy komputer wieloprocesorowy, gdzie kaŝdy z procesorów ma równoprawny, bezpośredni dostęp do pamięci operacyjnej. Są moŝliwe przypadki, kiedy jeden z procesorów ma uprzywilejowany dostęp do pewnego obszaru pamięci (np. procesory AMD Operon) z racji tego Ŝe procesor bezpośrednio komunikuje się ze sterownikiem pamięci lub sam spełnia taką funkcję. Jednak nawet w tym przypadku pozostałe procesory mają dostęp do całej pamięci operacyjnej. b) z przesyłaniem komunikatów w tym przypadku mamy do czynienia z wieloma autonomicznymi systemami komputerowymi, które komunikując się miedzy sobą poprzez medium komunikacyjne (np. sieć komputerową), mogą uzyskać dostęp do pamięci innego komputera. W tym przypadku nie jest moŝliwy bezpośredni dostęp do pamięci komputera zdalnego. Zamiast tego komputery wymieniają się informacjami (komunikatami) o zawartości poszczególnych obszarów pamięci. Podczas gdy architektura z dostępem bezpośrednim jest architekturą typowego komputera wieloprocesorowego, klastry obliczeniowe mają architekturę z przesyłaniem komunikatów. W praktyce spotyka się często architekturę mieszaną, w postaci klastra komputerów wieloprocesorowych, wykorzystującą oba sposoby dostępu do współdzielonej pamięci. Jest to architektura typowego klastra zbudowanego w oparciu o komputery klasy PC, które dla celów obliczeniowych juŝ standardowo są wyposaŝane w 2 lub 4 procesory dwurdzeniowe. W zaleŝności od architektury stosowanego sprzętu do programowania równoległego stosowane są róŝne techniki. Typowymi technikami zrównoleglenia obliczeń w przypadku systemów z pamięcią współdzieloną są: jawne stosowanie wątków lub standard OpenMP. Obie metody bazują na

wykorzystaniu moŝliwości bezpośredniego dostępu do pamięci komputera, bezpośrednio poprzez odwołania do zmiennych w kodzie programu. Dla systemów operacyjnych spełniających standard POSIX jest zdefiniowany interfejs programistyczny PTHREADS pozwalający na programowanie aplikacji wielowątkowych. Pozwala to na programowanie równoległe, bezpośrednio poprzez przydział zadań obliczeniowych poszczególnym wątkom programu wykonywanych jednocześnie. Metoda ta wymaga stosowania funkcji biblioteki PTHREADS do kreacji wątków, ich synchronizacji i innych operacji bezpośrednio w kodzie źródłowym programu. Alternatywą dla PTHREADS jest standard OpenMP. Pozwala on na tworzenie kodu działającego równolegle w sposób duŝo prostszy niŝ jawne stosowanie wątków. Programowanie z wykorzystaniem OpenMP wykonuje się poprzez stosowanie dyrektyw kompilatora, pozwalających na określenie bloków instrukcji wykonywanych równolegle, synchronizację ich wykonywania i inne zadania typowe dla programowania współbieŝnego. Kwestią ograniczającą stosowanie OpenMP jest konieczność stosowania kompilatora wspierającego ten standard. Zaletami tego standardu jest prosty interfejs programistyczny, który jest taki sam niezaleŝnie od systemu operacyjnego na którym program ma być wykonywany. Pozwala to na kompilację programu z tego samego kodu źródłowego na komputerach klasy PC działających pod kontrolą typowych dla nich systemów operacyjnych i na superkomputerach. Interfejs programistyczny OpenMP jest zdefiniowany wyłącznie dla C, C++ i języka FORTRAN. W przypadku systemów z przesyłaniem komunikatów najczęściej jest wykorzystywana biblioteka MPI lub mniej popularna PVM. Obie te metody bazują na komunikacji poprzez sieć komputerową, same zaś biblioteki MPI czy PVM dostarczają procedur i funkcji pozwalających na wysyłanie i odbieranie wartości zmiennych pomiędzy programami uruchamianymi na odrębnych komputerach. MPI (Message Passing Interface) jest ustandaryzowanym interfejsem programistycznym pozwalającym na wymianę komunikatów pomiędzy róŝnymi programami. Ta bardzo popularna biblioteka ma implementacje w róŝnych językach programowania, nie tylko standardowych jak C, C++, FORTRAN czy JAVA, ale równieŝ na przykład w zyskującym coraz większą popularność języku Python. MPI nie jest formalnie ustandaryzowana jednak jest to standard de-facto, stosowany w aplikacjach wymagających wymiany komunikatów. Są równieŝ dostępne biblioteki wykorzystujące MPI do swojego działania, pozwalające na programowanie wysokopoziomowe specyficznych zagadnień, bez konieczności bezpośredniego programowania z wykorzystaniem MPI. Przykładem moŝe być

biblioteka procedur PETSc, która pozwala na rozwiązywanie numeryczne układów równań róŝniczkowych zwyczajnych, czy zagadnień algebry macierzy z wykorzystaniem klastrów obliczeniowych. W niektórych zastosowaniach alternatywą wobec MPI jest biblioteka PVM (Parallel Virtual Machine). PVM w idei podobna jest do MPI, dostarcza API do wymiany komunikatów pomiędzy programami. Dostępna jest dla C, C++ i FORTRAN-u. PVM jest mniej popularna niŝ MPI. KaŜda z rozpatrywanych architektur systemów komputerowych ma specyficzne dla siebie techniki programowania współbieŝnego. W praktyce spotyka się ich łączenie ze sobą, OpenMP czy PTHREADS z MPI lub PVM w celu optymalnego wykorzystania klastów obliczeniowych. 3. Historia OpenMP OpenMP jest ustandaryzowanym interfejsem programistycznym. Prace nad tym standardem prowadziło pierwotnie konsorcjum firm INTEL, IBM i DEC. Wysiłki te doprowadziły do ustalenia w 1997 roku wersji 1.0 interfejsu programistycznego dla języka FORTRAN. Rok później opracowano API w wersji 1.0 dla języków C/C++. Kolejna wersja 2.0 API OpenMP dla języka FORTRAN opublikowana była w roku 2000, natomiast dla C/C++ w roku 2002. W roku 2005 opublikowano najnowszą wersję standardu 2.5, jednocześnie dla C/C++ i FORTRAN-u. Obecnie członkami konsorcjum pracującego nad OpenMP są między innymi: HP, IBM, Intel, Compaq/Digital, KAI, SGI czy Sun, co gwarantuje rozwój tego standardu. W kolejnym wydaniu standardu OpenMP przewiduje się między innymi, stosowanie tego interfejsu programistycznego dla obliczeń w klastrach, gdzie aktualnie stosuje się MPI. Firma INTEL opracowała juŝ i sprzedaje kompilator pozwalający na takie zastosowania OpenMP w klastrach pracujących pod kontrolą systemu operacyjnego LINUX. 4. GNU GCC a OpenMP Większość kompilatorów wspierających standard OpenMP to kompilatory komercyjne, produkowane przez takich producentów jak INTEL, Microsoft czy SUN. Istnieje kompilator dostępny na licencji GNU, którego zaletą oprócz otwartego kodu źródłowego i co za tym idzie dostępności bez konieczności wnoszenia jakichkolwiek opłat, jest jego popularność. Kompilator ten jest dostępny na szeroką gamę systemów operacyjnych i

generuje kod binarny uruchamiany na róŝnych platformach sprzętowych. Kompilator GNU GCC [3] pozwala między innymi na kompilację języków programowania C, C++ i FORTRAN. Projekt mający na celu obsługę OpenMP przez kompilator GNU GCC został zapoczątkowany w 2002 roku. Znany był jako GOMP (GNU OpenMP). Początkowo rozwijany niezaleŝnie, został w 2005 roku włączony do podstawowego kodu źródłowego kompilatora GNU GCC. Po dwóch latach rozwoju ta implementacja zyskała funkcjonalność pozwalającą na umieszczenie jej w ogólnodostępnej oficjalnej dystrybucji kompilatora. Najnowsze wydanie kompilatora GNU GCC w wersji 4.2, opublikowane w maju 2007 roku obsługuje wersję 2.5 standardu OpenMP. GNU GCC jest kompilatorem systemowym we wszelkich UNIX-o podobnych systemach operacyjnych jak Linux czy systemy z rodziny BSD (np. FreeBSD). Popularność tych systemów operacyjnych, w środowiskach klastrów obliczeniowych budowanych w oparciu o sprzęt klasy PC, powoduje to Ŝe GNU GCC jest często kompilatorem który w sposób naturalny jest tam wykorzystywany. Obecnie dzięki wsparciu standardu OpenMP kompilator ten pozwoli na efektywniejsze wykorzystywanie zasobów obliczeniowych klastrów. zastosowań Powszechność tego kompilatora moŝe równieŝ spowodować popularyzację numerycznymi. OpenMP w programowaniu aplikacji nie mających nic wspólnego z technikami 5. Interfejs programistyczny OpenMP Standard OpenMP [1,2,4] definiuje interfejs programistyczny który musi być stosowany w programach go wykorzystujących. Składnikami tego interfejsu programistycznego są: dyrektywy kompilatora, biblioteka procedur dostarczająca funkcji pomocniczych oraz zmienne środowiskowe mające wpływ na wykonywanie programów wykorzystujących OpenMP. 5.1. Dyrektywy kompilatora Podstawowym składnikiem API OpenMP są dyrektywy kompilatora. Aby kompilator interpretował dyrektywy OpenMP musi być wywołany z odpowiedzialnym za tą właściwość przełącznikiem. W przypadku GNU GCC jest to fopenmp. W przeciwnym razie dyrektywy OpenMP są ignorowane. Standard w sposób naturalny definiuje odrębny zestaw dyrektyw dla języka FORTRAN i języków C/C++. Składnia tych dyrektyw jest inna dla C niŝ dla

FORTRAN-u co wynika z gramatyki języka programowania, jednak dostarczają one tej samej funkcjonalności. W języku C dyrektywa ta ma postać: #pragma omp nazwa_dyrektywy [ opcje [ [,] opcje ]... ] na przykład: #pragma omp parallel for Implementacja API OpenMP poprzez dyrektywy kompilatora które mogą być interpretowane, lub nie przez kompilator, ma bardzo istotne znaczenie dla uniwersalności kodu źródłowego programu. Z tego samego kodu źródłowego moŝemy skompilować program działający równolegle (stosując odpowiedni parametr wywołania kompilatora ), lub wykonywany jednowątkowo. W obecnej wersji standardu OpenMP jest zdefiniowanych 13 dyrektyw pozwalających między innymi na definiowanie obszarów kodu źródłowego wykonywanego równolegle, na tworzenie czy synchronizację wątków. Dyrektywy dla języka C/C++ przedstawia Tabela 1. dyrektywa OpenMP opis #pragma omp parallel [ opcje ] deklaracja bloku instrukcji wykonywanego równolegle #pragma omp for [ opcje ] deklaracja pętli for wykonywanej równolegle w juŝ istniejących wątkach #pragma omp sections [ opcje ] deklaracja bloku instrukcji wykonywanych przez kaŝdy z istniejących wątków #pragma omp single [ opcje ] deklaracja bloku instrukcji wykonywanych przez wyłącznie jeden z istniejących wątków #pragma omp parallel for [ opcje ] deklaracja pętli for wykonywanej równolegle w wątkach które zostaną utworzone dla tego celu #pragma omp parallel sections [ opcje ] deklaracja bloku instrukcji wykonywanych przez kaŝdy z wątków które zostaną utworzone dla tego celu #pragma omp master deklaracja bloku instrukcji wykonywanych wyłącznie przez wątek główny #pragma omp critical [ (nazwa_sekcji) ] deklaracja sekcji krytycznej która jest blokiem instrukcji wykonywanych wyłącznie przez jeden wątek w danej chwili #pragma omp barrier deklaracja wymuszająca synchronizację wszystkich wątków #pragma omp atomic deklaracja bloku instrukcji, wymuszająca aby operacje modyfikacji zmiennych były wykonywane wyłącznie przez jeden wątek w danej chwili

#pragma omp flush [ (nazwa_zmiennej) ] powoduje synchronizację obrazu tymczasowej pamięci wątku z pamięcią procesu #pragma omp ordered deklaracja bloku instrukcji wykonywanych sekwencyjnie przez wątki #pragma omp threadprivate (nazwa_zmiennej) deklaracja zmiennej globalnej która ma być replikowana w zasięgu prywatnym wątku Tabela 1. Dyrektywy OpenMP dla C/C++ 5.2. Procedury czasu wykonania Kolejnym składnikiem OpenMP są procedury czasu wykonania. Wykorzystanie ich wymaga załączenia pliku nagłówkowego omp.h z ich deklaracjami oraz łączenia programu z odpowiednią biblioteką procedur, w przypadku kompilatora GNU GCC jest to biblioteka libgopm.a. Oprócz deklaracji funkcji i procedur plik nagłówkowy omp.h zawiera równieŝ definicje typów danych niezbędnych dla działania tych procedur. Procedury i funkcje OpenMP podzielić moŝna na trzy kategorie, pozwalające na: a) uzyskiwanie informacji dotyczących środowiska OpenMP w trakcie wykonywania programu, b) synchronizowany dostęp do danych poprzez zapewnienie mechanizmów takich jak np. semafory, c) wyznaczanie czasu wykonywania wątku. W standardzie OpenMP są zdefiniowane 22 funkcje i procedury, wybrane z nich zawarte są w Tabeli 2. sygnatura funkcji void omp_set_num_threads(int ilość_watkow); int omp_get_num_threads(void); int omp_get_thread_num(void); int omp_get_num_procs(void); int omp_in_parallel(void); void omp_init_lock(omp_lock_t *lock); void omp_set_lock(omp_lock_t *lock); opis określa ilość wątków w których ma być wykonywany region równoległy programu zwraca w ilu wątkach jest wykonywany region równoległy programu zwraca numer wątku w którym wywołana została funkcja zwraca ilość procesorów dostępnych w komputerze na którym jest uruchomiony program testuje czy aktualny blok instrukcji jest wykonywany równolegle inicjalizuje semafor w stanie nie zablokowanym powoduje zablokowanie semafora przez wywołujący funkcję wątek, jeŝeli semafor jest zablokowany przez inny wątek, wątek wywołujący tą funkcje oczekuje

void omp_unset_lock(omp_lock_t *lock); zwalnia blokadę semafora void omp_destroy_lock(omp_lock_t *lock); zwalnia semafor double omp_get_wtime(void); zwraca aktualny czas (sekundach) double omp_get_wtick(void); zwraca dokładnośc z jaką jest mierzony czas przez funkcję omp_get_wtime Tabela 2. Wybrane procedury czasu wykonania w OpenMP 5.3. Zmienne środowiskowe Kolejnym elementem składowym OpenMP są zmienne środowiskowe pozwalające na modyfikowanie środowiska wykonywania programu. Dzięki zastosowaniu tych zmiennych moŝna wpływać na sposób wykonywania równoległych obszarów programu bez konieczności jego rekompilacji. W OpenMP są zdefiniowane 4 zmienne środowiskowe, implementacja GNU GCC wprowadza dwie dodatkowe [4] będące rozszerzeniem standardu. Zmienne środowiskowe są przedstawione są w Tabeli 3: nazwa zmiennej moŝliwe wartości opis OMP_SCHEDULE static, dynamic, guided określa sposób podziału pracy pomiędzy wątkami w trakcie równoległego wykonywania pętli for OMP_NUM_THREADS wartość całkowita określa ilość wątków w których będą wykonywane równoległe regiony programu OMP_DYNAMIC true, false określa czy ilość wątków w których wykonywane będą równoległe obszary programu ma być dobierana automatycznie, czy nie OMP_NESTED true, false pozwala, lub nie na zagnieŝdŝone zrównoleglenie w wykonywanym programie GOMP_CPU_AFFINITY lista wartości całkowitych przydziela wątki do określonych procesorów (rozszerzenie GNU GCC) GOMP_STACKSIZE wartość całkowita ustala rozmiar stosu (w kilobajatach) wykorzystywany przez kaŝdy z wątków (rozszerzenie GNU GCC) Tabela 3. Zmienne środowiskowe stosowane w OpenMP 6. Aplikacje OpenMP Zaletą standardu OpenMP jest prostota jego wykorzystania w praktyce. Typową aplikacją tej technologii jest zrównoleglone wykonywanie obliczeń w pętli for. Jest to scenariusz wykorzystywany często w programach numerycznych. PoniŜej jest przedstawiony przykładowy program będący ilustracją wykorzystania OpenMP. 1 #include <iostream> 2 using namespace std; 3 int main(int argc, char ** argv) { 4 int i; 5 double ret=0; 6 #pragma omp parallel for reduction(+,ret) num_threads(4) 7 for (i=0;i<10000;i++) {

8 ret +=pow(i,0.5); 9 } 10 cout<<ret; 11 return 0; 12 } Listing 1. Zrównoleglenie wykonywania pętli for Program przedstawiony na Listingu 1 wylicza sumę 9999 i= 0 i. W wierszu numer 6 jest zawarta dyrektywa OpenMP #pragma omp której poszczególne składniki mają następujące znaczenie: a) parallel for - deklaruje Ŝe następującą po dyrektywie pętlę for naleŝy wykonywać równolegle, b) reduction(+,ret) deklaruje Ŝe zmienna ret jest zmienną na której poszczególne wątki będą wykonywały operację sumowania, umieszczenie tej deklaracji zapewnia efektywny konkurencyjny dostęp do zmiennej ret i poprawne jej modyfikacje, co zapewnia prawidłowe obliczenie sumy, c) num_threads(4) pętla for będzie wykonywana w czterech wątkach. 7. Podsumowanie W pracy przedstawiono jedynie zarys interfejsu programistycznego OpenMP oraz podstawowe właściwości tej technologii. Pomimo Ŝe sam interfejs programistyczny jest bardzo prosty trzeba się mieć na baczności stosując OpenMP w praktyce. Praca wielu wątków korzystających ze wspólnego obszaru pamięci moŝe spowodować efekt wyścigu do zmiennej. Ma to miejsce wtedy gdy róŝne wątki próbują modyfikować jednocześnie ten sam obszar pamięci, lub jeden z wątków modyfikuje obszar danych zmiennej z którego inny wątek dane odczytuje. Wystąpienie efektu wyścigu do zmiennej powoduje błędne i nieprzewidywalne wyniki. OpenMP jest godnym polecenia narzędziem wykorzystywanym w obliczaniach równoległych. Warto zapoznać się z tą technologią poniewaŝ jej zastosowania będą rosły w przyszłości. Literatura 1. OpenMP Application Program Interface, Version 2.5 May 2005, http://www.openmp.org/drupal/mp-documents/spec25.pdf

2. Rohit Chandra i inni: Parallel Programming in OpenMP, Morgan Kaufmann Publishers, 2000 3. GCC, the GNU Compiler Collection, http://gcc.gnu.org 4. The GNU OpenMP Implementation, http://gcc.gnu.org/onlinedocs/gcc- 4.2.0/libgomp.pdf