OpenMP: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
LucaBiondi (discussione | contributi)
m Integro
Collegamenti esterni: Aggiunto il template "Portale"
 
(39 versioni intermedie di 15 utenti non mostrate)
Riga 1:
{{Software
'''OpenMP''' (Open Multiprocessing) è un [[Application programming interface|API]] multipiattaforma per la creazione di applicazioni parallele su sistemi a memoria condivisa. E' supportata da vari linguaggi di programmazione come il [[C (linguaggio)|C]]/[[C++]] e il [[Fortran]] e su varie [[Microarchitettura|architteture di elaboratori]] e [[Sistema operativo|sistemi operativi]] tra cui [[Oracle Solaris (sistema operativo)|Solaris]], [[AIX (sistema operativo)|AIX]], [[HP-UX]], [[Linux]], [[Mac OS X]] e la piattaforma [[Microsoft Windows|Windows]]. OpenMP è composto da un insieme di [[Direttiva (programmazione)|direttive di compilazione]], [[Libreria (software)|routine di librerie]] e variabili d'ambiente che ne definiscono il funzionamento a run-time.<ref name="openmp.org">http://openmp.org/wp/openmp-compilers/ OpenMP Compilers</ref><ref name="openmp.org"/><ref>http://openmp.org/wp/2008/10/openmp-tutorial-at-supercomputing-2008/ OpenMP Tutorial at Supercomputing 2008</ref><ref>http://openmp.org/wp/2009/04/download-book-examples-and-discuss/ Using OpenMP - Portable Shared Memory Parallel Programming - Download Book Examples and Discuss</ref>
|Nome = OpenMP
|Sviluppatore = OpenMP Architecture Review Board
|SistemaOperativo = cross-platform
|Genere = [[Application programming interface|API]]
}}
 
'''OpenMP''' (Open Multiprocessing) è un [[Application programming interface|API]] multipiattaforma per la creazione di applicazioni parallele su sistemi a memoria condivisa. È supportata da vari linguaggi di programmazione come il [[C (linguaggio)|C]]/[[C++]] e il [[Fortran]] e su varie [[Microarchitettura|architetture di elaboratori]] e [[Sistema operativo|sistemi operativi]] tra cui [[Oracle Solaris (sistema operativo)|Solaris]], [[AIX (sistema operativo)|AIX]], [[HP-UX]], [[Linux]], [[macOS]] e la piattaforma [[Microsoft Windows|Windows]]. OpenMP è composto da un insieme di [[Direttiva (programmazione)|direttive di compilazione]], [[Libreria (software)|routine di librerie]] e variabili d'ambiente che ne definiscono il funzionamento a run-time.<ref name="openmp.org">http://openmp.org/wp/openmp-compilers/ OpenMP Compilers</ref><ref>http://openmp.org/wp/2008/10/openmp-tutorial-at-supercomputing-2008/ OpenMP Tutorial at Supercomputing 2008</ref><ref>http://openmp.org/wp/2009/04/download-book-examples-and-discuss/ Using OpenMP - Portable Shared Memory Parallel Programming - Download Book Examples and Discuss</ref>
 
''OpenMP'' è gestito dal consorzio [[Organizzazione non a scopo di lucro|no profit]] ''OpenMP Architecture Review Board'' (or OpenMP ARB) assieme ad un gruppo di produttori di Hardware e di sviluppatori di software come [[Advanced Micro Devices|AMD]], [[IBM]], [[Intel]], [[Cray Inc.]], [[Hewlett-Packard]], [[Fujitsu]], [[NVIDIA Corporation]], [[NEC Corporation]], [[Microsoft Corporation]], [[Texas Instruments Incorporated|Texas Instruments]], [[Oracle Corporation|Oracle]] ed altri.
 
''OpenMP'' usa un modello scalabile e portabile che fornisce al [[Programmatoreprogrammatore]] un 'interfaccia semplice e flessibile per sviluppare applicazioni di calcolo parallele che possono essere eseguireeseguite da uno standard [[Computer desktop]] fino ai [[Supercomputer]]<ref>http://openmp.org/wp/2008/11/openmp-30-status/ OpenMP 3.0 Status</ref>.
 
Un 'applicazione sviluppata con il modello ibrido di [[Calcolo parallelo|programmazione parallela]] può essere eseguitoeseguita su un [[Computer cluster]] utilizzando OpenMP e [[Message Passing Interface]] (MPI) oppure in modo trasparente utilizzando le estensioni OpenMP per i sistemi con memoria non condivisa.
 
==Introduzione==
''OpenMP '' è un'implementazione del concetto di [[Thread (informatica)|multithreading]] ovvero di un metodo di parallelizzazione per cui un ''master thread'' (una serie di istruzioni eseguite consecutivamente) crea un certo numero di ''slave thread'' e un task (processo) è diviso tra i vari ''slave thread''. I thread vengono eseguiti in modo concorrente mentre il [[run-time system]] alloca i thread su processori disponibili.
 
''OpenMP '' è un implementazione del concetto di [[Thread (informatica)|multithreading]] ovvero di un metodo di parallelizzazione per cui un ''master thread'' (una serie di istruzioni eseguite consecutivamente) crea un certo numero di ''slave thread'' ed un task (processo) è diviso tra i vari ''slave thread''. I thread vengono eseguiti in modo concorrente mentre il [[Run-time system]] alloca i thread su processori disponibili.
 
La sezione di codice che si intende eseguire in parallelo viene marcata attraverso una apposita [[Direttiva (programmazione)|direttiva]] che causa la creazione dei thread prima della esecuzione.
Ogni thread è identificato tramite un id che può essere ottenuto tramite la funzione {{code|omp_get_thread_num()}}. Tale valore è di tipo intero e per il master thread vale 0. Al termine della esecuzione del codice parallelizzato gli slave thread ritornano il controllo al master thread il quale continua l'esecuzione fino al termine del programma.
 
Per default ogni thread esegue la sezione parallelizzata (''parallelized section'') di codice in modo indipendente. Appositi costrutti per la divisione del lavoro (chiamati ''Work-sharing constructs'') permettono di dividere il task tra i thread disponibili in modo che ciascuno di essi esegua la propria parte di codice. Il [[Parallelismoparallelismo a livello di thread]] e quello a livello di dati sono ottenuti attraverso l' OpenMP in questo modo.
 
L'ambiente di esecuzione in tempo reale (''runtime environment'') alloca i thread sui processori a seconda di vari fattori tra cui il carico della macchina. Nel linguaggio [[C (linguaggio)|linguaggio C]]/[[C++]] le funzioni implementate dallo standard openMPOpenMP sono incluse in un [[Header file|file header]] chiamato ''omp.ch''.
 
==Storia==
L'''OpenMP Architecture Review Board'' (ARB) pubblicò le prime specifiche per queste API allora chiamate ''OpenMP for Fortran 1.0'' nell'ottobre [[1997]]. Sempre nell'ottobre dell'anno successivo furono poi rese disponibili per il linguaggio C/C++.
Nell'anno [[2000]] uscirono le specifiche versione 2.0 per il linguaggio Fortran mentre nel [[2002]] furono rilasciate per il C/C++.
Nel [[2005]] escono poi le specifiche 2.5 (per entrambi i linguaggi C/C++ e Fortran) e nel maggio [[2008]] quelle 3.0. Il 9 luglio [[2011]] sono state rilasciate le specifiche 3.1. Attualmente le specifiche più recenti sono la versione 4.0 pubblicata nel luglio [[2013]].
 
==Gli elementi fondamentali==
L' ''OpenMP Architecture Review Board'' (ARB) pubblicò le prime specifiche per queste API allora chiamate ''OpenMP for Fortran 1.0'' nell'ottobre [[1997]]. Sempre nell'ottobre dell'anno successivo furono poi rese disponibili per il linguaggio C/C++.
[[File:OpenMP language extensions.svg|center|upright=2.4|thumb|Diagramma con i costrutti OpenMP.]]
Nell'anno [[2000]] uscirono le spefiche versione 2.0 per il lingaggio Fortran mentre nel [[2002]] furono rilasciate per il C/C++.
 
Nel [[2005]] escono poi le specifiche 2.5 (per entrambi i linguaggi C/C++ e Fortran) e nel maggio [[2008]] quelle 3.0. Attualmente le specifiche più recenti sono la versione 3.1 del luglio [[2011].
Elementi fondamentali di OpenMP sono i costrutti per la creazione dei thread, per la distribuzione dei carichi di lavoro (''work sharing''), il data-environment management, la sincronizzazione dei thread, le routine [[runtime|Run-time]] a livello utente e le variabili d'ambiente.
Nel linguaggio C/C++ viene utilizzata la direttiva {{code|lang=c|#pragma}}.
 
* '''Creazione dei thread'''
 
La direttiva {{code|lang=c|#pragma omp parallel}} è usata per la creazione dei thread addizionali. Il thread originale è chiamato ''master thread'' e ha come identificativo l'ID 0.
 
Esempio (in C): Visualizzare la stringa "Hello, world" utilizzando thread multipli.
 
<syntaxhighlight lang=c>
#include <stdio.h>
 
int main(void)
{
#pragma omp parallel
printf("Hello, world.\n");
return 0;
}
</syntaxhighlight>
 
Viene usato il flag ''-fopenmp'' per compilare utilizzando il compilatore [[GNU Compiler Collection|GCC]]:
<syntaxhighlight lang=bash>
$gcc -fopenmp hello.c -o hello
</syntaxhighlight>
 
L'Output su un computer con 2 Core e 2 threads è il seguente:
 
<syntaxhighlight lang=bash>
Hello, world.
Hello, world.
</syntaxhighlight>
 
L'output può essere non comprensibile a causa del fenomeno di [[Race condition]] dovuto ai due thread che condividono lo [[Canali standard|standard output]].
 
<syntaxhighlight lang=bash>
Hello, wHello, woorld.
rld.
</syntaxhighlight>
 
* '''Costrutti di Work sharing'''
 
Sono usati per assegnare compiti indipendenti a uno o a tutti i thread.
 
** ''omp for'' o ''omp do'': divide il ciclo di loop sui threads. È chiamato anche ''loop construct''.
** ''sections'': assegna un blocco di codice consecutivo ma indipendente a differenti thread.
** ''single'': assegna un blocco di codice che sarà eseguito da un solo thread.
** ''master'': simile alla modalità ''single'', ma il blocco di codice sarà eseguito dal solo master thread.
 
Esempio: inizializzare il valore in un array in parallelo utilizzando ogni thread per svolgere il lavoro
 
<syntaxhighlight lang=c>int main(int argc, char *argv[]) {
const int N = 100000;
int i, a[N];
 
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
 
return 0;
}</syntaxhighlight>
 
* '''Clausole OpenMP''' (data environment management)
 
Essendo OpenMP un modello di programmazione per sistemi di tipo [[Memoria condivisa|shared memory]], la maggior parte delle variabili sono visibili, per default, a tutti i thread.
A volte, invece, sono necessarie delle variabili private per evitare fenomeni di ''Race Conditions'' oppure c'è l'esigenza di passare dei valori tra la parte sequenziale del programma e la parte parallela.
Per questo motivo l'''environment management'' definisce degli attributi di condivisione.
 
==Note==
{{<references}}/>
 
==Altri progetti==
{{interprogetto}}
 
==Collegamenti esterni==
* {{Collegamenti esterni}}
*[http://www.openmp.org], sito ufficiale con le specifiche.
* [httphttps://gcc.gnu.org/projects/gomp GOMP] is [[GNU Compiler Collection|GCC]]'s OpenMP implementation, part of GCC
* [http://domino.research.ibm.com/comm/research_projects.nsf/pages/cellcompiler.index.html IBM Octopiler] {{Webarchive|url=https://web.archive.org/web/20090129204113/http://domino.research.ibm.com/comm/research_projects.nsf/pages/cellcompiler.index.html |date=29 gennaio 2009 }} with OpenMP support
*[ {{cita web | 1 = https://computing.llnl.gov/tutorials/openMP/ | 2 = Blaise Barney, Lawrence Livermore National Laboratory site on OpenMP] | accesso = 6 dicembre 2012 | dataarchivio = 18 dicembre 2019 | urlarchivio = https://web.archive.org/web/20191218212111/https://computing.llnl.gov/tutorials/openMP/ | urlmorto = sì }}
*[ {{cita web|https://sourceforge.net/projects/redlib/ |ompca, an application in REDLIB project for the interactive symbolic model-checker of C/C++ programs with OpenMP directives]}}
 
{{Portale|informatica}}
[[Categoria:Calcolo parallelo]]
 
[[Categoria:Calcolo parallelo]]
[[ca:OpenMP]]
[[cs:OpenMP]]
[[de:OpenMP]]
[[en:OpenMP]]
[[es:OpenMP]]
[[fr:OpenMP]]
[[ko:OpenMP]]
[[lt:OpenMP]]
[[nl:OpenMP]]
[[ja:OpenMP]]
[[no:OpenMP]]
[[pl:OpenMP]]
[[pt:OpenMP]]
[[ru:OpenMP]]
[[sq:OpenMP]]
[[uk:OpenMP]]
[[zh:OpenMP]]