openmp Samouczek
Rozpoczęcie pracy z openmp
Szukaj…
Uwagi
OpenMP (Open MultiProcessing) to model programowania równoległego oparty na dyrektywach kompilatora, który pozwala twórcom aplikacji na stopniowe dodawanie równoległości do kodów aplikacji.
Specyfikacja API OpenMP dla programowania równoległego zapewnia interfejs programowania aplikacji (API), który obsługuje wieloplatformowe programowanie wieloplatformowej pamięci współużytkowanej w C, C ++ i Fortran na większości platform. Składa się z zestawu dyrektyw kompilatora, procedur bibliotecznych i zmiennych środowiskowych, które wpływają na zachowanie w czasie wykonywania.
Ponieważ OpenMP koncentruje się na równoległości w obrębie węzła (wieloprocesowe przetwarzanie pamięci współużytkowanej), można go łączyć z modelami programowania przekazywania wiadomości, takimi jak MPI, w celu wykonania na wielu węzłach.
Wersje
Wersja | Język | Data wydania |
---|---|---|
4.5 | C / C ++ / Fortran | 01.11.2015 |
4.0 | C / C ++ / Fortran | 01.07.2013 |
3.1 | C / C ++ / Fortran | 01.07.2011 |
3.0 | C / C ++ / Fortran | 2008-05-01 |
2.5 | C / C ++ / Fortran | 2005-05-01 |
2.0c | C / C ++ | 2002-03-01 |
2.0f | Fortran | 2000-11-01 |
1.0c | C / C ++ | 01.10.1998 |
1.0f | Fortran | 01.10.1997 |
Kompilacja
Istnieje wiele kompilatorów, które obsługują różne wersje specyfikacji OpenMP. OpenMP utrzymuje tutaj listę kompilatora, który ją obsługuje i obsługiwaną wersję. Zasadniczo, aby skompilować (i połączyć) aplikację z obsługą OpenMP, wystarczy dodać flagę kompilacji, a jeśli używasz OpenMP API, musisz dołączyć nagłówek OpenMP (omp.h). Chociaż plik nagłówka ma stałą nazwę, flaga kompilacji zależy od kompilatora. Poniżej znajduje się niewyczerpująca lista kompilatorów i flaga, która włącza OpenMP.
- GCC (w tym gcc, g ++ i gfortran):
-fopenmp
- LLVM: -fopenmp
- Pakiet kompilatora Intel (w tym icc, icpc i ifort):
-qopenmp
(i-fopenmp
dla kompatybilności z GCC / LLVM) - Pakiet kompilatora IBM XL (w tym xlc, xlC i xlf):
-xlsmp=omp
- Pakiet kompilatora PGI (w tym pgcc pgc ++ pgfortran): „-mp”
Równoległy świat cześć za pomocą OpenMP
#include <omp.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
#pragma omp parallel
{
printf ("Hello world! I'm thread %d out of %d threads.\n",
omp_get_thread_num(), omp_get_num_threads());
}
return 0;
}
Ten kod po prostu tworzy zespół wątków (zgodnie ze zmienną środowiskową OMP_NUM_THREADS
- i jeśli nie zdefiniowany, utworzy jeden na rdzeń logiczny w systemie), a każdy wątek zidentyfikuje się oprócz drukowania typowego komunikatu Hello world.
Konstrukcja podziału pracy - przykład pętli For
double res[MAX]; int i;
#pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
}
Pętla for zostanie wykonana równolegle. huge () to metoda, której wykonanie może potrwać zbyt długo. OpenMP obsługuje skrót do pisania powyższego kodu jako:
double res[MAX]; int i;
#pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
Możemy również mieć klauzulę harmonogramu, która wpływa na sposób mapowania iteracji pętli na wątki. Na przykład:
#pragma omp parallel
#pragma omp for schedule(static)
for(i=0;I<N;i++) {
a[i] = a[i] + b[i];
}
Różne style planowania to:
harmonogram (statyczny [, fragment])
Rozłóż bloki iteracji o wielkości „fragmentu” do każdego wątku.
Jeśli nie określono: przydziel możliwie równomiernie dostępne wątki
harmonogram (dynamiczny [, fragment])
Każdy wątek chwyta „kolejkę” iteracji z kolejki, aż wszystkie iteracje zostaną obsłużone.
harmonogram (z przewodnikiem [, fragment])
Wątki dynamicznie chwytają bloki iteracji. Rozmiar bloku zaczyna się od dużego, a wraz z postępem obliczeń zmniejsza się do rozmiaru „fragmentu”.
harmonogram (środowisko wykonawcze)
Wielkość harmonogramu i porcji pochodzi ze zmiennej środowiskowej OMP_SCHEDULE.
Przykład redukcji
#include <omp.h>
void main ()
{
int i;
double ZZ, func(), res=0.0;
#pragma omp parallel for reduction(+:res) private(ZZ)
for (i=0; i< 1000; i++){
ZZ = func(I);
res = res + ZZ;
}
}
W ostatnim wierszu: faktycznie dodany do kopii prywatnej, a następnie połączony po pętli. Kompilator dba o szczegóły.