Stream processing
# Stream processing

Lo stream processing è un paradigma di programmazione parallela di tipo SIMD che permette ad alcune applicazioni di sfruttare semplicemente una forma limitata di elaborazione parallela. Le applicazioni utilizzano delle unità funzionali come FPU o GPU senza doversi preoccupare di gestirne la sincronizzazione o la comunicazione tra le unità funzionali, sgravando il programmatore da uno dei principali problemi della programmazione parallela.

Il paradigma dello stream processing semplifica lo sviluppo dell'hardware e del software limitando le operazioni che possono essere eseguite. Questo paradigma presume di avere i dati da elaborare organizzati in gruppi (stream) e che questi possano essere elaborati applicando ad essi una serie di operazioni. Configurazioni nelle quali una serie di operazioni devono essere applicate a tutti i dati sono comuni. Spesso le operazioni vengono elaborate tramite l'utilizzo di strutture a pipeline al fine di ridurre i tempi di elaborazione e spesso vengono utilizzate delle cache on-chip al fine di ridurre gli accessi alla memoria centrale. Dato che queste strutture spesso eseguono una serie di operazioni note a priori su estesi insiemi di dati le pipeline e le cache on-chip si possono configurare al fine di ridurre/eliminare le latenze e i blocchi che normalmente si presentano nei microprocessori. Questo permette di realizzare unità con elevate prestazioni ma con delle cache di dimensioni modeste, assegnando la maggior parte dei transistor alle unità di elaborazione, cosa non possibili nei processori tradizionali che dovendo elaborare programmi strutturati in modo arbitrario necessitano di cache di grandi dimensioni e di strutture complesse per seguire il flusso del programma in esecuzione.

Durante gli anni ottanta lo stream processing è stato estesamente studiato durante lo sviluppo della programmazione dataflow. Un esempio di questi studi è il linguaggio SISAL (Streams and Iteration in a Single Assignment Language).

## Applicazioni

Il paradigma del stream processing parte dal presupposto di avere un'elevata mole di dati da elaborare con operazioni regolari e quindi ben si adatta alle applicazioni che normalmente vengono svolte dalle GPU o dai DSP. Applicazioni più generiche o che accedono in modo disorganizzato ai dati (come per esempio i database) mal si adatterebbero a questo paradigma di programmazione. In sostanza viene sacrificata la flessibilità di elaborazione per la velocità dell'elaborazione.

Lo stream processing mostra le migliori prestazioni con applicazioni che mostrano le seguenti caratteristiche:

* elevata richiesta computazionale: le operazioni aritmetico/logiche devono essere preponderanti rispetto alle operazioni di I/O dalla memoria;
* parallelismo dei dati: i dati devono poter essere elaborati in parallelo senza aver problemi di sincronizzazione o di dipendenza tra i dati;
* località dei dati: questa è una particolare tipologia di località dei dati, comune nell'elaborazione dei segnali e nella gestione dei file multimediali. Questa località prevede che il dato vengano letti una o due volte durante l'elaborazione, i dati intermedi dipendono direttamente dalle elaborazioni e quindi vengono gestiti e ricavati direttamente dal flusso di elaborazione.
