Seminario sulle Estensioni SIMD

Transcript

Seminario sulle Estensioni SIMD
Corso di Sistemi Embedded
Seminario
sulle
Estensioni
SIMD
Ing. Fabrizio Fazzino
Catania, 16/03/2007
www.fazzino.it
Tassonomia di Flynn
In base alla cosiddetta “Tassonomia di
Flynn” (del 1966) le architetture dei
computer si possono classificare in:
SISD (Single Instruction, Single Data)
● MISD (Multiple Instruction, Single Data)
● SIMD (Single Instruction, Multiple Data)
● MIMD (Multiple Instruction, Multiple Data)
●
Architettura SISD
Le architetture SISD sono quelle classiche
nelle quali non è previsto nessun grado di
parallelismo né tra le istruzioni né tra i
dati.
I classici Personal Computer appartengono
a questa categoria.
Architettura MISD
MISD è una architettura abbastanza
inusuale nella quale più istruzioni
concorrenti operano sullo stesso flusso di
dati.
Un campo di applicazione possono ad
esempio essere i sistemi ridondanti,
come i sistemi di controllo degli aeroplani
nei quali se uno dei processori si guasta
l'elaborazione dei dati deve continuare
ugualmente.
Architettura SIMD
Come vedremo nelle architetture SIMD la
medesima operazione può essere applicata
a più operandi contemporaneamente.
Una applicazione frequente di queste
tecnologie avviene nel campo dei codec
audio/video e dei videogame.
Ad esempio se un oggetto poligonale si
sposta bisogna traslare tutti i suoi vertici
sommando ad ognuno di essi lo stesso
valore.
Architettura MIMD
Solitamente nella categoria MIMD si fanno
rientrare i sistemi distribuiti, nei quali più
processori autonomi operano in parallelo su
dati differenti.
DSP
Per molti anni per effettuare un grande
numero di operazioni dello stesso tipo in
parallelo sono stati adoperati chip
specializzati detti DSP (Digital Signal
Processor).
In tempi recenti si è cercato di fare in modo
che anche i processori general-purpose
fossero dotati di capacità simili.
ASI e ASE
Una qualunque architettura di CPU, sia essa
CISC (come x86) o RISC (come MIPS, SPARC
o PowerPC) può essere estesa per includere
istruzioni specializzate per un particolare
tipo di applicazione.
Si definiscono:
●ASI: Application Specific Instruction
●ASE: Application Specific Extension
Una ASE è l'insieme di varie ASI.
ASE di tipo SIMD
Quasi tutte le architetture di CPU esistenti
nel corso degli anni sono state estese per
prevedere anche delle estensioni opzionali
per la gestione di dati vettoriali.
In tal modo una qualunque CPU di tipo
general-purpose può continuare ad
eseguire sistemi e processi di tipo
tradizionale ma in certi casi essere in grado
di eseguire anche istruzioni di tipo SIMD.
Esempi di estensioni di tipo SIMD
Le più diffuse sono:
Apple/IBM/Freescale AltiVec
Intel MMX/SSE/SSE2/SSE3/SSSE3
AMD 3DNow!
SPARC VIS
ARM Neon/VFP
MIPS MDMX/MIPS-3D
Estensioni SIMD nei
processori Intel
Le estensioni SIMD più note sono
ovviamente quelle introdotte da Intel nei
processori per il segmento desktop:
MMX: MultiMedia eXtension
●SSE: Streaming SIMD Extensions
●SSE2: Streaming SIMD Extensions 2
●SSE3: Streaming SIMD Extensions 3
●SSSE3: Supplemental Streaming SIMD
Extensions 3
●
MMX
Sono state introdotte a partire dal Pentium
MMX del 1997, e da allora sono presenti su
tutti i processori sia di Intel che di AMD.
Aggiungono all'architettura 8 nuovi
registri MM0-MM7 capaci di contenere
ciascuno un intero a 64-bit, due a 32-bit,
quattro interi 16-bit oppure 8 singoli byte.
In realtà per risparmiare spazio i registri
sono mappati sugli stessi registri a 80-bit
della FPU, quindi i due tipi di istruzioni non
possono essere eseguiti insieme.
SSE
Questa estensione è stata introdotta da
Intel nel 1999 sui suoi Pentium III in risposta
alle istruzioni 3DNow! introdotte da AMD
l'anno precedente; AMD l'ha poi inclusa a
partire dall'Athlon XP.
SSE prevede 70 nuove istruzioni e 8
nuovi registri XMM0-XMM7 a 128-bit
non condivisi, per effettuare operazioni
SIMD in virgola mobile (per le operazioni
SIMD su interi bisogna sempre usare MMX).
SSE2
Introdotta a partire dai primi Pentium 4 e
poi sugli Athlon 64.
Aggiunge alle 70 istruzioni di SSE (della
quale mantiene i registri) altre 144
istruzioni SIMD anche su interi in modo
da soppiantare completamente la
vecchia MMX.
E' probabilmente l'ASE SIMD più
importante.
SSE3
E' un insieme di 13 nuove istruzioni
aggiunte da Intel al preesistente set SSE2 a
partire dai Pentium 4 con core Prescott, e
da AMD sugli ultimi Athlon 64 e su tutti gli
Athlon 64 X2.
Queste istruzioni aggiungono la capacità di
lavorare in orizzontale sui valori
contenuti in un registro, anziché in
verticale su più registri.
SSSE3
Anche dette SSE4, queste estensioni
aggiungono alle preesistenti SSE3
16 nuove istruzioni.
Sono attualmente incluse solo nei
processori Intel Core 2.
AltiVec
Anche le macchine basate su processori
POWER (come i server pSeries di IBM) e
PowerPC (come i vecchi Apple Mac) hanno a
disposizione le loro 160 istruzioni SIMD.
Esse sono state inizialmente progettate
dalla AIM Alliance (Apple/IBM/Motorola) ed
oggi vengono sviluppate da IBM e Freescale
(che ne ha registrato il nome).
Apple si riferisce ad esse come Velocity
Engine, IBM come VMX.
Confronto fra AltiVec e SSE2
Sia AltiVec che SSE2 usano registri a 128bit, ma AltiVec prevede un numero
quadruplo di tali registri, ovvero i classici
32 delle architetture RISC contro i “soli” 8
di SSE2.
In entrambi i casi ogni registro di 128-bit
può essere visto come un insieme di
interi con segno o senza segno a 8,
16 o 32-bit, oppure come quattro valori
floating-point in precisione singola a
32-bit.
Tabella di confronto
I registri AltiVec sono 32 x 128-bit:
il register file occupa 512 Bytes;
si possono effettuare fino a 16 operazioni
alla volta su singoli byte.
I registri SSE2 sono 8 x 128-bit:
il register file occupa 128 Bytes;
si possono effettuare anche in questo caso
fino a 16 operazioni alla volta su singoli
byte.
Classi di istruzioni SIMD
Tutte le istruzioni SIMD possono
solitamente essere classificate in uno dei
seguenti gruppi:
Load/Store
Manipolazione dati
Aritmetiche
Logiche bit-a-bit
Confronto
Verranno ora mostrati alcuni esempi di
istruzioni delle varie categorie utilizzando
le convenzioni AltiVec.
Istruzioni SIMD
Load/Store
Istruzioni Load/Store:
vec_ld
vec_lde
vec_st
vec_ste
Le Load e Store di un intero array sono
anche affiancate dalla Load Element e
Store Element per agire su un solo
elemento.
Istruzioni SIMD
Manipolazione dati e bit-a-bit
Istruzioni di manipolazione dati:
vec_sll
vec_srl
vec_sra
Istruzioni logiche bit-a-bit:
vec_and/nand
vec_or/nor/xor
Istruzioni SIMD
Aritmetiche
Istruzioni aritmetiche:
vec_add
vec_sub
vec_neg
vec_max
vec_min
vec_abs
vec_avg
Istruzioni SIMD
Confronto
Istruzioni di confronto:
vec_cmpeq
vec_cmpge
vec_cmpgt
Per effettuare confronti di uguaglianza,
greater equal e greater than.
Esempio AltiVec #1:
somma di interi
vaddubm = “vector add unsigned byte with
modulo (or wrap)”, aggiunge 16 singoli byte
ad altri 16 con una singola istruzione:
Esempio AltiVec #2:
multiply-add floating-point
vmaddfp = “vector multiply-add floatingpoint”, esegue un prodotto e una somma
tra valori FP con una sola istruzione:
Esempio AltiVec #3:
permutazione
vperm = “vector permutation”, riempie un
registro con byte provenienti da altri due:
Esempio AltiVec #4:
splat
vsplth/vspltw = “vector splat
halfword/word“, ricopia più volte un
elemento dentro un altro registro
Conclusioni
In questo seminario sulle estensioni SIMD
abbiamo visto come tali istruzioni, nel caso
di problemi che prevedano di per sé un
certo grado di parallelismo sui dati,
permettano di incrementare le capacità
computazionali del calcolatore.
Fortunatamente molti compilatori moderni
(come GCC) sono in grado di ottimizzare il
codice vettoriale senza che il
programmatore debba curarsi di
apprendere tutti i codici operativi delle
nuove istruzioni.
Riferimenti
Gran parte delle informazioni scritte in
questa presentazione sono state tratte da
Wikipedia, ad esempio a partire dalla
pagina
http://en.wikipedia.org/wiki/SIMD
Una buona guida ad AltiVec è sulla pagina
Velocity Engine di Apple:
http://developer.apple.com/hardwaredrivers/ve/
Questa presentazione è pubblicata su
www.fazzino.it , link “Seminario SIMD”.