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”.