# SIMD

Architetture correlate (Tassonomia di Flynn) :
| | Istruzione Singola | Istruzioni Multiple |
| Dato Singolo | SISD | MISD |
| Dati Multipli | SIMD | MIMD |
Single Instruction stream, Multiple Data stream (SIMD) è un'architettura in cui un elevato numero di processori identici eseguono la stessa sequenza di istruzioni su insiemi diversi di dati. I processori SIMD sono spesso usati dai supercomputer e con alcune varianti anche nei moderni microprocessori.
Il modello SIMD è composto da un'unica unità di controllo che esegue una istruzione alla volta controllando più ALU che operano in maniera sincrona. Ad ogni passo, tutti gli elementi eseguono la stessa istruzione scalare, ma ciascuno su un dato differente. Un elaboratore basato su questo modello è anche detto Array Processor (Processore vettoriale).
In passato venivano prodotti un numero elevato di dispositivi dedicati allo svolgimento di compiti specifici. Usualmente questi dispositivi erano DSP opportunamente programmati. La differenza fondamentale tra le istruzioni SIMD e i DSP è che questi sono dotati di un set di istruzioni completo e quindi sono in grado di svolgere teoricamente qualsiasi compito. Invece le istruzioni SIMD sono progettate per manipolare elevate quantità di dati in parallelo e per le usuali operazioni si appoggiano ad un altro insieme di istruzioni usualmente gestito dal microprocessore. Inoltre i DSP tendono a includere un certo numero di istruzioni dedicate ad elaborare tipi specifici di dati come possono essere i dati audio o video mentre le istruzioni SIMD vengono utilizzate per elaborare dati generici.

## Vantaggi

Nell'elaborazione di dati multimediali spesso si incontrano algoritmi che possono avvantaggiarsi di un'architettura SIMD. Per esempio per cambiare la luminosità di un'immagine un microprocessore dovrebbe caricare ogni pixel che compone l'immagine nei suoi registri, effettuare la modifica della luminosità e poi salvare i risultati in memoria. Un processore SIMD eseguirebbe prima un'istruzione che caricherebbe con un'unica operazione un certo numero di pixel (il numero preciso dipende dall'architettura) poi il processore modificherebbe tutti i dati in parallelo e in seguito li salverebbe tutti contemporaneamente in memoria. Eseguire le operazioni a blocchi invece che agire sui singoli pixel rende le operazioni molto più efficienti dato che i moderni computer sono progettati per trasferire i dati a blocchi e sono inefficienti nei singoli accessi alla memoria.
Un altro vantaggio deriva dal fatto che tipicamente le istruzioni SIMD sono sempre in grado di manipolare tutti i dati caricati contemporaneamente: Quindi se un processore SIMD è in grado di caricare 8 dati, questo sarà anche in grado di processarli tutti contemporaneamente. Anche i microprocessori superscalari sono in grado di elaborare più dati contemporaneamente ma con un'efficienza inferiore.

## Svantaggi

Le architetture basate su SIMD richiedono un numero elevato di registri e quindi a volte i progettisti per ridurre i costi decidono di utilizzare i registri della FPU. Questa scelta rende impossibile utilizzare istruzioni SIMD e FPU contemporaneamente a meno di lenti cambi di contesto. Questo era l'approccio scelto da Intel per le istruzioni MMX che infatti sono notoriamente lente se associate a operazioni in virgola mobile. Va anche considerato che la programmazione parallela è, generalmente, più complessa rispetto alla programmazione scalare e quindi richiede molto più tempo e competenze da parte del programmatore.

## Limiti

Il limite intrinseco delle architetture di tipo SIMD è dato dalla legge di Amdahl relativa alla frazione parallelizzabile. La legge esprime il concetto che il livello massimo di parallelizzazione ottenibile è limitato superiormente dalla cosiddetta frazione non parallelizzabile di codice presente nel sorgente del programma da eseguire. Quindi un programma che gira su una architettura SIMD non potrà essere mai eseguito in meno tempo di quello necessario ad eseguire la frazione di codice che non è parallelizzabile.

## Storia

Il primo utilizzo di istruzioni SIMD si ebbe nei computer vettoriali, specialmente in quelli prodotti dalla Cray negli anni 70.
Le macchine successive preferirono utilizzare un numero relativamente elevato di semplici processori. Esempi di questo tipo di macchine sono:
* Xplor, di Pyxsys, Inc., 2001
* Connection Machine, modello 1 e 2 (CM-1 e CM-2), di Thinking Machines Corporation, 1985
* Zephyr DTC computer from Wavetracer, circa 1991
* Massively Parallel Processor (MPP), della NASA/Goddard Space Flight Center, 1983-1991
E molte altre macchine meno conosciute

## Recenti computer SIMD

Negli ultimi anni sono strati prodotti molti microprocessori dotati di istruzioni SIMD di media dimensione (64 o 128 bit). Nel 1994 i processori PA-RISC vennero dotati delle istruzioni MAX. Attualmente istruzioni SIMD sono incluse in quasi tutti i microprocessori, tra i quali ricordiamo PowerPC, con le istruzioni AltiVec, le Intel MMX, SSE, SSE2, SSE3 e SSE4, l'AMD 3DNow!, ARM con la tecnologia NEON, le istruzioni SPARC VIS, le PA-RISC MAX e le MIPS MDMX e MIPS-3D.
Queste istruzioni generalmente includono tutte le principali operazioni di elaborazione sui vettori e le matrici. Spesso queste istruzioni includono elaborazioni tridimensionali. Le moderne schede grafiche sono dotate di processori SIMD dedicati che sgravano la CPU di elaborazioni onerose legate alla visualizzazione tridimensionale. Alcuni processori includono istruzioni dedicate all'elaborazione dei segnali, queste operazioni vengono utilizzate per codificare/decodificare i flussi video per velocizzare gli algoritmi di compressione.

## Software

Nei personal computer lo sviluppo di software SIMD inizialmente è proceduto con lentezza. Questo è stato dovuto a due problemi concomitanti. Il primo problema era dovuto al fatto che Intel e AMD per risparmiare avevano deciso di utilizzare come registri per le istruzioni SIMD i registri della FPU e questa scelta progettuale deprimeva le prestazioni del software SIMD. Il secondo problema era le gestione deficitaria dei compilatori. Inizialmente i compilatori non erano in grado di gestire efficacemente le istruzioni SIMD e quindi spesso i programmatori che intendevano utilizzare queste istruzioni erano costretti a scrivere estese porzioni di codice in Assembly.
Nonostante la partenza lenta del software SIMD su macchine x86 in seguito i compilatori migliorarono e Intel rilasciò le istruzioni SSE che risolvevano i maggiori problemi delle precedenti istruzioni SIMD. Infatti attualmente il software SIMD si sta diffondendo rapidamente.
Nei sistemi prodotti da Apple il software SIMD invece si è diffuso quasi subito. I processori utilizzati da Apple utilizzavano le istruzioni SIMD AltiVec, notevolmente più performanti delle istruzioni MMX di Intel. Inoltre i programmatori di sistemi Apple ebbero a disposizione quasi subito buoni compilatori per istruzioni SIMD prodotti da Motorola, IBM e dal progetto GNU. Inoltre Apple puntò molto sulle istruzioni SIMD infatti molti suoi programmi come QuickTime e iTunes utilizzano istruzioni SIMD.

## Applicazioni commerciali

Spesso i processori SIMD vengono utilizzati per le applicazioni audio/video e per gestire la grafica tridimensionale. Infatti all'interno della console PlayStation 2 della Sony è montato un processore SIMD che utilizza vettori a quattro dimensioni e provvede a gestire la grafica dei videogiochi.
Un processore vettoriale è il Cell. Questo processore viene sviluppato da IBM in congiunzione con Toshiba e Sony. Il processore è dotato di un certo numero di unità SIMD dotate di RAM indipendente e di un processore classico utilizzato per eseguire le istruzioni non SIMD. Questo processore è sviluppato per essere utilizzato dalle applicazioni che fanno un utilizzo intenso della grafica tridimensionale, infatti è stato utilizzato dalla PlayStation 3.