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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow