close

Openmp

Vai alla navigazione Vai alla ricerca

OpenMP ( Open Multi-Processing ) è uno standard aperto per parallelizzare i programmi in C , C++ e Fortran . Fornisce una descrizione di un insieme di direttive del compilatore , procedure di libreria e variabili di ambiente destinate alla programmazione di applicazioni multithread su sistemi multiprocessore con memoria condivisa .

La specifica dello standard è sviluppata dall'organizzazione no-profit OpenMP Architecture Review Board (ARB) [1] , che comprende tutti i principali produttori di processori, nonché numerosi laboratori di supercalcolo e università. La prima versione della specifica è stata rilasciata nel 1997, destinata solo a Fortran, l'anno successivo è stata rilasciata una versione per C e C++.

OpenMP implementa il calcolo parallelo utilizzando il multithreading , in cui il thread principale crea un insieme di thread slave e l'attività viene distribuita tra  di loro . I thread dovrebbero essere eseguiti in parallelo su una macchina con più processori (il numero di processori non deve essere maggiore o uguale al numero di thread).

I compiti eseguiti dai thread in parallelo, così come i dati necessari per eseguire questi compiti, sono descritti utilizzando direttive speciali del preprocessore del linguaggio corrispondente - "pragma". Ad esempio, una sezione di codice Fortran che deve essere eseguita da più thread, ognuno dei quali ha la propria copia della variabile N, è preceduta dalla seguente direttiva:!$OMP PARALLEL PRIVATE(N)

Il numero di thread creati può essere regolato sia dal programma stesso, richiamando procedure di libreria, sia dall'esterno, utilizzando variabili di ambiente.

Elementi chiave della norma:

  • costrutti per la creazione di thread (direttiva parallel),
  • costruzioni per la distribuzione del lavoro tra i fili (direttive DO/ fore section),
  • costruzioni per la gestione del lavoro con i dati (espressioni sharede privateper la definizione della classe di memorizzazione delle variabili ),
  • costrutti per la sincronizzazione dei thread (direttive e ) critical,atomicbarrier
  • routine della libreria di supporto runtime (ad esempio, omp_get_thread_num),
  • variabili di ambiente (ad esempio, OMP_NUM_THREADS).

Esempi

Un programma Fortran-77 che crea un numero di thread precedentemente sconosciuto (è determinato da una variabile di ambiente OMP_NUM_THREADSprima di avviare il programma), ognuno dei quali stampa un saluto insieme al proprio numero; il thread iniziale (numerato 0) stampa anche il numero totale di thread, ma solo dopo che tutti hanno "passato" la direttiva 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 BARRIER 
      IF  (  ID  . EQ .  0  )  () PRINT * , 'CI SONO' , NTHRDS , 'THREADS' END IF C$OMP END PARALLEL END
          
            
      
 
      

Programma C che aggiunge dieci thread array a-to-array b(compilato con gcc-4.4 e versioni successive con il flag -fopenmp ):

#include <stdio.h> 
#include <omp.h> 

#definisci N 100

int main ( int argc , char * argv [])    
{
  doppia a [ N ], b [ N ], c [ N ];   
  int io ; 
  omp_set_dinamico ( 0 ); // impedisce alla libreria openmp di modificare il numero di thread durante l'esecuzione omp_set_num_threads ( 10 ); // imposta il numero di thread su 10      
   

  // inizializza gli array 
per ( i = 0 ; i < N ; i ++ )         
  {
      un [ io ] = io * 1,0 ;    
      b [ io ] = io * 2,0 ;    
  }

  // calcola la somma degli array 
#pragma omp parallel for shared(a, b, c) private(i) 
for ( i = 0 ; i < N ; i ++ )          
     c [ io ] = un [ io ] + b [ io ];    

  printf ( "%f \n " , c [ 10 ]);  
  ritorno 0 ; 
}

Implementazioni

OpenMP è supportato da molti compilatori moderni.

I compilatori Sun Studio supportano la specifica OpenMP 2.5 [2] con supporto per il sistema operativo Solaris ; Supporto Linux pianificato per la prossima versione[ specificare ] . Questi compilatori creano una procedura separata dal codice sorgente che si trova sotto la direttiva parallele, al posto della direttiva stessa, inseriscono una chiamata alla procedura di __mt_MasterFunction_libreria libmtsk, passandogli l'indirizzo di una creata artificialmente. Pertanto, i dati condivisi ( condivisi ) possono essere passati per ultimi per riferimento e i propri ( private ) sono dichiarati all'interno di questa procedura, essendo indipendenti dalle loro copie in altri thread. La procedura __mt_MasterFunction_crea un gruppo di thread (numero 9 nell'esempio C sopra) che eseguirà il codice del costrutto parallele il thread che lo ha chiamato diventa il thread principale del gruppo. Quindi il thread principale organizza il lavoro dei thread slave, dopodiché inizia l'esecuzione del codice utente stesso. Al termine del codice, il thread principale chiama una routine _mt_EndOfTask_Barrier_che lo sincronizza con gli altri.

Visual C++ 2005 e 2008 supporta OpenMP 2.0 nelle edizioni Professional e Team System, 2010 nelle edizioni Professional, Premium e Ultimate, 2012 in tutte le edizioni [3] .

GCC 4.2 ha introdotto il supporto OpenMP per C, C++ e Fortran (basato su gfortran ), e alcune distribuzioni (come Fedora Core 5) hanno incluso il supporto in GCC 4.1. Clang e LLVM 3.7 supportano OpenMP 3.1 . [4] .

Il compilatore Intel C++ , il compilatore Intel Fortran e Intel Parallel Studio supportano OpenMP versione 3.0 e Intel Cluster OpenMP per la programmazione della memoria distribuita. Ci sono anche implementazioni nel compilatore IBM XL, PGI (gruppo Portland), Pathscale, compilatori HP[ specificare ] .

Vedi anche

Note

  1. Sito ufficiale dell'OpenMP Architecture Review Board (downlink) . Data di accesso: 15 gennaio 2008 Archiviata dall'originale il 20 luglio 2008. 
  2. 1. Presentazione dell'API OpenMP (Sun Studio 12: Guida per l'utente dell'API OpenMP) - Sun Microsystems
  3. Edizioni Visual C++ . Data di accesso: 15 gennaio 2008 Archiviata dall'originale il 23 aprile 2008.
  4. OpenMP.org » Archivio blog » Clang 3.7 avrà il pieno supporto di OpenMP 3.1 . openmp.org. Estratto il 3 settembre 2015 Archiviato dall'originale il 5 settembre 2015.

Collegamenti

Intel Software Network  (russo)
viva64.com  (russo)
Altre fonti