# Charm++

Charm++ è un linguaggio di programmazione orientato ad oggetti, basato su C++ ed è stato creato con lo scopo di avere un linguaggio ad alto livello di astrazione per la programmazione parallela senza perdita di prestazioni e con la possibilità di supportare ambienti hardware differenti.
Il progetto è stato sviluppato dal Parallel Programming Laboratory dell'Università dell'Illinois ed attualmente è supportato da tutti i maggiori sistemi operativi (Windows, Linux e Osx) ed è in grado di funzionare su una grande varietà di sistemi hardware standard o dedicati come Cray o IBM Blue Gene.

## Storia

Alla fine degli anni 80 il team di sviluppo dell'Università creò un software denominato C HARM, il quale comprendeva un kernel, chiamato Chare Kernels, fino al 1993, quando al suo interno fu incluso il nuovo modello di sviluppo CHARM++. Con la versione 4.5 del C HARM, il pacchetto fu nominato definitivamente come CHARM++ e, all'inizio del 1999, il tutto fu riscritto in C++. La versione attuale, la 6.8.0 supporta linguaggi come OpenMP. Le versioni più recenti, inoltre, oltre a supportare linguaggi per gpu come OpenCl, hanno una loro libreria dedicata, chiamata "GPU Manager Library", scritta in linguaggio CUDA.

## Struttura del linguaggio

I programmi scritti in linguaggio Charm++ vengono scomposti in una serie di chiamate coordinate ad oggetti definite chares: quando un programma invoca un metodo od un oggetto, il sistema di runtime di Charm++ invia un messaggio a quell'oggetto, il quale può essere residente sul processore locale o su una cpu remota (computazione parallela). Questo messaggio attiva l'esecuzione del codice all'interno della chare, gestendo il messaggio in maniera asincrona. Le chares possono essere raccolte in gruppi chiamati chares array, a cui è possibile inviare messaggi che possono coinvolgere l'intero array o una singola chare al suo interno.
La mappatura delle chares è assolutamente trasparente per il programmatore, permettendo l'allocazione dinamica delle chares al processore durante l'esecuzione del programma: i risultati sono la possibilità di fault-tolerance, il bilanciamento di carico misurabile, i checkpoint, e la possibilità di ampliare o restringere il set di processori utilizzabili dal programma.
Adaptive MPI (AMPI) è una implementazione dello standard MPI (Message Parsing Interface) al di sopra del sistema di runtime di Charm++, fornendo le funzionalità di quest'ultimo in un modello di programmazione MPI più tradizionale. AMPI incapsula ogni processo MPI all'interno di un thread che migra a livello di utente e che viene associato a un oggetto Charm++. Incorporando ogni thread con una chare, i programmi AMPI possono sfruttare automaticamente le funzionalità del sistema di runtime Charm ++ con modeste (o nessuna) modifiche al programma MPI sottostante.

## Applicazioni

Grazie alla possibilità di essere usato per calcolo su piattaforme parallele, Charm++ è alla base di molti programmi scientifici come NAMD (dinamica molecolare), OpenAtom (simulazioni ab-initio), ChaNGa e SpECTRE (astronomia), ROCFlow (simulazione aerospaziale), Episimdemics (epidemiologia). Tutti questi programmi sono in grado di scalare perfettamente da un singolo pc a sistemi cluter con migliaia di processori.