OpenMP

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
OpenMP
software
Siglă
Tip API (nu este listat )
Dezvoltator OpenMP Architecture Review Board
Ultima versiune 5.0 (8 noiembrie 2018)
Sistem de operare Multiplatform
Limba C.
C ++
Site-ul web www.openmp.org/

OpenMP (Open Multiprocessing) este un API multiplataforma pentru crearea de aplicații paralele pe sisteme de memorie partajată. Este susținut de diferite limbaje de programare, cum ar fi C / C ++ și Fortran și pe diferite arhitecturi de computere și sisteme de operare, inclusiv Solaris , AIX , HP-UX , Linux , macOS și platforma Windows . OpenMP este compus dintr-un set de directive de compilare , rutine de bibliotecă și variabile de mediu care definesc funcționarea sa în timpul rulării. [1] [2] [3]

OpenMP este administrat de consorțiul non-profit OpenMP Architecture Review Board (sau OpenMP ARB) împreună cu un grup de producători de hardware și dezvoltatori de software precum AMD , IBM , Intel , Cray Inc. , Hewlett-Packard , Fujitsu , NVIDIA Corporation , NEC Corporation , Microsoft Corporation , Texas Instruments , Oracle și altele.

OpenMP folosește un model scalabil și portabil care oferă programatorului o interfață simplă și flexibilă pentru a dezvolta aplicații de calcul paralele care pot rula de la un computer desktop standard la supercomputere [4] .

O aplicație dezvoltată cu modelul hibrid de programare paralelă poate rula pe un computer cluster utilizând OpenMP și Message Passing Interface (MPI) sau folosind în mod transparent extensii OpenMP pentru sisteme de memorie non-partajate.

Introducere

OpenMP este o implementare a conceptului de multithreading care este o metodă de paralelizare prin care un fir principal (o serie de instrucțiuni executate consecutiv) creează un anumit număr de fire de tip slave și o sarcină (proces) este împărțită între diferitele fire de tip slave . Subiectele rulează simultan în timp ce sistemul de execuție alocă subiectele procesorelor disponibile.

Secțiunea de cod pe care intenționați să o executați în paralel este marcată printr-o directivă specială care determină crearea de fire înainte de execuție. Fiecare fir este identificat printr-un id care poate fi obținut prin funcția omp_get_thread_num() . Această valoare este întreagă și pentru firul master este 0. La sfârșitul execuției codului paralelizat, firele slave returnează controlul la firul principal care continuă executarea până la sfârșitul programului.

În mod implicit, fiecare fir execută secțiunea paralelizată a codului independent. Construcțiile speciale pentru împărțirea muncii (numite constructe de partajare a lucrului ) vă permit să împărțiți sarcina între firele disponibile, astfel încât fiecare dintre ele să își execute propria bucată de cod. Paralelismul la nivel de fir și paralelism la nivel de date se realizează prin OpenMP în acest fel.

Mediul de execuție alocă fire de procesare în funcție de diferiți factori, inclusiv încărcarea mașinii. În C / limbajul C ++, funcțiile implementate de standardul OpenMP sunt incluse într - un fișier antet numit omp.h.

Istorie

OpenMP Architecture Review Board (ARB) a lansat primele specificații pentru aceste API-uri numite apoi OpenMP pentru Fortran 1.0 în octombrie 1997 . Tot în octombrie anul următor au fost apoi puse la dispoziție pentru limbajul C / C ++. În anul 2000, specificațiile versiunii 2.0 pentru limba Fortran au apărut, în timp ce în 2002 au fost lansate pentru C / C ++. În 2005 au fost lansate specificațiile 2.5 (atât pentru limbile C / C ++, cât și pentru limbile Fortran) și în mai 2008 pentru cele 3.0. Specificațiile 3.1 au fost lansate pe 9 iulie 2011 . În prezent, cea mai recentă specificație este versiunea 4.0 lansată în iulie 2013 .

Elementele fundamentale

Diagramă cu construcții OpenMP.

Elementele fundamentale ale OpenMP sunt construcțiile pentru crearea de fire de execuție, pentru distribuirea sarcinilor de lucru ( partajarea de lucru ), gestionarea mediului de date, sincronizarea firelor, rutine de execuție la nivel de utilizator și variabile de mediu. În limbajul C / C ++, se utilizează directiva #pragma .

  • Crearea de fire

Directiva #pragma omp parallel este utilizată pentru crearea de fire suplimentare. Firul original se numește fir principal și are ID 0 ca identificator.

Exemplu (în C): afișați șirul „Bună ziua, lume” folosind mai multe fire.

 #include <stdio.h>

int main ( nul )
{
  #pragma omp parallel
    printf ( "Bună ziua, lume. \ n " );
  retur 0 ;
}

Semnalizatorul -fopenmp este utilizat pentru a compila folosind compilatorul GCC :

 $ gcc -fopenmp hello.c -o hello

Ieșirea pe un computer cu 2 nuclee și 2 fire este următoarea:

 Salut Lume.
Salut Lume.

Ieșirea poate fi de neînțeles din cauza fenomenului condiției Race datorită celor două fire care partajează ieșirea standard .

 Bună, wBună, woorld.
rld.
  • Lucrări de partajare

Acestea sunt utilizate pentru a atribui sarcini independente unuia sau tuturor firelor.

    • omp for sau omp do : împarte bucla de bucle pe fire. Se mai numește și construcție de buclă .
    • secțiuni : Atribuiți un bloc de cod consecutiv, dar independent, la diferite fire.
    • single : atribuie un bloc de cod care va fi executat de un singur fir.
    • master : similar modului unic , dar blocul de cod va fi executat numai de firul master.

Exemplu: inițializați valoarea într-o matrice paralelă utilizând fiecare fir pentru a face treaba

 int main ( int argc , char * argv []) {
    const int N = 100000 ;
    int i , a [ N ];

    #pragma omp paralelă pentru
    pentru ( i = 0 ; i < N ; i ++ )
        a [ i ] = 2 * i ;

    retur 0 ;
}
  • Clauze OpenMP (gestionarea mediului de date)

Deoarece OpenMP este un model de programare pentru sisteme de memorie partajată , majoritatea variabilelor sunt vizibile, în mod implicit, pentru toate firele. Uneori, totuși, sunt necesare variabile private pentru a evita fenomenele Condiții de rasă sau este necesară transmiterea valorilor între partea secvențială a programului și partea paralelă. Din acest motiv, managementul mediului definește atributele de partajare.

Notă

  1. ^ http://openmp.org/wp/openmp-compilers/ OpenMP Compilers
  2. ^ http://openmp.org/wp/2008/10/openmp-tutorial-at-supercomputing-2008/ OpenMP Tutorial la Supercomputing 2008
  3. ^ http://openmp.org/wp/2009/04/download-book-examples-and-discuss/ Utilizarea OpenMP - Programare paralelă cu memorie partajată portabilă - Descărcați exemple de cărți și discutați
  4. ^ http://openmp.org/wp/2008/11/openmp-30-status/ Stare OpenMP 3.0

Alte proiecte

linkuri externe