• Non ci sono risultati.

ASSIST (A Software development System based on Integrated Skeleton Tech- nology) nasce all’interno del Dipartimento di Informatica dell’Universit`a di Pisa, come proposta di un nuovo ambiente di programmazione orientato al- lo sviluppo di applicazioni parallele e distribuite con un approccio unificato. L’obiettivo principale `e la creazione di un sistema di programmazione ad alto livello per applicazioni complesse e multidisciplinari, che garantisca elevate prestazioni e scalabilit`a su differenti piattaforme (da singole macchine paral- lele a cluster eterogenei fino a griglie computazionali) e il riuso di software parallelo preesistente.

Lo sviluppo di ASSIST deriva dall’esperienza maturata nei precedenti ambienti P3L e SkIE, bastati su un modello a skeleton, che hanno mostrato i benefici degli skeleton ma anche le loro maggiori limitazioni:

• gli skeleton sono composti tramite interfacce ben definite, e separano l’implementazione dalla definizione del programma;

• le parti sequenziali degli skeleton possono essere scritte in qualsiasi lin- guaggio di programmazione, aumentando la produttivit`a degli svilup- patori di applicazioni che non devono riscrivere il codice gi`a prodotto;

• l’adozione di linguaggi standard permette anche di utilizzare i compila- tori preesistenti, che garantiscono la creazione di un codice sequenziale ottimizzato;

• con alcune restrizioni, anche del codice binario pu`o essere utilizza- to per le parti sequenziali degli skeleton, garantendo quindi anche la portabilit`a di applicazioni chiuse e non modificabili;

• la portabilit`a delle performance risulta soddisfacente, soprattutto su piattaforme omogenee, in quanto la conoscenza dei modelli dei co- sti permette di ricompilare i programmi per utilizzare efficientemente l’ambiente di esecuzione.

In certi casi per`o l’espressivit`a degli skeleton non basta per sviluppare ap- plicazioni complesse, ed ASSIST si propone di superare alcuni di questi problemi, in particolare:

• oltre alla capacit`a di esprimere alcuni schemi paralleli tipici, si vuo- le offrire la possibilit`a di descrivere strutture pi`u generiche, in modo da favorire applicazioni con pattern di comunicazioni particolari non supportate dagli skeleton classici;

• i modelli a skeleton offrono spesso una semantica funzionale e determi- nistica, che pu`o limitarne l’uso in applicazioni complesse;

• si vuole migliorare il concetto di composizione di skeleton, e supera- re le inefficienze indotte in alcune forme che mischiano i concetti di parallelismo su dati e su stream;

• in molte applicazioni `e necessaria la presenza di uno stato condiviso, o meglio una Distributed Shared Memory per lavorare efficientemente con grandi quantit`a di dati e semplificare la programmazione di problemi dinamici o irregolari;

• infine, progetti precedenti hanno dimostrato che il modello a skeleton non `e spesso sufficiente per riusare applicazioni parallele scritte in diffe- renti formalismi, in quanto si riesce ad ottenere un buon grado di riuso solo per le parti interamente sequenziali; si vogliono quindi sviluppare tecniche per aumentare il riuso del codice parallelo preesistente.

Tutte queste considerazioni hanno portato allo sviluppo di ASSIST, che cerca di superare tutte le limitazioni sopra descritte:

1. permette di esprimere programmi paralleli e distribuiti tramite grafi generici, che si sono rivelati abbastanza potenti per modellare la mag- gior parte delle applicazioni parallele; al tempo stesso, per`o, supporta il riconoscimento di strutture note, di cui sono conosciute informazioni aggiuntive (ad esempio il modello di costi);

2. i nodi del grafo sono moduli paralleli (parmod) o sequenziali, facilmente sostituibili con nuove versioni senza modificare il resto dell’applicazione;

3. i moduli comunicano tra loro attraverso stream con tipo, rappresentanti nel grafo come archi;

4. il codice sequenziale contenuto nei moduli pu`o essere sorgente scrit- to nei linguaggi pi`u comuni (C, C++, Fortran) oppure, con alcune limitazioni, un binario precompilato;

5. il concetto di skeleton non appare pi`u in modo evidente nel modello, ma `e stato sostituito da quello di “modulo parallelo”, che pu`o essere considerato una sorta di skeleton generico, programmabile per emulare sia le forme di parallelismo pi`u comuni e normalmente rappresentate dagli skeleton, sia forme differenti (composizione di parallelismo su dati e su stream, non determinismo, etc);

6. i moduli paralleli introducono il concetto di “stato interno” per soppe- rire alla semantica funzionale degli skeleton, e la possibilit`a di gestire il non determinismo sugli stream in ingresso;

7. permette di condividere dati tra i moduli tramite “oggetti condivisi” implementati con DSM, per sopperire ai tipici problemi degli stream nel caso di moduli che lavorano con grandi moli di dati.

Ovviamente la maggiore generalit`a si paga; nel caso particolare di ASSIST la struttura a grafo generico e il modulo parallelo che racchiude differenti tipo- logie di skeleton potrebbero limitare l’applicabilit`a dei modelli di costo e di conseguenza le ottimizzazioni possibili. In realt`a la computazione mantiene una struttura ben precisa che, seppur pi`u complicata da analizzare rispetto alla semplice composizione di skeleton, si pu`o formalizzare grazie ad elementi di teoria delle code; per quanto riguarda il parmod, con esso si riesce comun- que a realizzare solo forme di parallelismo note (esattamente come con gli skeleton) di cui conosciamo tutte le informazioni.

L’evoluzione di ASSIST La bont`a e la generalit`a del modello di ASSIST sono state poi dimostrate nel tempo, grazie a successivi progetti.

Innanzitutto la caratteristica principale derivata dal modello `e che i mo- duli ASSIST possono essere compilati in una versione parametrica sul grado di parallelismo in modo trasparente al programmatore; in questo modo il grado di parallelismo viene scelto al momento dell’esecuzione, in base alle caratteristiche della piattaforma scelta o delle prestazioni desiderate.

Un successivo progetto[79] ha permesso l’introduzione di meccanismi a run time per la modifica del grado di parallelismo dell’applicazione, esten- dendo cos`ı le potenzialit`a dell’ambiente; a questo `e stato poi affiancato un sistema di gestione automatica del grado di parallelismo che, in base ad un contratto di QoS specificato dal programmatore e variabile nel tempo, decide autonomamente se aggiungere o rimuovere processi all’interno dei moduli pa- ralleli. Questo ha portato ad una prima forma di Adattivit`a delle applicazioni ASSIST.

La tipizzazione degli stream ha permesso la realizzazione di meccanismi automatici di conversione dei tipi tra piattaforme differenti, per permettere l’esecuzione di applicazioni parallele su piattaforme eterogenee.

Tutte queste funzionalit`a sono poi confluite in una versione di ASSIST che supporta griglie computazionali tramite il middleware Globus[6], e sfrutta le tecniche per eterogeneit`a ed adattivit`a di cui abbiamo parlato sopra per supportare le caratteristiche intrinseche del grid computing.

Infine, nell’ambito del progetto GRID.it[11] i moduli e le applicazioni ASSIST sono state incapsulate in componenti e web-service, al loro interno paralleli, per fornire componenti e servizi ad alte prestazioni.

Tutte le modifiche di cui abbiamo parlato sono state apportate tramite modifiche al supporto e all’implementazione. Non abbiamo toccato il modello, che si `e rivelato molto flessibile e potente.

Al fine di dimostrare l’effettiva programmabilit`a di ASSIST sono state poi realizzate molte applicazioni complesse, ad esempio:

• algoritmi di data mining irregolari e difficilmente implementabili tra- mite skeleton, come il C4.5[78];

• algoritmi di simulazione, come il Barnes-Hut N-Body[7];

• un sistema di Knowledge Discovery parallelo su Database, integrato con altre applicazioni, per il progetto SAIB (System for Internet Banking Applications)[32];

• un algoritmo di “isosurface extraction” applicato alla bioinformatica[59]. ASSIST si `e quindi dimostrato un modello di programmazione parallela molto espressivo, e al tempo stesso adatto per delegare la gestione di gran parte dei dettagli al supporto.