Openmp

OpenMP ( Open Multi-Processing ) je otevřený standard pro paralelizaci programů v C , C++ a Fortran . Poskytuje popis sady direktiv kompilátoru , procedur knihoven a proměnných prostředí , které jsou určeny pro programování vícevláknových aplikací na víceprocesorových systémech se sdílenou pamětí .

Specifikace standardu je vypracována neziskovou organizací OpenMP Architecture Review Board (ARB) [1] , která zahrnuje všechny významné výrobce procesorů a také řadu superpočítačových laboratoří a univerzit. První verze specifikace byla vydána v roce 1997, určená pouze pro Fortran, následující rok byla vydána verze pro C a C++.

OpenMP implementuje paralelní výpočty pomocí multithreadingu , ve kterém hlavní vlákno vytvoří sadu podřízených vláken a úloha je mezi  ně rozdělena . Vlákna mají běžet paralelně na stroji s více procesory (počet procesorů nemusí být větší nebo roven počtu vláken).

Úlohy vykonávané vlákny paralelně, stejně jako data potřebná k provádění těchto úloh, jsou popsány pomocí speciálních direktiv preprocesoru odpovídajícího jazyka - "pragmas". Například sekci Fortran kódu, která musí být provedena několika vlákny, z nichž každé má svou vlastní kopii proměnné N, předchází následující direktiva:!$OMP PARALLEL PRIVATE(N)

Počet vytvořených vláken může být regulován jak samotným programem voláním knihovních procedur, tak zvenčí pomocí proměnných prostředí.

Klíčové prvky standardu:

Příklady

Program Fortran-77, který vytváří dříve neznámý počet vláken (je určen proměnnou prostředí OMP_NUM_THREADSpřed spuštěním programu), z nichž každé vytiskne pozdrav spolu se svým vlastním číslem; úvodní vlákno (číslované 0) také vypíše celkový počet vláken, ale až poté, co všechna „prošla“ direktivou BARRIER:

PROGRAM HELLO INTEGER ID , NTHRDS INTEGER OMP_GET_THREAD_NUM , OMP_GET_NUM_THREADS C $ OMP PARALELNÍ PRIVATE ( ID ) ID = OMP_GET_THREAD_NUM () TISK * , ' HELLO WORLD FROM THREAD ) ' ( HELLO WORLD OMP THREAD ) ' B. PRARRI ID * . , 'TERE ARE' , NTHRDS , 'THREADS' END IF C$OMP END PARALEL END

C program, který přidává deset vláken pole a-to-array b(zkompilované s gcc-4.4 a později s příznakem -fopenmp ):

#include <stdio.h> #include <omp.h> #definujte N 100 int main ( int argc , char * argv []) { dvojité a [ N ], b [ N ], c [ N ]; int i ; omp_set_dynamic ( 0 ); // zabrání knihovně openmp ve změně počtu vláken během provádění omp_set_num_threads ( 10 ); // nastavte počet vláken na 10 // inicializovat pole pro ( i = 0 ; i < N ; i ++ ) { a [ i ] = i * 1,0 ; b [ i ] = i * 2,0 ; } // výpočet součtu polí #pragma omp parallel for shared(a, b, c) private(i) for ( i = 0 ; i < N ; i ++ ) c [ i ] = a [ i ] + b [ i ]; printf ( "%f \n " , c [ 10 ]); návrat 0 ; }

Implementace

OpenMP je podporováno mnoha moderními kompilátory.

Kompilátory Sun Studio podporují specifikaci OpenMP 2.5 [2] s podporou operačního systému Solaris ; Podpora Linuxu je plánována pro další vydání[ specifikovat ] . Tyto kompilátory vytvoří samostatnou proceduru ze zdrojového kódu umístěného pod direktivou parallela místo direktivy samotné vloží volání __mt_MasterFunction_knihovní procedury libmtsk, které předá adresu uměle vytvořené. Sdílená ( sdílená ) data tedy mohou být předána jako poslední odkazem a vlastní ( private ) jsou deklarována uvnitř této procedury, přičemž jsou nezávislá na jejich kopiích v jiných vláknech. Procedura __mt_MasterFunction_vytvoří skupinu vláken (číslo 9 v příkladu C výše), která spustí kód konstruktu parallel, a vlákno, které ji volalo, se stane hlavním vláknem ve skupině. Poté hlavní vlákno organizuje práci podřízených vláken a poté začne provádět samotný uživatelský kód. Když je kód hotový, hlavní vlákno zavolá rutinu _mt_EndOfTask_Barrier_, která jej synchronizuje s ostatními.

Visual C++ 2005 a 2008 podporuje OpenMP 2.0 v edicích Professional a Team System, 2010 v edicích Professional, Premium a Ultimate, 2012 ve všech edicích [3] .

GCC 4.2 zavedlo podporu OpenMP pro C, C++ a Fortran (založené na gfortran ) a některé distribuce (jako Fedora Core 5) zahrnuly podporu do GCC 4.1. Clang a LLVM 3.7 podporují OpenMP 3.1 . [4] .

Intel C++ Compiler , Intel Fortran Compiler a Intel Parallel Studio podporují OpenMP verze 3.0 a také Intel Cluster OpenMP pro programování distribuované paměti. Existují také implementace v kompilátoru IBM XL, PGI (skupina Portland), Pathscale, kompilátory HP[ specifikovat ] .

Viz také

Poznámky

  1. Oficiální web OpenMP Architecture Review Board (downlink) . Datum přístupu: 15. ledna 2008. Archivováno z originálu 20. července 2008. 
  2. 1. Představení OpenMP API (Sun Studio 12: OpenMP API User's Guide) – Sun Microsystems
  3. Vydání Visual C++ . Datum přístupu: 15. ledna 2008. Archivováno z originálu 23. dubna 2008.
  4. OpenMP.org » Archiv blogu » Clang 3.7 bude mít plnou podporu OpenMP 3.1 . openmp.org. Získáno 3. září 2015. Archivováno z originálu 5. září 2015.

Odkazy

Intel Software Network  (ruština) viva64.com  (ruština) Jiné zdroje