PARTE II PROGRAMMAZIONE PARALLELA



Documenti analoghi
CALCOLO PARALLELO SUPERARE I LIMITI DI CALCOLO. A cura di Tania Caprini

Il sistema operativo TinyOS

e-dva - eni-depth Velocity Analysis

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Il Sistema Operativo

Parte VIII. Architetture Parallele

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

La Gestione delle risorse Renato Agati

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

FONDAMENTI di INFORMATICA L. Mezzalira

INFORMATICA 1 L. Mezzalira

Introduzione alla Virtualizzazione

Dispensa di Informatica I.1

GESTIONE DEI PROCESSI

Valutazione delle Prestazioni. Valutazione delle Prestazioni. Architetture dei Calcolatori (Lettere. Tempo di risposta e throughput

Lezione 10. Scheduling nei sistemi multiprocessori. Esempio: P=2 processori. Scheduling dei processi

Gestione della Memoria

Architetture Applicative

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Linux nel calcolo distribuito

Architetture software

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Stimare il WCET Metodo classico e applicazione di un algoritmo genetico

Il memory manager. Gestione della memoria centrale

Più processori uguale più velocità?

VMware. Gestione dello shutdown con UPS MetaSystem

1 Processo, risorsa, richiesta, assegnazione 2 Concorrenza 3 Grafo di Holt 4 Thread 5 Sincronizzazione tra processi

Automazione Industriale (scheduling+mms) scheduling+mms.

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Comunicazione tra Processi

Input/Output. Moduli di Input/ Output. gestiscono quantità di dati differenti a velocità diverse in formati diversi. n Grande varietà di periferiche

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Approccio stratificato

7. Architetture Software

LINGUAGGI DI PROGRAMMAZIONE

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

La macchina di Von Neumann. Archite(ura di un calcolatore. L unità di elaborazione (CPU) Sequenza di le(ura. Il bus di sistema

Introduzione ai Metodi Formali

Struttura del calcolatore

Introduzione alle tecnologie informatiche. Strumenti mentali per il futuro

HBase Data Model. in più : le colonne sono raccolte in gruppi di colonne detti Column Family; Cosa cambia dunque?

Sistema operativo: Gestione della memoria

DMA Accesso Diretto alla Memoria

Architettura hardware

Soluzione dell esercizio del 2 Febbraio 2004

Sistemi Operativi. 5 Gestione della memoria

Corso di Sistemi di Elaborazione delle informazioni

Application note. CalBatt NomoStor per i sistemi di accumulo di energia

Architettura di un sistema operativo

I sistemi distribuiti

TECNICO SUPERIORE PER L AUTOMAZIONE INDUSTRIALE

Descrizione di un algoritmo

Calcolatori Elettronici

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

DAL PROBLEMA ALL'ALGORITMO AL PROGRAMMA SCRITTO IN Come. Scopo principale dell informatica è risolvere problemi con i calcolatori.

Tecniche di Simulazione: Introduzione. N. Del Buono:

Il descrittore di processo (PCB)

Gestione della memoria centrale

I THREAD O PROCESSI LEGGERI Generalità

Sistemi Operativi Kernel

Distributed P2P Data Mining. Autore: Elia Gaglio (matricola n ) Corso di Sistemi Distribuiti Prof.ssa Simonetta Balsamo

Il clustering HA con Linux: Kimberlite

3. Introduzione all'internetworking

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Un sistema operativo è un insieme di programmi che consentono ad un utente di

Sistemi Operativi. Scheduling della CPU SCHEDULING DELLA CPU. Concetti di Base Criteri di Scheduling Algoritmi di Scheduling

Sistemi Operativi SCHEDULING DELLA CPU. Sistemi Operativi. D. Talia - UNICAL 5.1

Scheduling della CPU

INFORMATICA. Il Sistema Operativo. di Roberta Molinari

Il Sistema Operativo (1)

Simulazioni accoppiate 1D-3D per scenari d incendio

Programmazione dinamica

Hardware delle reti LAN

Archivi e database. Prof. Michele Batocchi A.S. 2013/2014

Capitolo 5: I thread

TECNICHE DI SIMULAZIONE

B.P.S. Business Process Server ALLEGATO C10

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web: Prof. G. Quarella prof@quarella.

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Scheduling della CPU:

Le fattispecie di riuso

Le licenze d uso. Le principali tipologie di licenze

Scenario di Progettazione

Transcript:

PARTE II PROGRAMMAZIONE PARALLELA Metodologie di Esplicitazione del

Metodologie di Esplicitazione del Implicito Funzionale (Control Parallelism ) Basato sui dati (Data Parallelism ) Ogni metodologia di esplicitazione del parallelismo, si basa sempre su due tecniche: - Decomposizione del dominio dei dati e/o dei processi - Mapping dei sottodomini e/o dei processi ai processori Michele Colajanni Esplicitazione del parallelismo 3/34 Metodologie di Esplicitazione del ( Funzionale)

Metodologie di Esplicitazione del (Funzionale) Implicito Funzionale (Control Parallelism) Basato sui dati (Data Parallelism) Pipelining Algoritmico Instruction Level Parallelism (ILP) Funzioni Processi Michele Colajanni Esplicitazione del parallelismo 5/34 Funzionale Applicazione divisa in elementi funzionali (istruzioni, sottoprogrammi, processi) assegnati ai vari nodi. Il codice è diverso per ogni nodo. I dati seguono il codice. Si suddivide in: Pipelining Si individuano nel software dei nuclei sequenziali, che tutti i dati devono attraversare. Si assegna un nucleo ad ogni nodo e quando la pipe è piena si ha il parallelismo Algoritmico Si devono differenziare delle unit à funzionali che possono essere eseguite in modo parallelo (da singola istruzione ad insiemi di funzioni) Tali unit à funzionali possono interagire fra di loro in qualche momento della computazione. Tale interazione richiede uno scambio di informazioni. Richiede un elevato numero di codici differenti. Istruction Level Parallelism (ILP) algoritmico esplicitato a livello di istruzioni. All inizio, era a carico del programmatore, adesso vi sono strumenti (compilatori) che individuano automaticamente il parallelismo Michele Colajanni Esplicitazione del parallelismo 6/34

Esplicitazione del Funzionale Ogni programma sequenziale è un potenziale programma parallelo. L esplicitazione del parallelismo dipende dal livello di astrazione a cui ci si pone. Scelta del livello di astrazione (ATOMO=espressione aritmetica, istruzione, funzione, processo) Grafico delle unità computazionali non più suddivisibili ( atomi ); i nodi sono le funzioni, gli archi denotano le dipendenze funzionali tra gli atomi. (Grafo ottenuto in maniera deterministico, una volta scelto il livello di astrazione). Dipendenze funzionali tra cluster (insiemi di atomi partizionati). Problema NP-completo assimilabile al grain-packing, per cui ci si accontenta di approsimazioni Denota come i cluster vengono assegnati ai processori (quale processore esegue cosa). Un altro problema NP-completo. Michele Colajanni Esplicitazione del parallelismo 7/34 Paradigma Multiple Process Multiple Data (MPMD) E l unico livello di parallelizzazione funzionale che attualmente rimane di competenza del programmatore. I livelli di astrazione inferiori vengono ormai esplicitati in modo automatico da strumenti hardware o software di basso livello integrati con compilatori che ottimizzano il codice per una determinata architettura. Nel caso di MPMD, il parallelismo viene esplicitato: # A livello di Processo (Coarse-grain) # Consentendo a elementi di elaborazione multipli di eseguire concorrentemente - Un insieme di programmi - Parti indipendenti di questi La definizione MPMD ricorda la tassonomia di Flynn, sebbene venga applicata ad un contesto differente da quello architetturale. Michele Colajanni Esplicitazione del parallelismo 8/34

Costrutti per esprimere la concorrenza Corutines - Chiamate esplicite tra parti di subroutine - Scambio di flussi a carico del programmatore - Concorrenza gestita dal programmatore Costrutto Fork Join - Concorrenza gestita dal programmatore - Istruzione che specifica il nome di un processo da mandare in esecuzione. La modalità è analoga ad una chiamata di procedura, con la differenza fondamentale che il processo che esegue la fork continua nella sua esecuzione, parallelamente al processo che la fork ha mandato in esecuzione. - Join: ricombina due o più computazioni correnti - Non solo Unix mode ma più generale Costrutto ParBegin / Parend - Consente di specificare l esecuzione concorrente di un insieme di istruzioni. Es: PARBEGIN S1;S2;.;Sn; PAREND Tutte le istruzioni racchiuse fra PARBEGIN e PAREND possono essere eseguite in parallelo. L esecuzione termina solo quando tutte le istruzioni racchiuse sono terminate. Schemi a processi I processi vengono dichiarati in modo analogo alle procedure e vengono attivati con speciali istruzioni. Per eseguire diverse copie di un processo è sufficiente attivarlo con chiamate multiple. Ogni funzione è autonoma, ha un inizio e una fine, può comunicare con altri processi e può essere sincronizzata. Michele Colajanni Esplicitazione del parallelismo 9/34 Metodologie di Esplicitazione del ( basato sui dati)

Metodologie di Esplicitazione del (Decomposizione e Mapping) Implicito Funzionale (Control Parallelism) Basato sui dati (Data Parallelism) Pipelining Algoritmico Problemi bilanciati Problemi non bilanciati Geometrico Task Farm Statico Michele Colajanni Esplicitazione del parallelismo 11/34 basato sui dati (DECOMPOSIZIONE DEL DOMINIO) Molti problemi richiedono l applicazione di operazioni simili (analoga complessità computazionale per tutta la durata dell esecuzione) su parti differenti di grandi insiemi di dati.(problemi bilanciati) In tali circostanze è spesso appropriato decomporre il dominio tra (possibilmente) tutti i processi disponibili ( Geometrico) Esempio 16 processi: Se non vi sono dipendenze all interno del dominio dei dati il principale fattore che limita il parallelismo è dato dal numero di processi disponibili. Altrimenti va scelta la granularità opportuna dell insieme di dati da assegnare a ciascun processore Tradeoff tra overhead di comunicazione e numero di processori utilizzati Michele Colajanni Esplicitazione del parallelismo 12/34

Problemi Bilanciati (TASK FARM STATICO) Modello adottabile per applicazioni che richiedono l esecuzione di uno stesso algoritmo ripetuto su dati iniziali diversi. Ogni esecuzione è indipendente dalle altre e può essere eseguita concorrentemente in modo indipendente dalle altre. Un processore ha la funzione di distributore e collettore. Tutti i rimanenti processori sono denominati worker N task Vi è un partizionamento statico del lavoro (task farm statico) per N worker Esempi di applicazioni: ray tracing (image partitioning), simulazione col metodo Montecarlo, intersezioni orbitali, simulated annealing,. WORKER DISTRIBUTORE WORKER COLLETTORE WORKER Michele Colajanni Esplicitazione del parallelismo 13/34 Metodologie di Esplicitazione del (Decomposizione e Mapping) Implicito Funzionale (Control Parallelism) Basato sui dati (Data Parallelism) Pipelining Algoritmico Problemi bilanciati Problemi non bilanciati Geometrico Task Farm Statico Decomposizione a grana fine Task Farm Dinamico Riconfigurazione Dinamica Michele Colajanni Esplicitazione del parallelismo 14/34

Problemi non Bilanciati (altre possibilità?) Si supponga di avere un dominio computazionale in cui alcuni elementi richiedano un elaborazione molto più onerosa. geometrico (NO!) Si avrebbe un forte sbilanciamento del carico Es. con 16 processi Michele Colajanni Esplicitazione del parallelismo 15/34 Problemi non Bilanciati (DECOMPOSIZIONI STATICHE A GRANA FINE) Una possibile soluzione: decomposizione del dominio dei dati a grana fine Sottodominio assegnato al processore 0 Michele Colajanni Esplicitazione del parallelismo 16/34

Problemi non Bilanciati (TASK FARM DINAMICO) Tipicamente, si scelgono granularità piuttosto fini in modo che il numero di task sia adeguatamente superiore al numero di worker Un processore viene eletto task manager (o master) Tutti i rimanenti processori sono denominati worker (o slave) Il task manager: Conserva l insieme dei grani (computazioni) non ancora elaborati Determina dinamicamente a quale worker assegnare ciascun grano - inizialmente un task ad ogni worker - appena un worker termina l esecuzione, il manager gli assegna un altro task Pool di M task (>>N worker) MANAGER WORKER WORKER WORKER WORKER Michele Colajanni Esplicitazione del parallelismo 17/34 Problemi non Bilanciati (TASK FARM DINAMICO) - continua Caratteristiche 1) Con il task farm dinamico, si ha il considerevole vantaggio di non dover fare assunzioni preliminari sul mapping del dominio dei dati per ottenere un buon bilanciamento 2) Si ottengono buone prestazioni se: I grani sono relativamente indipendenti Si riesce a mantenere costante il flusso dei grani tra manager e worker I costi delle continue interazioni dinamiche con il manager non sono prevalenti Il manager non deve diventare il collo di bottiglia della computazione, ma non deve rimanere inattivo per troppo tempo Michele Colajanni Esplicitazione del parallelismo 18/34

TASK FARM (modelli ibridi) TASK FARM CON MANAGER/WORKER MANAGER/ WORKER WORKER WORKER WORKER WORKER SINK TASK FARM BUFFERIZZATO MANAGER Worker Worker Worker Worker SINK Michele Colajanni Esplicitazione del parallelismo 19/34 Con il task farm dinamico, si ha il considerevole vantaggio di non dover fare assunzioni preliminari sul mapping del dominio dei dati per ottenere un buon bilanciamento. Tuttavia, si può applicare solo in applicazioni parallele in cui non vi è necessità di cooperazione/comunicazione tra i worker. Il modello alternativo prevede: - Una decomposizione (tipicamente) a grana medio-fine del dominio dei dati, senza studi preliminari sull efficienza del bilanciamento del carico - Dei momenti di controllo (check point) durante la computazione per verificare l efficienza (soprattutto il bilanciamento del carico) della com putazione stessa - Una fase di ridistribuzione del carico computazionale (bilanciamento dinamico) tra i processori nel caso in cui il check abbia evidenziato serie inefficienze Alcuni problemi Problemi non Bilanciati (RICONFIGURAZIONE DINAMICA) - Quanto frequenti devono essere i checkpoint? - Come decidere che il ribilancimaneto è necessario? - Se è necessario, come effettuarlo? Michele Colajanni Esplicitazione del parallelismo 20/34

Sintesi: Classi di Applicazioni del Data Parallelism Applicazioni bilanciate Tutti gli elementi del dominio richiedono lo stesso numero di operazioni per tutta la durata della computazione. Decomposizione geometrica oppure Task farm statico Applicazioni non bilanciate 1. Diversi sottoinsiemi del dominio richiedono un numero diverso di operazioni. Durante la computazione non vi sono modifiche sul partizionamento di tali sottoinsiemi Decomposizione a grana fine 2. Diversi sottoinsiemi del dominio richiedono un numero diverso di operazioni. Durante la computazione vi possono essere modifiche sul partizionamento di tali sottoinsiemi. Comunque, i sottoinsiemi di elementi che richiedono diverse operazioni e la stima delle operazioni richieste sono staticamente prevedibili. Decomposizione a grana fine Michele Colajanni Esplicitazione del parallelismo 21/34 Sintesi: Classi di Applicazioni del Data Parallelism (cont.) 3. Diversi sottoinsiemi del dominio richiedono un numero diverso di operazioni. Durante la computazione vi possono essere modifiche sul partizionamento di tali sottoinsiemi. I sottoinsiemi di elementi che richiedono diverse operazioni e/o la stima delle operazioni richieste non sono staticamente prevedibili. I sottoinsiemi computazionali sono indipendenti ed in numero significativamente maggiore del numero di processori disponibili Task farm dinamico I sottoinsiemi computazionali non sono indipendenti: Riconfigurazione dinamica Michele Colajanni Esplicitazione del parallelismo 22/34

Il modello programmativo del Data Parallelism: Single Program Multiple Data (SPMD) Ciascun processore di una macchina MIMD esegue lo stesso programma, ma su di un insieme diverso di dati. ESEMPIO A( ) Nodo 0 Nodo 1 Nodo 2 Nodo 3 B( ) C( ) C( ) C( ) Programma SPMD.. begin < esegui A( )>; if (nodo==0) <esegui B( )>; else <esegui C( )>; if (nodo==0) <esegui D( )>; end HOST D( ) Il modello SPMD è estremamente flessibile: - Utilizzabile anche per programmare TASK FARM La differenza rispetto al modello SIMD? Quali sono i 2 costrutti fondamentali? Michele Colajanni Esplicitazione del parallelismo 23/34 Emulare TaskFarm con modello SPMD main ( ) { int process_id; process_id = <return my process identifier>; if (process_id == 0) Master (argomenti); else Worker (argomenti); } Michele Colajanni Esplicitazione del parallelismo 24/34

Sintesi: Quale modello programmato conviene utilizzare? Dipende dall architettura Macchina SIMD data parallel a grana fine-finissima (programmazione sincrona) Macchina MIMD funzionale a grana grossa (programmazione asincrona) a memoria condivisa Macchina MIMD a memoria distribuita funzionale a grana grossa MPMD data parallel a grana media-fine SPMD Nota Nel caso della memoria condivisa le (pseudo-)comunicazioni e le interruzioni possono avvenire a livello di istruzioni. Nel caso della memoria distribuita, invece, le comunicazioni sono costose e, per ottenere programmi efficienti, devono essere effettuate a livello di sottoprogrammi. Michele Colajanni Esplicitazione del parallelismo 25/34 Ibrido Ibrido= Control Parallelism + Data Parallelism DECOMPOSIZIONE DEL CONTROLLO DECOMPOSIZIONE DEL DOMINIO In alcune applicazioni questa doppia decomposizione fornice delle ottime prestazioni grazie al buon trade-off tra granularità ed overhead E il paradigma di parallelizzazione più comune nel caso di applicazioni reali di grandi dimensioni: Qualche unità di programmi differenti (operanti in modalità MPMD) Decine/centinaia o più di processi operanti su sottodomini computazionali (operanti in modalità SPMD) Michele Colajanni Esplicitazione del parallelismo 26/34

Le tre forze della parallelizzazione delle applicazioni 1. Massimizzare il bilanciamento del carico Ovvero: perseguire la granularità più fine possibile (finest grain) 2. Minimizzare le comunicazioni Ovvero: perseguire la granularità più grossa possibile (coarsest grain) 3. (Non dimenticare di)tener conto delle caratteristiche architetturali della piattaforma MIMD a memoria distribuita: Quanti processori? Quale potenza computazionale offerta da ciascun processore? Quali caratteristiche hardware (vettoriali,ilp, )? Quanti e quali livelli di cache? Quale topologia delle rete di interconnessione? Quale costo medio delle comunicazioni per unità di dato? Soddisfare il trade-off tra tutte queste forze, spesso contrastanti, significa arriv are a rispondere alla vera domanda che la metodologia di parallelizzazione data parallel implica: Quale è il migliore livello di granularità per la mia applicazione e la mia architettura? Michele Colajanni Esplicitazione del parallelismo 27/34 E un termine utilizzato per caratterizzare diversi elementi: modelli algoritmici, distribuzione dei dati/processi, caratteristiche delle architetture parallele Granularità algoritmica Granularità La dimensione media dell unità di calcolo sequenziale che non richiede sincronizzazioni né comunicazioni. Granularità del problema La dimensione media dell insieme di dati assegnati ad un processore. Ad esempio,se una griglia è decomposta spazialmente in sottogriglie,la granularità è il numero di punti in ciascuna sottogriglia. Granularità architetturale La potenza computazionale di ciascun processore Il livello minimo di granularità algoritmica che un multiprocessor gestisce efficientemente. Spingere il grado di parallelismo al di sotto di questo livello causerebbe significative perdite di prestazioni dovute all eccessivo overhead parallelo Michele Colajanni Esplicitazione del parallelismo 28/34

. *. *. * Esempio (come diverse granularità influenzano le prestazioni) Applicazione iterativa che ad ogni passo deve aggiornare ciascun blocco/elemento con i valori dei 4 elementi adiacenti Processo i: Due categorie di elementi: - Elementi interni non hanno dipendenze con dati che appartengono ad altri processi - Elementi bordo, il cui aggiornamento dipende da elementi che appartengono ad altri processi. NECESSITA DI SWAP DELLE AREE DI OVERLAP Processo i: Processo j: Michele Colajanni Esplicitazione del parallelismo 29/34 Esempio [cont.] (come diverse granularità influenzano le prestazioni) Coarse decomposition (blocchi di 6 righe) Fine decomposition (blocchi di 3 righe) Very fine decomposition (blocchi di 2 righe) 2 righe da trasmettere ogni 6 da calcolare (rischio di non bilanciamento, ma basso overhead di comunic.) 2 righe da trasmettere ogni 3 da calcolare (maggior bilanciamento, ma più alto overhead di comunicazione) 2 righe da trasmettere ogni 2 da calcolare (massimo bilanciamento, ma altissimo overhead di comunic.) Michele Colajanni Esplicitazione del parallelismo 30/34

Dall Esplicitazione del al Programma Parallelo Approcci al (a) implicito (b) esplicito Programmatore Programmatore Codice sorgente scritto in linguaggi sequenziali, Es. C, Fortran, LISP, Pascal Codice sorgente scritto in dialetti di linguaggi Sequenziali. Es. Fortran, C, LISP, Pascal Compilatore autoparallelizzante Codice oggetto parallelo Compilatore che preserva la concorrenza Codice oggetto parallelo Esecuzione da parte del Sistema a runtime Esecuzione da parte del Sistema a runtime Michele Colajanni Esplicitazione del parallelismo 32/34

Modelli di programmazione parallela (presente e futuro) MODELLO COMPUTAZIONALE MEMORY MODEL PROCESS CONTROL MECHANISMS HARDWARE DISTRIBUTED PROCESS MODEL MESSAGE PASSING DISTRIBUTED MEMORY MULTICOMPUTER SHARED MPMD O SPMD LOCKS,SEMAPHORES, MONITORS SHARED MEMORY MULTIPROCESSOR Futuro? MEMORY MODEL SHARED PROCESS MODEL MPMD O SPMD COMPILATORE PARALLELO DISTRIBUTED MEMORY MULTICOMPUTER SHARED MEMORY MULTIPROCESSOR Michele Colajanni Esplicitazione del parallelismo 33/34 La realtà dei Linguaggi per la programmazione parallela a scambio di messaggi Linguaggi paralleli Ambienti di Programmazione IMPLICITO PARALLELISMO ESPLICITO PARALLELISMO (CSP, Occam, Ada, ) Linguaggi sequenziali + Librerie a run-time (C parallelo, Fortran parallelo, ) Pre - compilatori (Express, Linda) Librerie di routine parallele (Scalapack, PBLAS, Toolbox, ) Supercompilatori Librerie propriet. Libreria PVM Libreria MPI (HPF, Vienna Fortran) Michele Colajanni Esplicitazione del parallelismo 34/34