V pátek 26. dubna 2024 úderem 22 hodiny začíná naše nová
a opravdu velká série soutěží o nejlepší webovou stránku !!
Proto neváhejte a začněte hned zítra soutěžit o lákavé ceny !!

OpenMP

Z Multimediaexpo.cz

(Rozdíly mezi verzemi)
m (1 revizi)
(+ Vylepšení)
 
(Není zobrazena jedna mezilehlá verze.)
Řádka 1: Řádka 1:
 +
[[Soubor:OpenMP logo.png|thumb|200px|Logo architektury OpenMP]]
'''OpenMP''' je soustava direktiv pro [[překladač]] a knihovních procedur pro [[paralelní programování]]. Jedná se o standard pro programování počítačů se [[sdílená paměť|sdílenou pamětí]]. OpenMP usnadňuje vytváření vícevláknových [[počítačový program|programů]] v programovacích jazycích [[Fortran]], [[C (programovací jazyk)|C]] a [[C++]].
'''OpenMP''' je soustava direktiv pro [[překladač]] a knihovních procedur pro [[paralelní programování]]. Jedná se o standard pro programování počítačů se [[sdílená paměť|sdílenou pamětí]]. OpenMP usnadňuje vytváření vícevláknových [[počítačový program|programů]] v programovacích jazycích [[Fortran]], [[C (programovací jazyk)|C]] a [[C++]].
Řádka 4: Řádka 5:
== Programovací model OpenMP ==
== Programovací model OpenMP ==
-
 
Hlavní vlákno (master thread) vytváří podle potřeby skupinu podvláken. Paralelizace programu se pak provádí postupně s ohledem na výkon aplikace, tj. sekvenční program je postupně (podle možností) pararelizován.
Hlavní vlákno (master thread) vytváří podle potřeby skupinu podvláken. Paralelizace programu se pak provádí postupně s ohledem na výkon aplikace, tj. sekvenční program je postupně (podle možností) pararelizován.
-
 
-
[[Image:Threads2.gif|center]]
 
-
 
-
== OpenMP schéma řešení ==
 
-
[[Image:OMPSchema2.gif|center]]
 
== Programování v OpenMP ==
== Programování v OpenMP ==
Řádka 65: Řádka 60:
== Externí odkazy ==
== Externí odkazy ==
-
*[http://en.wikipedia.org/wiki/OpenMP]
+
*[http://en.wikipedia.org/wiki/OpenMP Wikipedia.org – OpenMP (anglicky)]
-
*[http://www.openmp.org/ The official site for OpenMP]
+
*[http://www.openmp.org/ The official site for OpenMP (anglicky)]
*[http://www.cOMPunity.org/ cOMPunity] Community of OpenMP Users, Researchers, Tool Developers and Providers
*[http://www.cOMPunity.org/ cOMPunity] Community of OpenMP Users, Researchers, Tool Developers and Providers
*[http://www.etnus.com/TotalView/Threads.html TotalView] A debugger for OpenMP programs
*[http://www.etnus.com/TotalView/Threads.html TotalView] A debugger for OpenMP programs

Aktuální verze z 3. 10. 2015, 22:13

Logo architektury OpenMP

OpenMP je soustava direktiv pro překladač a knihovních procedur pro paralelní programování. Jedná se o standard pro programování počítačů se sdílenou pamětí. OpenMP usnadňuje vytváření vícevláknových programů v programovacích jazycích Fortran, C a C++.

První OpenMP standard pro FORTRAN 1.0 byl publikován v roce 1997. Rok poté byl uvolněn standard pro C/C++. Standard verze 2.0 byl uvolněn pro FORTRAN v roce 2000 a pro C/C++ v roce 2002. Aktuální je verze 2.5, která byla jako kombinovaná pro jazyky C/C++/FORTRAN uvolněna v roce 2005.

Obsah

Programovací model OpenMP

Hlavní vlákno (master thread) vytváří podle potřeby skupinu podvláken. Paralelizace programu se pak provádí postupně s ohledem na výkon aplikace, tj. sekvenční program je postupně (podle možností) pararelizován.

Programování v OpenMP

OpenMP se spouští pomocí tzv. direktiv. K vytvoření skupiny vláken použijeme direktivu pragma:

#pragma omp parallel {
  ...  // každé vlákno vykonává příkazy tohoto bloku
}

K rozdělení práce cyklu mezi vlákna použijeme:

#pragma omp parallel for
for (i=0; i<N; i++) {
  ...  // každé vlákno vykoná část iterací
}

Klauzule modifikují direktivy:

  • Private(list) – pro určené proměnné se vytváří jejich kopie v každém vláknu
  • Reduction(op:list) – kombinuje (podle určené operace) lokálně spočítané hodnoty do privátní hodnoty uvedené v seznamu

Program hello.f90 v jazyce Fortran 90

program hello
  use omp_lib
  implicit none
  integer: nthr, myth
 !$omp parallel private(myth)
 !$omp single
  nthr=omp_get_num_threads() // OpenMP funkce (interface omp_lib, určí počet vláken a jeho index)
 !$omp end single
  myth=omp_get_thread_num()
  write(6,*) 'Hello from',myth, & // myth je lokální ve vlákně private, nthr je globální v procesu share
     & 'of',nthr
 !$omp end parallel
 end program hello

Tučně vyznačený kód provádějí všechna vlákna. Program zkompilujeme a použijeme přitom přepínač -openmp, který aktivuje OpenMP direktivy generující kód vláken:

ifort -openmp -o hello hello.f90

Zkompilovaný program spustíme. Všimněte si, že jednotlivé výstupy jsou v náhodném pořadí, protože pořadí není pro vlákna definováno:

export OMP_NUM_THREADS=4  // Definujeme počet použitých vláken v prostředí OpenMP
./hello
Hello from 0 of 4
Hello from 2 of 4
Hello from 3 of 4
Hello from 1 of 4

Kompilace pro sériový běh vyžaduje knihovnu openmp_stubs:

ifort -openmp_stubs -o hello hello.f90 -lpthread

Externí odkazy