openmp Handledning
Komma igång med openmp
Sök…
Anmärkningar
OpenMP (Open MultiProcessing) är en parallell programmeringsmodell baserad på kompilatordirektiv som gör att applikationsutvecklare stegvis kan lägga till parallellitet till sina applikationskoder.
OpenMP API-specifikation för parallell programmering tillhandahåller ett applikationsprogrammeringsgränssnitt (API) som stöder multiprocesseringsprogrammering för flera plattformar i C, C ++ och Fortran på de flesta plattformar. Det består av en uppsättning kompilatordirektiv, bibliotekrutiner och miljövariabler som påverkar körtidens beteende.
Eftersom OpenMP fokuserar på parallelliteten i en nod (multipelbearbetning av delat minne) kan det kombineras med meddelanden som passerar programmeringsmodeller, till exempel MPI, för att köra på flera noder.
versioner
Version | Språk | Utgivningsdatum |
---|---|---|
4,5 | C / C ++ / Fortran | 2015/11/01 |
4,0 | C / C ++ / Fortran | 2013/07/01 |
3,1 | C / C ++ / Fortran | 2011-07-01 |
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 ++ | 1998/10/01 |
1.0f | Fortran | 1997/10/01 |
Kompilering
Det finns många kompilatorer som stöder olika versioner av OpenMP-specifikationen. OpenMP har en lista här med kompilatorn som stöder den och den version som stöds. För att sammanställa (och länka) ett program med OpenMP-stöd behöver du generellt bara lägga till en kompileringsflagga och om du använder OpenMP API måste du inkludera OpenMP-huvudet (omp.h). Medan rubrikfilen har ett fast namn beror kompileringsflaggan på kompilatorn. Följande är en icke uttömmande lista över kompilatorer och flaggan som möjliggör OpenMP.
- GCC (inklusive gcc, g ++ och gfortran):
-fopenmp
- LLVM: -fopenmp
- Intel kompilator-svit (inklusive icc, icpc och ifort):
-qopenmp
(och-fopenmp
för kompatibilitet med GCC / LLVM) - IBM XL-kompilator-svit (inklusive xlc, xlC och xlf):
-xlsmp=omp
- PGI compiler-suite (inklusive pgcc pgc ++ pgfortran): '-mp'
Parallell hejvärld med 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;
}
Den här koden skapar helt enkelt ett team av trådar (enligt miljövariabeln OMP_NUM_THREADS
- och om inte definierat skapar en per logisk kärna i systemet) och varje tråd identifierar sig själv förutom att skriva ut det typiska Hello-världsmeddelandet.
Work Sharing construct - Exempel på For loop
double res[MAX]; int i;
#pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
}
For-loopen kommer att köras parallellt. enormt () är en metod som kan ta för lång tid att få köra. OpenMP stöder en genväg för att skriva ovanstående kod som:
double res[MAX]; int i;
#pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
Vi kan också ha en schematisk klausul som påverkar hur loop-iterationer mappas till trådar. Till exempel:
#pragma omp parallel
#pragma omp for schedule(static)
for(i=0;I<N;i++) {
a[i] = a[i] + b[i];
}
Olika stilar för schemaläggning är:
schema (statisk [, bit])
Dela ut block med iterationer av storleken "bit" till varje tråd.
Om det inte anges: fördela så jämnt som möjligt till tillgängliga trådar
schema (dynamisk [, bit])
Varje tråd tar "chunk"-iterationer från en kö tills alla iterationer har hanterats.
schema (guidad [, bit])
Trådar dynamiskt ta tag i iterationsblock. Storleken på blocket börjar stort och krymper till storleken "bit" när beräkningen fortskrider.
schema (runtime)
Schemalägg och storleksstorlek taget från OMP_SCHEDULE-miljövariabeln.
Exempel på reduktion
#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;
}
}
I den sista raden: Lade faktiskt till en privat kopia och kombineras sedan efter slingan. Compiler tar hand om detaljerna.