OpenMP: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Corretto errore di battitura |
→Collegamenti esterni: Aggiunto il template "Portale" |
||
(7 versioni intermedie di 3 utenti non mostrate) | |||
Riga 18:
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 [[parallelismo 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 [[C (linguaggio)|linguaggio C]]/[[C++]] le funzioni implementate dallo standard
==Storia==
Riga 32:
[[File:OpenMP language extensions.svg|center|upright=2.4|thumb|Diagramma con i costrutti OpenMP.]]
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|#
* '''Creazione dei thread'''
La direttiva {{code|lang=c|#pragma
Esempio (in C):
<syntaxhighlight lang=c>
Riga 52:
</syntaxhighlight>
Viene usato il flag ''-fopenmp'' per compilare utilizzando il compilatore [[GNU Compiler Collection|GCC]]:
<syntaxhighlight lang=bash>
$gcc -fopenmp hello.c -o hello
Riga 75:
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:
<syntaxhighlight lang=c>int main(int argc, char *argv[]) {
Riga 95:
* '''Clausole OpenMP''' (data environment management)
Essendo
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.
Riga 106:
==Collegamenti esterni==
* {{Collegamenti esterni}}
* [https://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]]
|