Openmp

OpenMP ( Open Multi-Processing ) este un standard deschis pentru paralelizarea programelor în C , C++ și Fortran . Oferă o descriere a unui set de directive de compilator , proceduri de bibliotecă și variabile de mediu care sunt destinate programării aplicațiilor cu mai multe fire pe sisteme multiprocesor cu memorie partajată .

Specificația standardului este dezvoltată de organizația non-profit OpenMP Architecture Review Board (ARB) [1] , care include toți producătorii importanți de procesoare, precum și o serie de laboratoare și universități de supercalculatură. Prima versiune a specificației a fost lansată în 1997, destinată doar pentru Fortran, în anul următor a fost lansată o versiune pentru C și C++.

OpenMP implementează calculul paralel folosind multithreading , în care firul principal creează un set de fire slave, iar sarcina este distribuită între  ele . Firele ar trebui să ruleze în paralel pe o mașină cu mai multe procesoare (numărul de procesoare nu trebuie să fie mai mare sau egal cu numărul de fire).

Sarcinile efectuate de fire în paralel, precum și datele necesare pentru îndeplinirea acestor sarcini, sunt descrise folosind directive speciale ale preprocesorului limbajului corespunzător - „pragmas”. De exemplu, o secțiune de cod Fortran care trebuie executată de mai multe fire de execuție, fiecare dintre ele având propria sa copie a variabilei N, este precedată de următoarea directivă:!$OMP PARALLEL PRIVATE(N)

Numărul de fire create poate fi reglat atât de programul însuși prin apelarea procedurilor de bibliotecă, cât și din exterior, prin utilizarea variabilelor de mediu.

Elementele cheie ale standardului:

Exemple

Un program Fortran-77 care creează un număr necunoscut anterior de fire de execuție (este determinat de o variabilă de mediu OMP_NUM_THREADSînainte de a porni programul), fiecare dintre ele imprimând un salut împreună cu propriul număr; firul principal (numerotat 0) tipărește și numărul total de fire, dar numai după ce toate au „trecut” directiva BARRIER:

PROGRAM HELLO INTEGER ID , NTHRDS INTEGER OMP_GET_THREAD_NUM , OMP_GET_NUM_THREADS C $OMP PARALLEL PRIVATE ( ID ) ID = OMP_GET_THREAD_NUM () PRINT * , ' HELLO WORLD FROM THREAD' , ID C$ OMP ID BARRIER . ) ) ( IF OMP BARRIER . ) 0 , „EXISTA” , NTHRDS , „THREADS” END IF C$OMP END PARALLEL END

Program C care adaugă zece fire de execuție array a-to-array b(compilat cu gcc-4.4 și mai târziu cu flag -fopenmp ):

#include <stdio.h> #include <omp.h> #definiți N 100 int main ( int argc , char * argv []) { dublu a [ N ], b [ N ], c [ N ]; int i ; omp_set_dynamic ( 0 ); // împiedică biblioteca openmp să modifice numărul de fire în timpul execuției omp_set_num_threads ( 10 ); // setează numărul de fire la 10 // inițializați tablourile pentru ( i = 0 ; i < N ; i ++ ) { a [ i ] = i * 1,0 ; b [ i ] = i * 2,0 ; } // calculează suma de tablouri #pragma omp paralel pentru shared(a, b, c) private(i) for ( i = 0 ; i < N ; i ++ ) c [ i ] = a [ i ] + b [ i ]; printf ( "%f \n " , c [ 10 ]); returnează 0 ; }

Implementări

OpenMP este suportat de multe compilatoare moderne.

Compilatoarele Sun Studio acceptă specificația OpenMP 2.5 [2] cu suport pentru sistemul de operare Solaris ; Suport Linux este planificat pentru următoarea versiune[ specificați ] . Acești compilatori creează o procedură separată de codul sursă aflat sub directivă parallelși, în loc de directivă în sine, introduc un apel la procedura __mt_MasterFunction_bibliotecii libmtsk, transmițându-i adresa uneia creată artificial. Astfel, datele partajate ( shared ) pot fi transmise ultimele prin referință, iar propriile ( private ) sunt declarate în cadrul acestei proceduri, fiind independente de copiile lor în alte fire. Procedura __mt_MasterFunction_creează un grup de fire de execuție (numărul 9 în exemplul C de mai sus) care va executa codul constructului parallel, iar firul de execuție care l-a numit devine firul principal în grup. Apoi firul principal organizează munca firelor slave, după care începe să execute propriul cod de utilizator. Când codul este terminat, firul principal apelează o rutină _mt_EndOfTask_Barrier_care o sincronizează cu celelalte.

Visual C++ 2005 și 2008 acceptă OpenMP 2.0 în edițiile Professional și Team System, 2010 în edițiile Professional, Premium și Ultimate, 2012 în toate edițiile [3] .

GCC 4.2 a introdus suport OpenMP pentru C, C++ și Fortran (bazat pe gfortran ), iar unele distribuții (cum ar fi Fedora Core 5) au inclus suport în GCC 4.1. Clang și LLVM 3.7 acceptă OpenMP 3.1 . [4] .

Intel C++ Compiler , Intel Fortran Compiler și Intel Parallel Studio acceptă OpenMP versiunea 3.0, precum și Intel Cluster OpenMP pentru programarea cu memorie distribuită. Există, de asemenea, implementări în compilatorul IBM XL, PGI (grupul Portland), Pathscale, compilatoarele HP[ specificați ] .

Vezi și

Note

  1. Site-ul oficial al OpenMP Architecture Review Board (link în jos) . Data accesului: 15 ianuarie 2008. Arhivat din original la 20 iulie 2008. 
  2. 1. Prezentarea API-ului OpenMP (Sun Studio 12: Ghidul utilizatorului API OpenMP) - Sun Microsystems
  3. Edițiile Visual C++ . Data accesului: 15 ianuarie 2008. Arhivat din original la 23 aprilie 2008.
  4. OpenMP.org » Blog Archive » Clang 3.7 va avea suport complet OpenMP 3.1 . openmp.org. Consultat la 3 septembrie 2015. Arhivat din original pe 5 septembrie 2015.

Link -uri

Intel Software Network  (rusă) viva64.com  (rusă) Alte surse