OpenMP
OpenMP (Open Multiprocessing) è un API multipiattaforma per la creazione di applicazioni parallele su sistemi a memoria condivisa. È supportata da vari linguaggi di programmazione come il C/C++ e il Fortran e su varie architetture di elaboratori e sistemi operativi tra cui Solaris, AIX, HP-UX, Linux, macOS e la piattaforma Windows. OpenMP è composto da un insieme di direttive di compilazione, routine di librerie e variabili d'ambiente che ne definiscono il funzionamento a run-time.[1][2][3] OpenMP è gestito dal consorzio no profit OpenMP Architecture Review Board (or OpenMP ARB) assieme ad un gruppo di produttori di Hardware e di sviluppatori di software come AMD, IBM, Intel, Cray Inc., Hewlett-Packard, Fujitsu, NVIDIA Corporation, NEC Corporation, Microsoft Corporation, Texas Instruments, Oracle ed altri. OpenMP usa un modello scalabile e portabile che fornisce al programmatore un'interfaccia semplice e flessibile per sviluppare applicazioni di calcolo parallele che possono essere eseguite da uno standard Computer desktop fino ai Supercomputer[4]. Un'applicazione sviluppata con il modello ibrido di programmazione parallela può essere eseguita 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. IntroduzioneOpenMP è un'implementazione del concetto di 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. La sezione di codice che si intende eseguire in parallelo viene marcata attraverso una apposita direttiva che causa la creazione dei thread prima della esecuzione.
Ogni thread è identificato tramite un id che può essere ottenuto tramite la funzione 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 linguaggio C/C++ le funzioni implementate dallo standard OpenMP sono incluse in un file header chiamato omp.h. StoriaL'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 fondamentaliElementi 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 Run-time a livello utente e le variabili d'ambiente.
Nel linguaggio C/C++ viene utilizzata la direttiva
La direttiva Esempio (in C): Visualizzare la stringa "Hello, world" utilizzando thread multipli. #include <stdio.h>
int main(void)
{
#pragma omp parallel
printf("Hello, world.\n");
return 0;
}
Viene usato il flag -fopenmp per compilare utilizzando il compilatore GCC: $gcc -fopenmp hello.c -o hello
L'Output su un computer con 2 Core e 2 threads è il seguente: Hello, world.
Hello, world.
L'output può essere non comprensibile a causa del fenomeno di Race condition dovuto ai due thread che condividono lo standard output. Hello, wHello, woorld.
rld.
Sono usati per assegnare compiti indipendenti a uno o a tutti i thread.
Esempio: inizializzare il valore in un array in parallelo utilizzando ogni thread per svolgere il lavoro 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;
}
Essendo OpenMP un modello di programmazione per sistemi di tipo 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
Altri progetti
Collegamenti esterni
|
Portal di Ensiklopedia Dunia