OpenMP
Oryginalni autorzy | Rada przeglądu architektury OpenMP |
---|---|
Deweloperzy | Rada przeglądu architektury OpenMP |
Wersja stabilna | 5.2 / listopad 2021
|
System operacyjny | Międzyplatformowe |
Platforma | Międzyplatformowe |
Typ | Rozszerzenie do C , C++ i Fortran ; API |
Licencja | Różny |
Strona internetowa |
OpenMP ( Open Multi-Processing ) to interfejs programowania aplikacji (API), który obsługuje wieloplatformowe programowanie wieloprocesorowe z pamięcią współużytkowaną w językach C , C++ i Fortran na wielu platformach, architekturach z zestawami instrukcji i systemach operacyjnych , w tym Solaris , AIX , FreeBSD , HP-UX , Linux , macOS i Windows . Składa się z zestawu dyrektyw kompilatora , procedur bibliotecznych i zmiennych środowiskowych , które wpływają na zachowanie w czasie wykonywania.
OpenMP jest zarządzany przez konsorcjum technologiczne non-profit OpenMP Architecture Review Board (lub OpenMP ARB ), wspólnie zdefiniowane przez szerokie grono wiodących dostawców sprzętu komputerowego i oprogramowania, w tym Arm , AMD , IBM , Intel , Cray , HP , Fujitsu , Nvidia , NEC , Red Hat , Texas Instruments i Oracle Corporation .
OpenMP wykorzystuje przenośny , skalowalny model, który zapewnia programistom prosty i elastyczny interfejs do tworzenia aplikacji równoległych dla różnych platform, od standardowego komputera stacjonarnego po superkomputer .
Aplikacja zbudowana w hybrydowym modelu programowania równoległego może działać w klastrze komputerowym przy użyciu zarówno OpenMP, jak i Message Passing Interface (MPI), tak że OpenMP jest używany do równoległości w (wielordzeniowym) węźle, podczas gdy MPI jest używany do równoległości między węzłami . Podejmowano również wysiłki, aby uruchomić OpenMP w programowych rozproszonych systemach pamięci współdzielonej , przetłumaczyć OpenMP na MPI i rozszerzyć OpenMP na systemy pamięci niewspółdzielonej.
Projekt
OpenMP to implementacja wielowątkowości , metody zrównoleglania, w której główny wątek (seria instrukcji wykonywanych kolejno) rozdziela określoną liczbę wątków podrzędnych , a system dzieli między nie zadania. Wątki są następnie uruchamiane współbieżnie , a środowisko wykonawcze przydziela wątki różnym procesorom.
0 Sekcja kodu, która ma działać równolegle, jest odpowiednio oznaczona dyrektywą kompilatora, która spowoduje utworzenie wątków przed wykonaniem sekcji. Każdy wątek ma identyfikator , który można uzyskać za pomocą funkcji (nazywanej omp_get_thread_num()
). Identyfikator wątku jest liczbą całkowitą, a wątek główny ma identyfikator . Po wykonaniu kodu zrównoleglonego wątki łączą się z powrotem w główny wątek, który jest kontynuowany do końca programu.
Domyślnie każdy wątek niezależnie wykonuje równoległą sekcję kodu. Konstrukcje podziału pracy mogą służyć do podziału zadania między wątki, tak aby każdy wątek wykonywał przydzieloną mu część kodu. W ten sposób można osiągnąć zarówno równoległość zadań , jak i równoległość danych za pomocą OpenMP.
Środowisko wykonawcze przydziela wątki procesorom w zależności od wykorzystania, obciążenia maszyny i innych czynników. Środowisko wykonawcze może przypisać liczbę wątków na podstawie zmiennych środowiskowych lub kod może to zrobić za pomocą funkcji. Funkcje OpenMP są zawarte w pliku nagłówkowym o nazwie omp.h w C / C++ .
Historia
OpenMP Architecture Review Board (ARB) opublikowała swoje pierwsze specyfikacje API, OpenMP for Fortran 1.0, w październiku 1997. W październiku następnego roku wydali standard C/C++. W 2000 roku pojawiła się wersja 2.0 specyfikacji Fortran, a wersja 2.0 specyfikacji C/C++ została wydana w 2002 roku. Wersja 2.5 to połączona specyfikacja C/C++/Fortran, która została wydana w 2005 roku. [ Potrzebne źródło ]
Do wersji 2.0 OpenMP określał przede wszystkim sposoby równoległości bardzo regularnych pętli, jakie występują w programowaniu numerycznym zorientowanym na macierze , gdzie liczba iteracji pętli jest znana w momencie wejścia. Uznano to za ograniczenie i do implementacji dodano różne równoległe rozszerzenia zadań. W 2005 roku podjęto próbę standaryzacji równoległości zadań, która opublikowała propozycję w 2007 roku, czerpiąc inspirację z funkcji równoległości zadań w Cilk , X10 i Chapel .
Wersja 3.0 została wydana w maju 2008 r. Nowe funkcje wersji 3.0 obejmują koncepcję zadań i konstrukcję zadań , znacznie poszerzając zakres OpenMP poza równoległe konstrukcje pętli, które stanowiły większość OpenMP 2.0.
Wersja 4.0 specyfikacji została wydana w lipcu 2013 roku. Dodaje lub ulepsza następujące funkcje: wsparcie dla akceleratorów ; atomy ; obsługa błędów; powinowactwo wątku ; rozszerzenia zadań; redukcja zdefiniowana przez użytkownika ; obsługa SIMD ; Obsługa Fortrana 2003 . [ potrzebne pełne cytowanie ]
Obecna wersja to 5.2, wydana w listopadzie 2021.
Pamiętaj, że nie wszystkie kompilatory (i systemy operacyjne) obsługują pełny zestaw funkcji najnowszych wersji.
Podstawowe elementy
Podstawowymi elementami OpenMP są konstrukcje do tworzenia wątków, dystrybucji obciążenia (dzielenie pracy), zarządzania środowiskiem danych, synchronizacji wątków, procedur wykonawczych na poziomie użytkownika i zmiennych środowiskowych.
W C/C++ OpenMP używa #pragmas . Pragmy specyficzne dla OpenMP są wymienione poniżej.
Tworzenie wątku
pragma omp służy do rozwidlenia dodatkowych wątków w celu równoległego wykonywania pracy zawartej w konstrukcji. Oryginalny wątek zostanie oznaczony jako wątek główny z identyfikatorem wątku 0.
Przykład (program C): Wyświetl „Witaj, świecie”. przy użyciu wielu wątków.
0
#include <stdio.h> #include <omp.h> int main ( void ) { #pragma omp parallel printf ( "Witaj, świecie. \n " ); powrót ; }
Użyj flagi -fopenmp, aby skompilować przy użyciu GCC:
$ gcc -fopenmp witaj.c -o witaj -ldl
Wyjście na komputerze z dwoma rdzeniami, a więc dwoma wątkami:
Witaj świecie. Witaj świecie.
Jednak dane wyjściowe mogą być również zniekształcone z powodu wyścigu spowodowanego przez dwa wątki współdzielące standardowe wyjście .
Cześć, witaj, świecie. rld.
To, czy printf
jest atomowe, zależy od podstawowej implementacji, w przeciwieństwie do std::cout C++
.
Konstrukcje podziału pracy
Służy do określania sposobu przypisywania niezależnej pracy do jednego lub wszystkich wątków.
- omp for lub omp do : używane do dzielenia iteracji pętli między wątki, zwane także konstrukcjami pętli.
- sekcje : przypisywanie kolejnych, ale niezależnych bloków kodu do różnych wątków
- single : określenie bloku kodu, który jest wykonywany tylko przez jeden wątek, na końcu zakładana jest bariera
- master : podobny do pojedynczego, ale blok kodu będzie wykonywany tylko przez główny wątek i na końcu nie będzie żadnej bariery.
Przykład: równolegle zainicjuj wartość dużej tablicy, używając każdego wątku do wykonania części pracy
0
0
int main ( int argc , char ** argv ) { int a [ 100000 ]; #pragma omp równolegle dla for ( int i = ; i < 100000 ; i ++ ) { a [ i ] = 2 * i ; } powrót ; }
Ten przykład jest żenująco równoległy i zależy tylko od wartości i . Flaga OpenMP równoległa for mówi systemowi OpenMP, aby podzielił to zadanie między działające wątki. Wątki otrzymają unikalną i prywatną wersję zmiennej. Na przykład w przypadku dwóch wątków roboczych jeden wątek może otrzymać wersję i , która działa od 0 do 49999, podczas gdy drugi otrzymuje wersję działającą od 50000 do 99999.
Dyrektywy wariantowe
Dyrektywy Variant to jedna z głównych funkcji wprowadzonych w specyfikacji OpenMP 5.0, aby ułatwić programistom poprawę przenośności wydajności. Umożliwiają adaptację pragma OpenMP i kodu użytkownika w czasie kompilacji. Specyfikacja definiuje cechy opisujące aktywne konstrukcje OpenMP, urządzenia wykonawcze i funkcjonalność zapewnianą przez implementację, selektory kontekstu oparte na cechach i warunkach zdefiniowanych przez użytkownika oraz metadyrektyw i deklaracji , aby użytkownicy mogli programować ten sam region kodu za pomocą dyrektyw wariantowych.
- Metadyrektywa to wykonywalna dyrektywa, która warunkowo rozwiązuje inną dyrektywę w czasie kompilacji, wybierając spośród wielu wariantów dyrektyw na podstawie cech definiujących warunek lub kontekst OpenMP .
- Dyrektywa zadeklaruj wariant ma podobną funkcjonalność jak metadyrektywa , ale wybiera wariant funkcji w miejscu wywołania na podstawie kontekstu lub warunków zdefiniowanych przez użytkownika.
Mechanizm zapewniany przez dwie dyrektywy wariantów do wybierania wariantów jest wygodniejszy w użyciu niż wstępne przetwarzanie C/C++, ponieważ bezpośrednio obsługuje wybór wariantów w OpenMP i pozwala kompilatorowi OpenMP na analizę i określenie ostatecznej dyrektywy na podstawie wariantów i kontekstu.
0
// adaptacja kodu za pomocą dyrektyw przetwarzania wstępnego int v1 [ N ], v2 [ N ], v3 [ N ]; #ifdefined(nvptx) #pragma omp zespoły docelowe dystrybuują równolegle dla map(to:v1,v2) map(from:v3) for ( int i = ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [
0
ja ]; #else #pragma omp cel równoległy dla map(to:v1,v2) map(from:v3) for ( int i = ; i < N ; i ++ ) v3 [ i ] = v1 [ i ] * v2 [ i ] ; #endif // adaptacja kodu za pomocą metadyrektyw w OpenMP 5.0 int v1 [ N ], v2 [ N ], v3
0
[ N ]; #pragma omp target map(to:v1,v2) map(from:v3) #pragma omp metadirective \ when(device={arch(nvptx)}: zespoły docelowe rozprowadzają równolegle dla)\ default(target parallel for) for ( int ja = ; ja < N ; ja ++ ) v3 [ ja ] = v1 [ ja ] * v2 [ ja ];
Klauzule
Ponieważ OpenMP jest modelem programowania z pamięcią współdzieloną, większość zmiennych w kodzie OpenMP jest domyślnie widoczna dla wszystkich wątków. Ale czasami zmienne prywatne są niezbędne, aby uniknąć warunków wyścigu i istnieje potrzeba przekazywania wartości między częścią sekwencyjną a regionem równoległym (blok kodu wykonywany równolegle), więc zarządzanie środowiskiem danych jest wprowadzane jako klauzule atrybutów udostępniania danych poprzez dołączanie ich do dyrektywę OpenMP. Różne rodzaje klauzul to:
- Klauzule atrybutów udostępniania danych
- współdzielone : dane zadeklarowane poza regionem równoległym są współdzielone, co oznacza, że są widoczne i dostępne dla wszystkich wątków jednocześnie. Domyślnie wszystkie zmienne w regionie współdzielenia pracy są współużytkowane z wyjątkiem licznika iteracji pętli.
- private : dane zadeklarowane w regionie równoległym są prywatne dla każdego wątku, co oznacza, że każdy wątek będzie miał lokalną kopię i użyje jej jako zmiennej tymczasowej. Zmienna prywatna nie jest inicjowana, a wartość nie jest utrzymywana do użytku poza regionem równoległym. Domyślnie liczniki iteracji pętli w konstrukcjach pętli OpenMP są prywatne.
- default : pozwala programiście określić, że domyślnym zakresem danych w regionie równoległym będzie współdzielony lub żaden dla C/C++ lub współdzielony , pierwszy prywatny , prywatny lub żaden dla Fortran. Opcja none zmusza programistę do zadeklarowania każdej zmiennej w regionie równoległym przy użyciu klauzul atrybutów współdzielenia danych.
- firstprivate : jak private , z wyjątkiem zainicjowania do oryginalnej wartości.
- lastprivate : podobnie jak prywatne , z wyjątkiem oryginalnej wartości, która jest aktualizowana po skonstruowaniu.
- redukcja : bezpieczny sposób łączenia pracy ze wszystkich wątków po konstrukcji.
- Klauzule synchronizacyjne
- krytyczny : załączony blok kodu będzie wykonywany tylko przez jeden wątek naraz, a nie jednocześnie przez wiele wątków. Jest często używany do ochrony udostępnianych danych przed wyścigami .
- atomic : aktualizacja pamięci (zapis lub odczyt-modyfikacja-zapis) w następnej instrukcji zostanie przeprowadzona atomowo. Nie sprawia, że całe stwierdzenie jest atomowe; tylko aktualizacja pamięci jest atomowa. Kompilator może użyć specjalnych instrukcji sprzętowych w celu uzyskania lepszej wydajności niż w przypadku korzystania z krytycznych plików .
- uporządkowany : blok strukturalny jest wykonywany w kolejności, w jakiej iteracje byłyby wykonywane w pętli sekwencyjnej
- bariera : każdy wątek czeka, aż wszystkie inne wątki zespołu osiągną ten punkt. Konstrukcja współdzielenia pracy ma na końcu niejawną synchronizację bariery.
- nowait : określa, że wątki kończące przydzieloną pracę mogą być kontynuowane bez czekania na zakończenie wszystkich wątków w zespole. W przypadku braku tej klauzuli wątki napotykają barierę synchronizacji na końcu konstrukcji współdzielenia pracy.
- Klauzule harmonogramowe
-
harmonogram (typ, porcja) : jest to przydatne, jeśli konstrukcja podziału pracy jest pętlą do-loop lub for-loop. Iteracje w konstrukcji współdzielenia pracy są przypisywane do wątków zgodnie z metodą planowania zdefiniowaną w tej klauzuli. Trzy rodzaje planowania to:
- static : Tutaj wszystkim wątkom przydzielane są iteracje przed wykonaniem iteracji pętli. Iteracje są domyślnie równo dzielone między wątki. Jednak określenie liczby całkowitej dla fragmentu parametru spowoduje przydzielenie numeru fragmentu ciągłych iteracji do określonego wątku.
- dynamic : Tutaj niektóre iteracje są przydzielane do mniejszej liczby wątków. Gdy określony wątek zakończy przydzieloną mu iterację, powraca, aby uzyskać kolejną z pozostałych iteracji. Fragment parametru definiuje liczbę ciągłych iteracji, które są przydzielane do wątku naraz.
- z przewodnikiem : Duży fragment ciągłych iteracji jest przydzielany dynamicznie do każdego wątku (jak powyżej). Rozmiar porcji zmniejsza się wykładniczo z każdą kolejną alokacją do minimalnego rozmiaru określonego w porcji parametru
- JEŻELI kontroluje,
- jeśli : Spowoduje to, że wątki zrównoleglą zadanie tylko wtedy, gdy zostanie spełniony warunek. W przeciwnym razie blok kodu jest wykonywany szeregowo.
- Inicjalizacja
- firstprivate : dane są prywatne dla każdego wątku, ale inicjowane przy użyciu wartości zmiennej o tej samej nazwie z wątku głównego.
- lastprivate : dane są prywatne dla każdego wątku. Wartość tych danych prywatnych zostanie skopiowana do zmiennej globalnej o tej samej nazwie poza regionem równoległym, jeśli bieżąca iteracja jest ostatnią iteracją w pętli równoległej. Zmienna może być zarówno firstprivate , jak i lastprivate .
- threadprivate : Dane są danymi globalnymi, ale są prywatne w każdym regionie równoległym w czasie wykonywania. Różnica między wątkiem prywatnym a prywatnym polega na globalnym zasięgu powiązanym z wątkiem prywatnym i zachowaną wartością w regionach równoległych.
- Kopiowanie danych
- copyin : podobnie jak firstprivate dla zmiennych prywatnych , zmienne wątkuprywatne nie są inicjowane, chyba że użyto copyin do przekazania wartości z odpowiednich zmiennych globalnych. Kopiowanie nie jest potrzebne, ponieważ wartość zmiennej wątku prywatnego jest utrzymywana przez cały czas wykonywania całego programu.
- copyprivate : używany z single do obsługi kopiowania wartości danych z obiektów prywatnych w jednym wątku ( pojedynczy wątek) do odpowiednich obiektów w innych wątkach w zespole.
- redukcji
- (operator | intrinsic: list) : zmienna ma kopię lokalną w każdym wątku, ale wartości kopii lokalnych zostaną podsumowane (zredukowane) do globalnej zmiennej współdzielonej. Jest to bardzo przydatne, jeśli konkretna operacja (określona w operator dla tej konkretnej klauzuli) na zmiennej jest wykonywana iteracyjnie, tak że jej wartość w określonej iteracji zależy od jej wartości w poprzedniej iteracji. Kroki prowadzące do przyrostu operacyjnego są równoległe, ale wątki aktualizują zmienną globalną w sposób bezpieczny dla wątków. Byłoby to wymagane przy równoległym całkowaniu numerycznym funkcji i równań różniczkowych , jako typowy przykład.
- Inni
- flush : Wartość tej zmiennej jest przywracana z rejestru do pamięci w celu użycia tej wartości poza częścią równoległą
- master : Wykonywany tylko przez wątek główny (wątek, który rozwidlił wszystkie pozostałe podczas wykonywania dyrektywy OpenMP). Brak ukrytej bariery; inni członkowie zespołu (wątki) nie muszą sięgać.
Procedury uruchomieniowe na poziomie użytkownika
Służy do modyfikowania/sprawdzania liczby wątków, wykrywania, czy kontekst wykonania znajduje się w regionie równoległym, liczby procesorów w bieżącym systemie, ustawiania/zwalniania blokad, funkcji synchronizacji itp.
Zmienne środowiska
Metoda zmiany funkcji wykonawczych aplikacji OpenMP. Służy do kontrolowania planowania iteracji pętli, domyślnej liczby wątków itp. Na przykład OMP_NUM_THREADS służy do określania liczby wątków dla aplikacji.
Implementacje
OpenMP został zaimplementowany w wielu komercyjnych kompilatorach. Na przykład obsługują go Visual C++ 2005, 2008, 2010, 2012 i 2013 (OpenMP 2.0, w wersjach Professional, Team System, Premium i Ultimate), a także Intel Parallel Studio dla różnych procesorów. Kompilatory i narzędzia Oracle Solaris Studio obsługują najnowsze specyfikacje OpenMP z ulepszeniami wydajności dla systemów operacyjnych Solaris (UltraSPARC i x86/x64) oraz platform Linux. Kompilatory Fortran, C i C++ firmy The Portland Group obsługują również OpenMP 2.5. GCC obsługuje również OpenMP od wersji 4.2.
Kompilatory z implementacją OpenMP 3.0:
- GCC 4.3.1
- Kompilator Mercurium
- Kompilatory Intel Fortran i C/C++ w wersjach 11.0 i 11.1, Intel C/C++ i Fortran Composer XE 2011 oraz Intel Parallel Studio.
- Kompilator IBM XL
- Sun Studio 12 update 1 zawiera pełną implementację OpenMP 3.0
- Obliczenia wieloprocesorowe
Kilka kompilatorów obsługuje OpenMP 3.1:
- GCC 4.7
- Kompilatory Intel Fortran i C/C++ 12.1
- Kompilatory IBM XL C/C++ dla systemów AIX i Linux, wersja 13.1 oraz kompilatory IBM XL Fortran dla systemów AIX i Linux, wersja 14.1
- LLVM/Clang 3.7
- Absoft Fortran Compilers v. 19 dla systemów Windows, Mac OS X i Linux
Kompilatory obsługujące OpenMP 4.0:
- GCC 4.9.0 dla C/C++, GCC 4.9.1 dla Fortranu
- Kompilatory Intel Fortran i C/C++ 15.0
- IBM XL C/C++ dla systemu Linux, wersja 13.1 (częściowa) i XL Fortran dla systemu Linux, wersja 15.1 (częściowa)
- LLVM/Clang 3.7 (częściowy)
Kilka kompilatorów obsługujących OpenMP 4.5:
- GCC 6 dla C/C++
- Kompilatory Intel Fortran i C/C++ 17.0, 18.0, 19.0
- LLVM/Clang 12
Częściowe wsparcie dla OpenMP 5.0:
- GCC 9 dla C/C++
- Kompilatory Intel Fortran i C/C++ 19.1
- LLVM/Clang 12
Automatycznie równoległe kompilatory, które generują kod źródłowy opatrzony dyrektywami OpenMP:
- iPat/OMP
- Oprogramowanie równoległe
- PLUTON
- ROSE (platforma kompilatora)
- S2P firmy KPIT Cummins Infosystems Ltd.
- Porówn
- PragFormer
Kilka profilerów i debugerów wyraźnie obsługuje OpenMP:
- Intel VTune Profiler — narzędzie do profilowania procesorów x86 i procesorów graficznych X e
- Intel Advisor — narzędzie wspomagające projektowanie i analizujące kody OpenMP i MPI
- Allinea Distributed Debugging Tool (DDT) – debugger dla kodów OpenMP i MPI
- Allinea MAP – profiler dla kodów OpenMP i MPI
- TotalView - debugger firmy Rogue Wave Software dla kodów OpenMP, MPI i szeregowych
- ompP – profiler dla OpenMP
- VAMPIR – profiler dla kodu OpenMP i MPI
Plusy i minusy
Plusy:
- Przenośny kod wielowątkowy (w C/C++ i innych językach zazwyczaj trzeba wywołać prymitywy specyficzne dla platformy, aby uzyskać wielowątkowość).
- Proste: nie trzeba zajmować się przekazywaniem wiadomości, tak jak robi to MPI .
- Układ i dekompozycja danych jest obsługiwana automatycznie przez dyrektywy.
- Skalowalność porównywalna z MPI w systemach z pamięcią współdzieloną.
- Równoległość przyrostowa: można pracować nad jedną częścią programu w tym samym czasie, nie są potrzebne żadne radykalne zmiany w kodzie.
- Ujednolicony kod dla aplikacji szeregowych i równoległych: Konstrukcje OpenMP są traktowane jako komentarze, gdy używane są kompilatory sekwencyjne.
- Oryginalne (szeregowe) instrukcje kodu generalnie nie muszą być modyfikowane po zrównolegleniu z OpenMP. Zmniejsza to ryzyko nieumyślnego wprowadzenia błędów.
- Możliwy jest zarówno równoległość gruboziarnista, jak i drobnoziarnista .
- W nieregularnych aplikacjach wielofizycznych, które nie są zgodne wyłącznie z trybem obliczeń SPMD , jak ma to miejsce w ściśle powiązanych układach płyn-cząstka, elastyczność OpenMP może mieć dużą przewagę wydajności nad MPI .
- Może być używany z różnymi akceleratorami, takimi jak GPGPU i FPGA .
Cons:
- Ryzyko wprowadzenia trudnych do debugowania błędów synchronizacji i warunków wyścigu .
- Od 2017 r. Działa wydajnie tylko na platformach wieloprocesorowych z pamięcią współdzieloną (zobacz jednak Intel's Cluster OpenMP Archived 2018-11-16 na Wayback Machine i inne rozproszone platformy pamięci współdzielonej ).
- Wymaga kompilatora obsługującego OpenMP.
- Skalowalność jest ograniczona architekturą pamięci.
- Brak obsługi porównania i wymiany .
- Brak niezawodnej obsługi błędów.
- Brakuje precyzyjnych mechanizmów kontrolujących mapowanie procesora wątków.
- Duże prawdopodobieństwo przypadkowego napisania fałszywego kodu udostępniania.
Oczekiwania dotyczące wydajności
Można spodziewać się N -krotnego przyspieszenia podczas uruchamiania programu zrównoleglonego przy użyciu OpenMP na platformie z procesorami N. Jednak zdarza się to rzadko z następujących powodów:
- Gdy istnieje zależność, proces musi czekać, aż dane, od których zależy, zostaną obliczone.
- Gdy wiele procesów współużytkuje nierównoległy zasób dowodowy (taki jak plik do zapisu), ich żądania są wykonywane sekwencyjnie. W związku z tym każdy wątek musi czekać, aż drugi wątek zwolni zasób.
- Duża część programu może nie być zrównoleglona przez OpenMP, co oznacza, że teoretyczna górna granica przyspieszenia jest ograniczona zgodnie z prawem Amdahla .
- N procesorów w symetrycznym przetwarzaniu wieloprocesorowym (SMP) może mieć N-krotność mocy obliczeniowej, ale przepustowość pamięci zwykle nie zwiększa się N-krotnie. Dość często oryginalna ścieżka pamięci jest współdzielona przez wiele procesorów i można zaobserwować spadek wydajności, gdy konkurują one o przepustowość pamięci współdzielonej.
- Wiele innych typowych problemów wpływających na ostateczne przyspieszenie obliczeń równoległych dotyczy również OpenMP, takich jak równoważenie obciążenia i obciążenie związane z synchronizacją.
- Optymalizacja kompilatora może nie być tak efektywna podczas wywoływania OpenMP. Może to często prowadzić do tego, że jednowątkowy program OpenMP będzie działał wolniej niż ten sam kod skompilowany bez flagi OpenMP (która będzie w pełni szeregowa).
Powinowactwo wątków
Niektórzy dostawcy zalecają ustawienie koligacji procesora w wątkach OpenMP, aby powiązać je z określonymi rdzeniami procesora. Minimalizuje to migrację wątków i koszty przełączania kontekstu między rdzeniami. Poprawia również lokalizację danych i zmniejsza ruch związany ze spójnością pamięci podręcznej między rdzeniami (lub procesorami).
Wzorce
Opracowano wiele testów porównawczych, aby zademonstrować użycie OpenMP, przetestować jego wydajność i ocenić poprawność.
Proste przykłady
- OmpSCR: Repozytorium kodu źródłowego OpenMP
Benchmarki wydajności obejmują:
- Równoległy test porównawczy NAS
- Barcelona OpenMP Task Suite to zbiór aplikacji, które umożliwiają testowanie implementacji zadań OpenMP.
- Seria SPEC
- SPECYFIKACJA OMP 2012
- Zestaw testów porównawczych SPEC ACCEL testujący interfejs API odciążający cele OpenMP 4
- Test porównawczy SPEChpc 2002
- Benchmarki CORAL
- Aplikacje proxy w eksaskali
- Rodinia stawia na akceleratory.
- Pakiet testów porównawczych opartych na problemach
Benchmarki poprawności obejmują:
- Pakiet walidacyjny OpenMP
- Pakiet testów do walidacji i weryfikacji OpenMP
- DataRaceBench to zestaw testów porównawczych przeznaczony do systematycznej i ilościowej oceny skuteczności narzędzi OpenMP do wykrywania wyścigów danych.
- AutoParBench to zestaw testów porównawczych do oceny kompilatorów i narzędzi, które mogą automatycznie wstawiać dyrektywy OpenMP.
Zobacz też
Dalsza lektura
- Quinn Michael J, Programowanie równoległe w C z MPI i OpenMP McGraw-Hill Inc. 2004. ISBN 0-07-058201-7
- R. Chandra, R. Menon, L. Dagum, D. Kohr, D. Maydan, J. McDonald, Programowanie równoległe w OpenMP. Morgan Kaufmann, 2000. ISBN 1-55860-671-8
- R. Eigenmann (redaktor), M. Voss (redaktor), OpenMP Shared Memory Parallel Programming: International Workshop on OpenMP Applications and Tools, WOMPAT 2001, West Lafayette, IN, USA, 30–31 lipca 2001 r. (Notatki z wykładu w komputerze Nauka). Springer 2001. ISBN 3-540-42346-X
- B. Chapman, G. Jost, R. van der Pas, DJ Kuck (przedmowa), Korzystanie z OpenMP: przenośne programowanie równoległe w pamięci współdzielonej. The MIT Press (31 października 2007). ISBN 0-262-53302-2
- Przetwarzanie równoległe przez MPI i OpenMP, M. Firuziaan, O. Nommensen. Linux Enterprise, 10/2002
- Artykuł w magazynie MSDN na temat OpenMP
- Samouczek SC08 OpenMP zarchiwizowany 2013-03-19 w Wayback Machine (PDF) – Praktyczne wprowadzenie do OpenMP, Mattson and Meadows, od SC08 (Austin)
- Specyfikacje OpenMP zarchiwizowane 2021-03-02 w Wayback Machine
- Programowanie równoległe w Fortranie 95 przy użyciu OpenMP (PDF)