Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
IL MODELLO DI TASKINGIN OPEN MP 3.0
di Federico Massaioli
La diffusione dei processori multicore ha stimolato l’interesse per il parallelismo e la domanda di semplici
modelli di parallelizzazione di algoritmi dinamici ed irregolari. Il modello di tasking di OpenMP 3.0, al cui
sviluppo CASPUR ha partecipato attivamente, è una delle risposte disponibili.
• Abstract
The widespread adoption of multicore processors in all kind of computing devices is
springing interest for parallel computing, which is the only approach to achieve the
promised performance boosts. Parallel computing is not easy, and the resulting com-
plexity, which is usually tolerated in the computational science field, must be strictly
controlled in commercial software life cycles.
OpenMP is a widely supported industrial standard for parallel computing on multi-
processors systems. Its basic principles, simplicity and incremental approach, make it an
extremely productive paradigm. Up to version 2.5, OpenMP didn’t directly support par-
allelization of algorithms in which more work is generated dynamically and with irregular
patterns as data are processed. These algorithms are of growing relevance in the scien-
tific realm, and are widespread in most commercial software.
OpenMP 3.0 introduced a new tasking model, that allows work to be dynamically
generated and assigned to idle processors. CASPUR was a very active contributor to the
new model development.
Dott. Federico MassaioliCASPUR
Responsabile del Gruppo
di Fisica e Fluidodinamica
Computazionale
L’interesse per il calcolo parallelo, tradizionalmente adoperato solo in attività di
frontiera nell’ambito tecnico-scientifico, è in crescita e si sta diffondendo in tutti
i settori dell’informatica. La motivazione è semplice: di fronte alla difficoltà di
estrarre quantità sempre maggiori di calore dai processori, e alla crescente atten-
zione ai consumi elettrici di apparati di calcolo e di infrastrutture di supporto, la
corsa ventennale dei produttori di CPU a frequenze di clock sempre più elevate si
è ormai interrotta, o almeno è molto rallentata. La risposta tecnologica attuale
alla costante richiesta di sistemi sempre più potenti è l’aumento del numero di
CPU che possono accedere a memoria e periferiche del sistema ed elaborarne i
contenuti. L’approccio è industrializzato al punto che il singolo processore in realtà
integra su un unico chip più CPU, o core di elaborazione, indipendenti, e non è li-
mitato solo ai server centralizzati, ma è utilizzato nei sistemi da tavolo, nei laptop
e persino nei sistemi embedded, ovvero in tutti i computer “affogati” invisibil-
mente dentro ad elettrodomestici, telefoni, automobili.
18
Il calcolo parallelo è dunque l’unico approccio possibile perché la velocità delle
applicazioni più diffuse cresca di pari passo con la potenza dei computer su cui
sono eseguite. Tuttavia il calcolo parallelo, ossia la distribuzione a diversi processori
di parti diverse di un’unica elaborazione, è più complesso dell’elaborazione da
parte di un solo processore. Basti osservare che utilizza gli stessi approcci ed in-
contra le stesse complessità della distribuzione del lavoro tra esseri umani. Divi-
dere un attività tra più lavoratori per velocizzarne l’esecuzione richiede
innanzitutto del lavoro aggiuntivo: quello di coordinamento, per far sì che alcuni
passi dell’attività avvengano nel giusto ordine e per regolare l’accesso a risorse
condivise, come gli strumenti di lavoro. In più, suddivisioni diverse tra lo stesso
numero di lavoratori possono portare a differenti tempi di esecuzione complessivi
dell’attività. Ognuna di queste suddivisioni sarà poi caratterizzata da un numero
critico di lavoratori al di sopra del quale il tempo speso nel coordinarsi è non tra-
scurabile rispetto a quello dedicato al lavoro utile.
Complessità come quelle appena descritte sono quasi “ordinaria amministra-
zione” nell’ambito della ricerca di frontiera, che per definizione si confronta con
problemi al limite delle capacità scientifiche e tecnologiche. In questo ambito,
inoltre, l’ingegnerizzazione delle applicazioni è semplificata dalla dimensione re-
lativamente contenuta dei sorgenti, dal numero relativamente ridotto di funzio-
nalità, dall’utenza ristretta ed altamente professionale e dalla relativa lentezza
con cui vengono
prodotte nuove re-
lease. Del tutto di-
versa è la situazione
nei mercati informa-
tici più ampi: vaste
basi di utenza non
specializzata, appli-
cazioni di grandi di-
mensioni e molto
ricche in funziona-
lità, modelli di busi-
ness basati sulla
produzione di nuove
release ogni 12-18
mesi. In un simile
contesto un au-
mento incontrollato della complessità di un’applicazione può portare gli svilup-
patori a fallire gli obiettivi. È evidente la necessità di strumenti semplici che
consentano di aumentare le prestazioni dell’applicazione senza renderne lo svi-
luppo e la manutenzione ingestibili.
OpenMP è uno standard diffuso per la parallelizzazione di codici su macchine
dotate di più processori che condividono l’accesso alla stessa memoria. Si basa
sull’inserzione in codici scritti in linguaggi convenzionali, come Fortran, C e C++,
di direttive di compilazione, ossia di indicazioni al compilatore su come distribuire,
in ogni parte del programma, le istruzioni da eseguire tra differenti CPU. La filosofia
CASP
UR
AN
NUA
L RE
PORT
ED
IZIO
NE
2009
IL MODELLO DI TASKING IN OPEN MP 3.0
• Un modello dinamico in due soli costrutti
Per generare dinamicamente un nuovo task da assegnare ad uno dei processori si
utilizza il costrutto:
#pragma omp task
{
// codice del task
}
Il codice contenuto nel blocco associato alla direttiva può essere eseguito imme-
diatamente o successivamente da uno dei processori assegnati al team che esegue
in parallelo il codice. Quando un flusso di esecuzione incontra il costrutto:
#pragma omp taskwait
l’esecuzione del codice è sospesa finché non è completata l’esecuzione di tutti i
task precedentemente generati.
FEDERICO MASSAIOLI
19
progettuale di OpenMP è basata su tre principi cardine: I) il rispetto delle regole
del linguaggio di programmazione; II) la semplicità delle estensioni; III) il supporto
di un processo incrementale e modularizzato di parallelizzazione di un codice se-
riale preesistente. Di fatto, la maggior parte dei codici OpenMP possono produrre
un’equivalente versione seriale semplicemente ignorando le direttive durante la
compilazione. La maggiore produttività dei programmatori che utilizzano OpenMP
è stata provata da esperimenti in laboratori governativi USA [1]. La semplicità
dello standard lo rende facilmente implementabile su differenti architetture har-
dware ed in diversi compilatori. In più, le restrizioni imposte in OpenMP rendono
possibile l’utilizzo di strumenti di analisi automatica di errori di parallelizzazione.
OpenMP è nato nel 1997 da un accordo tra aziende del settore HPC, come uni-
ficazione di alcuni sistemi di programmazione parallela proprietari. Inizialmente
orientato al mondo del calcolo tecnico scientifico, OpenMP si è poi diffuso anche
in altri ambiti. Oggi è disponibile in numerosi compilatori, sia commerciali che
gratuiti, su diversi sistemi operativi e diverse piattaforme hardware, incluse con-
sole per videogiochi come la Playstation 3 e la XBox 360 e architetture per sistemi
embedded come i processori multicore della ARM. L’evoluzione dello standard
(le cui specifiche sono disponibili al sito www.openmp.org) è gestito dall’OpenMP
Architecture Review Board (ARB), un ente no-profit, composto dalle maggiori
aziende del settore, da alcuni centri di ricerca, e da cOMPunity, l’associazione degli
utenti di OpenMP. Gli sviluppi tecnici e la stesura delle specifiche è affidata ad un
Language Committee, di cui fanno parte esperti degli enti componenti l’ARB.
OpenMP si basa su un modello fork&join, nel quale il flusso di elaborazione di-
venta parallelo al momento di distribuire lavoro a processori diversi e ritorna seriale
quando le attività parallele sono terminate. Fino alla versione 2.5 delle specifiche,
OpenMP ha supportato i due casi d’uso principali del parallelismo. In quello più
semplice (Figura 1), un lavoro è composto da molte attività identiche, di quantità
nota o stimabile in anticipo, da applicare ripetitivamente e indipendentemente a
Figura 1Più lavoratori possono svolgere
contemporaneamente attività
identiche.
dati diversi, e che è facile distribuire equamente tra diversi lavoratori (o processori,
in un computer). Nel secondo (Figura 2), il lavoro è costituito da attività differenti
ma indipendenti, ed è quindi possibile dividerle comunque tra più lavoratori, cu-
rando che il lavoratore che finisce prima degli altri prenda in carico un’altra attività
ancora da svolgere. Il vincolo, in ambedue i casi, è che il numero di attività da di-
stribuire ai differenti processori sia noto al momento di distribuirle.
L’obiettivo primario fissato dall’ARB per la versione 3.0 di OpenMP era quello
di supportare per la prima volta in uno standard industriale la parallelizzazione di
forme di parallelismo dinamico ed irregolare, nel quale i flussi di esecuzione pa-
rallelo generano ulteriori attività da svolgere, in maniera imprevedibile a priori
(Figura 3). Si pensi, ad esempio, ad una simulazione di impatto tra oggetti com-
plessi, in cui la geometria dei singoli elementi cambia a seconda dei fenomeni
che si verificano localmente, oppure, come analogo umano, ad una ricerca biblio-
grafica, nella quale una volta identificati testi pertinenti, questi ultimi possono ri-
chiedere ampliamenti ed approfondimenti della ricerca stessa. Molte elaborazioni
hanno queste caratteristiche, non solo nel calcolo scientifico, ma soprattutto in
settori applicativi ben più ampi, come le basi dati, i videogiochi, la logistica,. Il
CASPUR è stato uno dei primi centri al mondo ad adottare lo standard OpenMP
ed uno dei primi ad esplorare la sua applicabilità al parallelismo irregolare, par-
tecipando attivamente all’ideazione del modello di tasking dinamico di OpenMP,
ed alla stesura del nuovo standard, pubblicato a maggio 2008, dopo una fase di
sei mesi di commenti pubblici.
Alcuni fantasmi tormentano i lavori dei comitati di standardizzazione ed i sonni
dei loro membri: si tratta degli spettri di standard che, dopo la loro promulgazione,
si sono rivelati troppo complicati da usare o da implementare ed intrinsecamente
inefficienti. Questi pericoli sono maggiori proprio nei casi in cui un nuovo modello
di elaborazione deve essere aggiunto ad uno standard già esistente, senza rom-
perne la coerenza interna. Il Language Committee ha dedicato molto lavoro a
questo aspetto. Per valutare i rischi, è stata realizzata un’implementazione proto-
tipale, curata dall’Universitat Politécnica de Catalunya. Il prototipo è stato utilizzato
per valutare espressività, facilità d’uso e prestazioni delle estensioni, e gli studi
sono stati pubblicati in alcuni lavori [2,3] che sono stati apprezzati per qualità e
CASP
UR
AN
NUA
L RE
PORT
ED
IZIO
NE
2009
IL MODELLO DI TASKING IN OPEN MP 3.0
20
Figura 2Attività diverse per contenuto e
durata possono comunque es
sere eseguite contemporanea
mente da più lavoratori, con un
opportuno coordinamento.
Figura 3Alcuni lavori possono essere
suddivisi tra più lavoratori, ma il
loro svolgimento genera attività
accessorie.
trasparenza del processo. Coerentemente con la filosofia progettuale di semplicità,
alcune idee, per quanto allettanti, sono state prudentemente rinviate ad una pros-
sima versione di OpenMP, nell’attesa di raccogliere le esperienze ed i feedback
dell’utenza generale.
OpenMP 3.0 è ormai disponibile dall’autunno scorso nei principali compilatori.
Il modello di tasking dinamico è già utilizzato in alcune applicazioni, con risultati
positivi per la facilità d’uso, per la semplicità di parallelizzazione dei codici, per le
prestazioni in esecuzione. I concetti del nuovo modello hanno un grande poten-
ziale per essere utilizzati anche nelle architetture che si prospettano all’orizzonte,
come i processori manycore, dotati di elevati numeri di core molto semplici, e
nelle architetture eterogenee, che integrano processori con caratteristiche e fun-
zionalità specializzate. È ragionevole pensare che il modello di tasking di OpenMP
diventi la struttura fondamentale di prossime versioni dello standard.
• Bibliografia
[1] Hochstein, L., Carver, J., Shull, F., Asgari, S., & Basili, V. (2005). Parallel Programmer
Productivity: A Case Study of Novice Parallel Programmers. ACM/IEEE SC 2005 Conference
(SC 2005).
[2] Ayguadé, E., Copty, N., Duran, A., Hoeflinger, J., Lin, Y., Massaioli, F., Teruel, X., Un-
nikrishnan, P., & Zhang, G. (2009). The Design of OpenMP Tasks. IEEE Transactions on Par-
allel and Distributed Systems, 20, 3, 404-18.
[3] Ayguadé, E., Duran, A., Hoeflinger, J., Massaioli, F., & Teruel, X. (october 2007). An
experimental evaluation of the new openmp tasking model. In Proceedings of the 20th
International Workshop on Languages and Compilers for Parallel Computing (LCPC).
21
FEDERICO MASSAIOLI