Mi scuso in anticipo per il formato post-blog della mia risposta. Non ho potuto fare a meno di fare una piccola panoramica del mondo dell'informatica parallela.
È possibile classificare i modelli di programmazione parallela in circa due categorie: modelli di flusso di controllo e flusso di dati.
I modelli di flusso di controllo cercano di far funzionare il parallelismo nel contesto di un programma di controllo esplicito, praticamente ogni computer programmabile oggi. Il problema fondamentale affrontato è che una tale "architettura Von Neumann" non è stata progettata per l'esecuzione parallela, ma per calcoli sequenziali efficienti. Il parallelismo in tale contesto si ottiene duplicando parti dei moduli di base (memoria, controllo, aritmetica).
La duplicazione solo dell'aritmetica fornisce istruzioni SIMD, tutte le ALU condividono lo stesso Program Counter (PC) e quindi eseguono sempre la stessa operazione in parallelo, anche se su dati diversi.
La duplicazione di ALU e PC, ma mantenendo il sequencer di istruzioni all'interno dell'unità di controllo offre l'esecuzione Out of Order (OoO) che produce un certo parallelismo della pipeline. In questa categoria hai anche la Very Long Instruction Word (VLWI) e le tecniche di previsione della branche. Raramente vedi questa categoria a livello di software.
Andare un po 'oltre è duplicare l'intero "core", ma mantenendo la memoria condivisa, questi sono gli attuali processori multicore che ti offrono task (o thread) parallelismo. La condivisione della memoria in questo contesto ti dà problemi di concorrenza molto, molto difficili e sottili . I calcoli paralleli sull'attuale multicore ruotano quindi completamente attorno a problemi di sincronizzazione / concorrenza, all'attento equilibrio di prestazioni (nessuna sincronizzazione) e semantica desiderata (totalmente sincronizzata, semantica di esecuzione sequenziale). Esempi di questo è la PRAM o più popolare in questi giorni il cilk di scatti come fork / join ( IntelTBB , Java.Utils.Concurrency). I modelli CSP e Actor sono modelli di concorrenza, ma come menzionato sopra la concorrenza e il parallelismo si confondono in un ambiente di memoria condivisa. nb parallelismo è per prestazioni, concorrenza per mantenere la semantica corretta.
Anche la duplicazione della memoria offre computer in rete programmati con MPI e simili o semplicemente strane architetture non Von Neumann come i processori network-on-a-chip (processore cloud, Transputer, Tilera). Modelli di memoria come UMA o NUMA cercano di mantenere l'illusione della memoria condivisa e possono esistere a livello di software o hardware. MPI mantiene il parallelismo a livello di programma e comunica solo attraverso il passaggio di messaggi. Il passaggio dei messaggi viene utilizzato anche a livello hardware per la comunicazione e la concorrenza (Transputer).
La seconda categoria sono modelli di flusso di dati . Questi sono stati progettati all'alba dell'era dei computer come un modo per scrivere ed eseguire calcoli paralleli, evitando il design di Von Neumann. Questi sono andati fuori moda (per il calcolo parallelo) negli anni '80 dopo che le prestazioni sequenziali sono aumentate in modo esponenziale. Tuttavia, molti sistemi di programmazione parallela come Google MapReduce, Microsoft Dryad o Intel Concurrent Collections sono in realtà modelli di calcolo del flusso di dati. Ad un certo punto rappresentano i calcoli come un grafico e li usano per guidare l'esecuzione.
Specificando parti dei modelli si ottengono diverse categorie e semantiche per il modello di flusso di dati. In cosa limiti la forma del grafico a: DAG (CnC, Dryad), albero (mapreduce), digraph? Esistono semantiche di sincronizzazione rigorose ( Lustre, programmazione reattiva]? Impedisci la ricorsione per poter avere una pianificazione statica (StreaMIT) o offri maggiore potenza espressiva con uno scheduler dinamico (Intel CnC)? Esiste un limite al numero di fronti in entrata o in uscita? La semantica di attivazione consente di attivare il nodo quando è disponibile un sottoinsieme dei dati in arrivo? Sono flussi di bordi di dati (elaborazione del flusso) o token di dati singoli (assegnazione singola statica / dinamica). Per il lavoro correlato puoi iniziare guardando il lavoro di ricerca sul flusso di dati di persone come Arvind, K. Kavi, j. Sharp, W. Ackerman, R. Jagannathan, ecc.
Modifica: per completezza. Vorrei sottolineare che esistono anche modelli paralleli guidati dalla riduzione e dal modello . Per le strategie di riduzione hai ampiamente riduzione del grafico e riduzione della stringa. Haskell utilizza fondamentalmente la riduzione dei grafici, che è una strategia molto efficiente su un sistema sequenziale a memoria condivisa. I duplicati per la riduzione delle stringhe funzionano, ma hanno una proprietà di memoria privata che lo rende più adatto per essere implicitamente parallelizzato. I modelli guidati da modelli sono i linguaggi logici paralleli, come il prologo simultaneo. Anche il modello Actor è un modello basato su pattern, ma con caratteristiche di memoria privata.
PS. Uso ampiamente il termine "modello", che copre le macchine astratte sia per scopi formali che di programmazione.