Openmp
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/foresection), - costruzioni per la gestione del lavoro con i dati (espressioni
sharedeprivateper 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
- Intel Threading Building Blocks : una libreria per la programmazione parallela in C++
- MPI (Message Passing Interface) - interfaccia per lo scambio di messaggi tra processi
- OpenCL è un framework aperto per il calcolo parallelo su GPU e CPU
- ApriACC
Note
- ↑ Sito ufficiale dell'OpenMP Architecture Review Board (downlink) . Data di accesso: 15 gennaio 2008 Archiviata dall'originale il 20 luglio 2008.
- ↑ 1. Presentazione dell'API OpenMP (Sun Studio 12: Guida per l'utente dell'API OpenMP) - Sun Microsystems
- ↑ Edizioni Visual C++ . Data di accesso: 15 gennaio 2008 Archiviata dall'originale il 23 aprile 2008.
- ↑ 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
- openmp.org - sito ufficiale di OpenMP
- Intel Software Network (russo)
- Riccardo Gerber. Guida introduttiva a OpenMP* (link morto) . Intel Software Network (5 giugno 2009). Estratto l'11 febbraio 2010. Archiviato dall'originale il 3 marzo 2012.
- Riccardo Gerber. Condivisione efficiente del carico tra thread con OpenMP* (collegamento morto) . Intel Software Network (5 giugno 2009). Estratto l'11 febbraio 2010. Archiviato dall'originale il 3 marzo 2012.
- Andrej Karpov. Brevemente sulla tecnologia OpenMP (link inaccessibile) . Intel Software Network (5 gennaio 2010). Estratto l'11 febbraio 2010. Archiviato dall'originale il 3 marzo 2012.
- viva64.com (russo)
- Articolo "32 insidie di OpenMP durante la programmazione in C++" (russo)
- Articolo "Debugging e ottimizzazione di programmi OpenMP multithread" (russo)
- Altre fonti
- Tutorial OpenMP Archiviato il 16 febbraio 2019 su Wayback Machine (russo)
- Introduzione a OpenMP: API di programmazione parallela per sistemi multiprocessore a memoria condivisa (rus.)
- Cos'è OpenMP? Archiviato il 1 febbraio 2008 in Wayback Machine (russo) - articolo di base su parallel.ru Archiviato il 23 gennaio 2008 in Wayback Machine
- OpenMP e C++ (russo)
- Programmazione parallela utilizzando OpenMP Archiviato il 20 aprile 2008 su Wayback Machine (russo) - Tutorial su Intuit.ru
- Presentazione OpenMP archiviata il 29 maggio 2015 in Internet Archive . (russo)
- Supporto OpenMP nei compilatori e strumenti Sun Studio Archiviato il 26 ottobre 2007 su Wayback Machine