SPARC Architecture Overview Politecnico di Milano Polo Regionale di Como Sistemi Embedded Autore: Aldo Puglisi 674641 [email: [email protected]] Docente: Prof. Carlo Brandolese Indice Introduzione ........................................................................................................................... 3 1.0 Scalable Processor ARChitecture ......................................................................... 4 1.1 Le origini ....................................................................................................................... 5 1.2 Processori SPARC ..................................................................................................... 5 1.2.1 Integer Unit (IU) .............................................................................................. 5 1.2.2 Floating-point Unit (FPU)............................................................................. 6 1.2.3 Coprocessor (CP).............................................................................................. 6 1.3 Istruzioni ...................................................................................................................... 7 1.3.1 Esecuzione ........................................................................................................... 7 1.3.2 Formato ................................................................................................................. 7 1.3.3 Categorie............................................................................................................... 8 1.4 Modello di Memoria ............................................................................................... 11 1.5 Traps ............................................................................................................................. 13 1.5.1 Categorie di Traps .......................................................................................... 13 1.6 Cambiamenti da SPARC-V8 a SPARC-V9 .................................................... 13 2.0 Implementazioni......................................................................................................... 15 2.1 UltraSPARC ................................................................................................................ 16 2.1.1 UltraSPARC I/II .............................................................................................. 16 2.1.2 UltraSPARC III................................................................................................. 24 2.1.3 UltraSPARC IV .................................................................................................. 32 2.1.4 Visual Instruction Set (VIS) ..................................................................... 35 2.2 LEON.............................................................................................................................. 37 2.3 Altre Soluzioni.......................................................................................................... 38 2.3.1 Super SPARC ..................................................................................................... 38 2.3.2 Sun SPARC.......................................................................................................... 38 2.3.3 Micro SPARC...................................................................................................... 38 2.3.4 Hyper SPARC..................................................................................................... 38 3.0 Conclusioni e Sviluppi Futuri................................................................................ 39 4.0 Riferimenti ..................................................................................................................... 40 ____________________________________________________________________________________ SPARC Architecture Overview Pagina 2 di 40 Introduzione SPARC (acronimo che sta per "Scalable Processor ARChitecture") è una Instruction Set Architecture (ISA) creata da Sun Microsystem e mantenuta da SPARC International [1], un consorzio di produttori di computer, il cui scopo è quello di creare, aggiornare e mantenere uno standard di riferimento aperto (open standard). Dunque, SPARC, nelle sue tre versioni 7, 8 e 9, non è un preciso chip, ma una specifica di architettura che chiunque, sotto licenza di SPARC International, può implementare. SPARC si basa su Reduced Instruction Set Architecture (RISC). Questa tipologia di processori hanno una unità di controllo cablata molto semplice e riservano molto spazio per i registri interni: una CPU RISC ha di solito da un minimo di un centinaio ad alcune migliaia di registri interni generici, organizzati in un file di registri. Il tipico set di istruzioni RISC è molto piccolo, circa sessanta o settanta istruzioni molto elementari (logiche, aritmetiche e istruzioni di trasferimento memoria-registro e registroregistro): hanno tutte lo stesso formato e la stessa lunghezza, e tutte o quasi vengono eseguite in un solo ciclo di clock. Sono presenti solo un numero ristretto di metodi di indirizzamento. Il fatto di avere un formato unico di istruzione permette di strutturare l'unità di controllo come una pipeline, cioè una “catena di montaggio” a più stadi: questa innovazione ha il grosso vantaggio di ridurre il critical path interno alla CPU e consente ai RISC di raggiungere frequenze di clock più alte rispetto agli analoghi CISC. La complessità nei RISC si sposta dall'hardware al software: un compilatore che genera codice per CPU RISC deve affrontare un duro lavoro per generare codice compatto ed efficiente, che in ogni caso sarà più grande ed occuperà più memoria dell'equivalente per CISC. In questa analisi vedremo come i concetti tipici della strutturazione RISC di una macchina convenzionale sono stati messi in pratica per la definizione e realizzazione dell'architettura SPARC. Lo scopo è quello di analizzare le caratteristiche principali dell’architettura SPARC, focalizzando l’attenzione sulle principali unità funzionali e sulle diverse implementazioni presenti sul mercato. In particolare, nel Primo Capitolo descriveremo brevemente l’architettura SPARC, fornendo gli elementi essenziali per comprendere le caratteristiche dello standard: verranno descritte le principali unità funzionali, le istruzioni, la memoria, e le trap. Nel Secondo Capitolo analizzeremo le principali implementazioni presenti sul mercato. In particolare focalizzeremo la nostra attenzione sulla famiglia UltraSPARC sviluppata da Sun Microsystem [2], in quanto sembra essere il progetto più attivo negli ultimi anni per quanto riguarda lo sviluppo di SPARC. In seguito analizzeremo revemente anche altre soluzioni come: LEON, Super SPARC, Hyper SPARC, ecc.. Infine, nell’ultimo Capitolo concluderemo l’approfondimento con le considerazioni e gli sviluppi futuri. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 3 di 40 1.0 Scalable Processor ARChitecture In questo Capitolo esamineremo le principali caratteristiche dell’Architettura SPARC, focalizzando l’attenzione sulle principali unità che compongono un processore conforme allo standard, sulla memoria e sul formato delle istruzioni. Inoltre al termine del Capitolo, analizzeremo le differenze tra le versioni SPARC-V8 e SPARC-V9. Come precedentemente sottolineato, lo scopo del capitolo non è quella di dare una descrizione esaustiva delle caratteristiche dell’architettura, ma è quello di fornire gli elementi necessari per comprendere le proprietà delle diverse implementazioni. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 4 di 40 1.1 Le origini La prima versione dello standard SPARC venne introdotta da Sun Microsystems nel 1985, riprendendo ed estendendo la struttura dei processori sperimentali RISC-1, RISC-2 e SOAR, proposti dal gruppo di ricercatori guidati dal professor Patterson presso la University of California a Berkeley. In seguito (1989), nacque il consorzio SPARC International, con il compito di mantenere e sviluppare nel tempo lo standard Scalable Processor ARChitecture. Come precedentemente anticipato, SPARC International sviluppò tre versioni dell’architettura: SPARC-V7, SPARC-V8 e SPARC-V9. La versione SPARC-V7 è ormai parecchio obsoleta, e verrà tralasciata per brevità. Verranno invece prese in considerazione le altre due versioni dello standard, focalizzando l’attenzione sull’ultima versione, ovvero SPARC-V9 a 64-bit. 1.2 Processori SPARC I processori SPARC sono composti logicamente da una integer unit (UI), una floating point unit (FPU), ed opzionalmente da un coprocessore (CP), ognuno con i propri registri. Questa organizzazione permette implementazioni con la massima concorrenza tra l’esecuzione delle istruzioni intere, di floating point, e coprocessore. I registri interi sono a 64-bit; i registri floating-point sono da 32, 64, 128-bit. Gli operandi delle istruzioni sono generalmente a registro singolo, doppio, quadruplo, o costanti. Il processore può lavorare in due modi: user o supervisore. In modo supervisore, il processore può eseguire qualsiasi tipo di istruzione, incluse le istruzioni privilegiate (supervisor-only). In user mode, un tentativo di eseguire una istruzione privilegiata causa una trap da parte del software supervisore. I programmi “User application” sono programmi eseguiti quando il processore è in user mode. Nei prossimi paragrafi analizzeremo brevemente le caratteristiche delle unità logiche sopra elencate, ovvero integer unit (IU), floating-point unit (FPU)e coprocessor unit (CP). 1.2.1 Integer Unit (IU) L’Integer Unit (IU) contiene i registri general-purpose e controlla la totalità delle operazioni del processore. La UI esegue le istruzioni in aritmetica intera e computa gli indirizzi di memoria per le istruzioni di load e store. Inoltre, essa mantiene il program counter e controlla l’esecuzione delle istruzioni per Floating Point Unit (FPU) e Coprocessor (CP). Una implementazione della IU può contenere da 64 a 528 registri r a 32-bit generalpurpose. Questo corrisponde ad un raggruppamento dei registri in 8 registri r globali, 8 registri r globali alternati, più uno stack circolare da 3 a 32 gruppi da 16 registri ognuno, conosciuti come register windows. Siccome il numero di register windows presenti (NWINDOWS) è dipendente dall’implementazione, anche il numero totale di registri è dipendente dall’implementazione. Il termine “Scalable” in SPARC, deriva proprio dal fatto che la specifica non vincola il numero totale di registri che un’implementazione deve avere. Attualmente, un'istruzione può accedere agli 8 registri globali (o gli 8 globali alternati) e ad una register window nei registri r. Una 24-register window comprende un set di ____________________________________________________________________________________ SPARC Architecture Overview Pagina 5 di 40 16 registri – diviso in 8 registri in e 8 registri local – insieme con 8 registri in di un register set adiacente, indirizzabile dalla finestra corrente come suoi registri di uscita out. E’ importante notare che diversamente ai registri di in, locali e out, i registri globali non fanno parte di alcuna register window. I registri globali sono un insieme di otto registri con scopo globale, come il set dei registri delle architetture di processori più tradizionali. La finestra corrente è specificata dal campo current window pointer (CWP) nel processor state register (PSR). Window overflow e underflow sono rilevati tramite il registro window invalid mask (WIM), che è controllato dal software di supervisore. Il numero attuale di finestre in una implementazione SPARC-V9 è invisibile ai programmi user-application. Ogni volta che la IU accede una istruzione dalla memoria o dei dati, essa allega all’indirizzo un address space identifier, o ASI (si veda più avanti). 1.2.2 Floating-point Unit (FPU) La FPU contiene 32 registri floating-point a 32-bit (precisione singola), 32 registri floating-point a 64-bit (precisione doppia), 16 registri floating-point a 128-bit (precisione quadrupla), alcuni di essi sovrapposti. I 32 registri a precisione singola, la metà inferiore dei registri a precisione doppia e la metà inferiore dei registri a precisione quadrupla si sovrappongono tra loro. La metà superiore dei registri a precisione doppia e la metà superiore di quelli a precisione quadrupla si sovrappongono tra di loro, ma non sovrappongono nessun dei registri a precisione singola. Dunque, i registri floating-point possono gestire un massimo di 32 valori a precisione singola, 32 a precisione doppia, o 16 a precisione quadrupla. Le istruzioni load/store di Floating-point sono usate per muovere i dati tra FPU e memoria. Gli indirizzi di memoria sono computati da IU. Le istruzioni Floating-Point operate (FPop) eseguono operazioni aritmetiche floating-point e confronti. Il floating-point instruction set ed il formato dei dati a 32-bit e 64-bit sono conformi allo Standard for Binary Floating-Point Arithmetic, IEEE Std 754-1985. Tuttavia, SPARC non richiede che tutti gli aspetti dello standard siano implementati in hardware. Una implementazione può indicare che una istruzione floating point non produce un corretto risultato IEEE Std 754-1985 generando una speciale eccezione floating-point unfinished o unimplemented. I software devono necessariamente emulare qualsiasi funzionalità non presente in hardware. Se la FPU non è presente, o se non è abilitata (il bit enable floating point (EF) nel PSR è 0), un tentativo di eseguire una istruzione floating point genera una trap fp_disabled. In entrambi i casi, i software devono: • • Abilitare la FPU e rieseguire l’istruzione, oppure Emulare l’istruzione che ha lanciato la trap 1.2.3 Coprocessor (CP) L’instruction set include il supporto per un coprocessore singolo dipendente dall’implementazione. Il coprocessore ha il suo set di registri. Le istruzioni di load/store del coprocessore sono utilizzate per muovere i dati tra i registri del coprocessore e la memoria. Per ogni floating point load/store nell’instruction set, c’è un analoga istruzione load/store del coprocessore. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 6 di 40 Se un CP non è presente, o non è abilitato (il bit enable_coprocessor (EC) nel PSR è 0), una istruzione di coprocessore genera una trap cp_disabled. 1.3 Istruzioni Le istruzioni sono accedute dal processore nella memoria e sono eseguite, annullate o causano il lancio di una trap. Le istruzioni sono codificate in quattro formati principali e partizionate in categorie. 1.3.1 Esecuzione L’istruzione alla locazione di memoria specificata dal program counter è prelevata ed eseguita. L’esecuzione dell’istruzione può modificare lo stato visibile dal processore e/o dalla memoria. Come side-effect dell’esecuzione, nuovi valori sono assegnati al program counter (PC) ed al next progrm counter (nPC). Un’istruzione può generare un’eccezione se essa incontra una condizione che rende impossibile la normale esecuzione. Una tale eccezione può a sua volta generare una trap. Altri eventi possono generare una trap (si veda la sezione 1.5 “Traps ” per ulteriori dettagli). Se non avviene una trap e l’istruzioni non è di tipo control transfer, il next program counter (nPC) è copiato nel PC e nPC è incrementato di 4 (ignorando eventuali overflow). Se l’istruzione è control transfer, il next program counter (nPC) è copiato nel PC e l’indirizzo target è scritto in nPC. 1.3.2 Formato Le istruzioni sono codificate in 4 formati a 32-bit principali ed altri formati minori. La Figura 1.1 riporta un esempio per ognuno dei quattro formati definiti in SPARC-V9 (per ulteriori dettagli si veda [1]). Figura 1.1 - Esempio per ognuno dei quattro formati definiti in SPARC-V9 I principali campi delle istruzioni sono: ____________________________________________________________________________________ SPARC Architecture Overview Pagina 7 di 40 op: codifica il formato dell’istruzione disp: spostamento PC-relative (ad esempio per una branch o call) rd: Questo campo a 5-bit è l'indirizzo del registro/i di destinazione (o sorgente) per una istruzione di load, aritmetica, o di store. imm: è una costante rs: è l’indirizzo del primo/secondo operando sorgente del registro/i i: selziona il secondo operando per una istruzione aritmetica intera o load/store. cc: specifica il codici di condizione da usare nell’istruzione 1.3.3 Categorie Le istruzioni possono esser raggruppate in sei categorie base: 1. 2. 3. 4. 5. 6. Accesso alla Memoria Arithmetic/logical/shift Control transfer Read/write control register Floating-point operate Coprocessor operate Nelle prossime sezioni analizzeremo le categorie sopra elencate. 1.3.3.1 Accesso alla Memoria Le istruzione di Load/Store e le operazioni atomiche, CASX, SWAP e LDSTUB, sono le uniche istruzioni che accedono la memoria. Esse usano due registri r o un registro r ed valore immediato per computare un indirizzo di memoria a 64-bit, byte-aligned. IU appende una ASI a questo indirizzo. Il campo di destinazione dell’istruzione di load/store specifica uno o due registri r, oppure uno, due, o quattro registri f, che forniscono dati per una store o li ricevono per una load. Le istruzioni di load e store intere supportano accessi a byte, mezze parole (16-bit), parole (32-bit), doppie parole (64-bit). Le istruzioni di load e store di floating-point supportano accessi alla memoria per parole e doppie parole e quadruple parole. CAS, SWAP e LDSTUB sono istruzioni di accesso alla memoria speciali usate per la sincronizzazione e l’aggiornamento della memoria da parte di processi concorrenti. 1.3.3.1.1 Memory Alignment Restrictions Esistono le seguenti restrizioni di allineamento: gli accessi a mezze parole devono essere allineati su 2-byte; gli accessi a parole devono essere allineati su 4-byte; accessi doppie parole devono essere allineati su 8-byte; e quantità a quattro parole dovrebbero devono allineati su 16-byte. Un indirizzo impropriamente allineato in una istruzione di load o store causa una trap. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 8 di 40 1.3.3.1.2 Addressing Conventions La memoria è una collezione di locazioni accessibile dalle istruzioni di load e store. Ogni locazione, ovvero un indirizzo, è una tupla che consiste Address Space Identifier (ASI) a 8-bit e un byte-address offeset a 64-bit nell’address space specificato. Gli scopi per cui il processore fornisce un address space identifier (ASI) sono diversi, ovvero: • • • Per identificare a quale dei vari distinti address space l’address offset a 64-bit è riferito Per specificare l’indirizzo di un control register interno al processore, cache, o memory management hardware Per fornire controlli di accesso addizionali ed altre informazioni SPARC-V9 usa per default big-endian byte order: l’indirizzo di una quadrupla parola, doppia parola, parola o mezza parola è l’indirizzo del suo byte più significativo. Aumentare l’indirizzo generalmente significa diminuire il significato dell’unità che deve essere acceduta. Tutte le istruzioni accedute sono eseguite usando big-endian byte order. SPARC-V9 supporta inoltre little-endian byte order solo per accessi ai dati: l’indirizzo di una quadrupla parola, doppia parola, parola o mezza parola è l’indirizzo del suo byte meno significativo. 1.3.3.1.3 Load/Store Alternate Le istruzioni di load e store forniscono un valore implicito di Address Space Identifier (ASI) a 8-bit. Le istruzioni di load/store alternate invece possono contenere esplicitamente un ASI per load/store di accesso ai dati. L’accesso ad alternate spaces 0016..7F16 è ristretto, e l’accesso ad alternate spaces 8016..FF16 è non ristretto. Alcune delle ASI sono disponibili per usi dipendenti dall’implementazione. Il software supervisore può usare le ASI dipendenti dall’implementazione per accedere a registri speciali, quali MMU, cache control, registri di stato del processore ed altri valori dipendenti dal sistema o dal processore. Lo spazio di indirizzamento alternato è inoltre fornito di istruzioni atomiche di accesso alla memoria, LDSTUB, SWAP e CASX. 1.3.3.1.4 Separate I and D Memories La maggior parte delle specifiche in questo elaborato sono scritte come se le istruzioni di store scrivano nella stessa memoria da cui le istruzioni sono accedute. Tuttavia, una implementazione può esplicitamente partizionare istruzioni e dati in memoria istruzioni e memoria dati indipendenti, chiamata comunemente architettura "Harvard" o "split I & D cache". 1.3.3.1.5 Input/Output SPARC-V9 assume che i registri di input/output siano acceduti tramite istruzioni load/store alternate, istruzioni load/store normali, istruzioni di coprocessore, o istruzioni read/write dipendenti dallo state register (RDASR, WRASR). Nel caso di istruzioni load/store alternate, i registri di I/O possono essere acceduti solo dal supervisore. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 9 di 40 La possibilità di accedere alle locazioni di input/output (I/O) da parte di codice non privilegiato, i contenuti e gli indirizzi dei registri di I/O, sono dipendenti dall’implementazione. 1.3.3.1.6 Memory Syncronization Per la sincronizzazione delle operazioni di memoria sono utilizzate fondamentalmente due istruzioni: FLUSH e MEM-BAR. 1.3.3.2 Arithmetical/Logical/Shift Le istruzioni Arithmetical/Logical/Shift eseguono operazioni aritmetiche, operazioni in aritmetiche tagged, logiche e di shift. Queste istruzioni computano il risultato che è funzione dei due operandi sorgenti; il risultato è scritto in un registro di destinazione, o è scartato Le istruzioni di shift sono utilizzate per muovere il contenuto di un registro r a sinistra o a destra di una data distanza. La distanza di shift può essere specificata con una costante nell’istruzione o dal contenuto di un registro r. L’istruzione di moltiplicazione intera effettua una operazione 64 x 64 à 64-bit. Le istruzioni di divisione intera effettuano operazioni 64 ÷ 64 à 64-bit. In aggiunta, per compatibilità con SPARC-V8, le istruzioni di moltiplicazione 32 x 32 à 64-bit, divisione 64 ÷ 32 à 64-bit sono incluse. La divisione per zero causa una trap. Ci sono versioni delle istruzioni di moltiplicazione e divisione che impostano condition code. Le istruzioni in aritmetica tagged assumono che i due bit meno significativi degli operandi siano di tipo tag. 1.3.3.3 Control Transfer Le istruzioni di control-transfer (CTI) includono PC-relative branch e chiamate, salti indiretti a registri, e trap condizionate. La maggior parte delle istruzioni controltransfer sono ritardate, (delayed control-transfer instructions – DCTI), ovvero l’istruzione immediatamente seguente ad una istruzione di control-transfer nella sequenza logica è eseguita prima che il control transfer all'indirizzo target sia completato. Si noti che l’istruzione che segue l’istruzione di control-transfer nella sequenza logica non è necessariamente l’istruzione che segue nella memoria. L’istruzione seguente ad un delayed control-transfer è chiamata delay-instruction. Un bit in una delayed control trasfer instruction (annul bit) può causare l’annullamento della delay instruction (ovvero, annullare il suo effetto) se il branch non è preso (o nel caso “branch always”, se il branch è preso) La specifica SPARC-V8 afferma che le delay instruction sono sempre prese, anche se annullate, e che una istruzione annullata non può causare una trap. SPARC-V9 non richiede che la delay instruction sia presa se essa è stata annullata. Le istruzioni di branch e CALL usano spostamenti PC-relative. Le istruzioni di jump and link (JMPL) e le istruzioni di return (RETURN) usano un register-indirect target address. Esse computano il loro indirizzi target come la somma dei due registri r, o la somma di un registro r e 13-bit signed immediate value. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 10 di 40 1.3.3.4 State Register Access Le istruzioni read/write del registro di stato leggono e scrivono il contenuto dei registri di stato visibili dal software non privilegiato (Y, CCR, ASI, PC, TICK, e FPRS). Le istruzioni read/write privilegiate di registro leggono e scrivono il contenuto dei registri di stato visibile solo al software privilegiato (TPC, TNPC, TSTATE, TT, TICK, TBA, PSTATE, TL, PIL, CWP, CANSAVE, CANRESTORE, CLEANWIN, OTHERWIN, WSTATE, FPQ, e VER). Ci sono inoltre istruzioni read/write che il software può utilizzare per leggere e scrivere registri particolari dipendenti dall’implementazione. 1.3.3.5 Floating-Point/Coprocessor Operate Le istruzioni Floating-point operate (FPop) eseguono tutti i calcoli in floating point; sono istruzioni register-to-register che operano sui registri floating-point. Come le istruzioni arithmetic/logical/shift, FPop computa un risultato che è funzione di uno o due operandi sorgente. Le istruzioni Floating-point operate (FPop) effettuano tutti i calcoli di virgola mobile. Sono istruzioni di inter-registro che funzionano sui registri di virgola mobile. Come le istruzioni di arithmetic/logical/shift, il calcolo di una FPop un da risultato che è una funzione di uno o due operandi sorgente. Le istruzioni Coprocessor operate (CPop) sono definite dall’eventuale coprocessore. 1.3.3.6 Conditional Move Le istruzioni conditional move copiano un valore da un registro sorgente ad un registro destinazione, in maniera dipendente da una condizione intera o floating-point o sul contenuto di un detrminato registro. Queste istruzioni migliorano le performance riducendo il numero di branch. 1.3.3.7 Register Window Management Queste istruzioni sono utilizzate per gestire la register window. SAVE e RESTORE sono non-privilegiate e causano ed inducono ad un push o pop della register window. FLUSHW è non-privilegiata e causa il flush in memoria di tutte le finestre eccetto quella corrente. SAVED e RESTORED sono usate dal software privilegiato per concludere una window spill o riempire il trap handler. 1.4 Modello di Memoria Il modello di memoria di SPARC definisce la semantica delle operazioni di memoria. La semantica dell'insieme delle istruzioni richiede che load e store sembrino eseguite nell'ordine in cui compaiono nel flusso dinamico di controllo del programma. L’ordine attuale in cui esse sono processate dalla memoria può essere differente. Lo scopo dei memory models è specificare quali vincoli eventualmente esistono nell’ordine delle operazioni della memoria. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 11 di 40 I memory models si applicano sia a sistemi uni-processore che a sistemi multiprocessore a memoria condivisa. Memory models formali sono necessari per definire precisamente le interazioni tra processori multipli ed dispositivi di input/output nelle configurazioni a memoria condivisa. Programmare multiprocessori a memoria condivisa richiede una comprensione dettagliata del modello attivo di memoria e la capacità di specificare le operazioni di memoria ad un basso livello per sviluppare i programmi che possono coordinare in modo sicuro ed attendibilmente le loro attività. L’architettura SPARC-V9 è un modello che specifica il comportamento osservabile dal software su sistemi SPARC-V9. Di conseguenza, l'accesso alla memoria può essere implementato in diversi modi, purchè il comportamento osservato da software sia conforme a quello dei modelli. L’architettura SPARC-V9 definisce tre differenti memory models: Total Store Order (TSO), Partial Store Order (PSO), e Relaxed Memory Order (RMO). Tutti i processori SPARC-V9 devono fornire Total Store Order per garantire la compatibilità con SPARCV8. Il supporto dei modelli RMO e PSO è dipendente dall’implementazione. La Figura 1.2 mostra le relazioni tra i diversi memory model di SPARC-V9, dal meno restrittivo al più restrittivo. Programmi scritti su un modello funzioneranno correttamente su ogni modello incluso. Figura 1.2 – Memory Model dal meno restrittivo (RMO) al più restrittivo (TSO) SPARC-V9 fornisce memory models multipli cosicchè: • • Le implementazioni possono schedulare le operazioni della memoria per avere alte prestazioni I programmatori possono creare primitive di sincronizzazione usando la memoria condivisa Non esiste un modello preferenziale per SPARC-V9. I programmi scritti in RMO lavoreranno anche in PSO e TSO. I programmi scritti in PSO lavoreranno anche in TSO. I programmi scritti per un modello debole, quale RMO, possono essere eseguiti più rapidamente, ma possono anche richiedere istruzioni supplementari per la sincronizzazione. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 12 di 40 1.5 Traps Una trap, ovvero un interrupt interno, è un trasferimento di controllo vettorizzato al software privilegiato attraverso una speciale tabella che può contenere le prime otto istruzioni di ogni trap handler. L’indirizzo base della tabella è stabilito dal software in un registro di stato (il registro Trap Base Address, TBA). Lo spostamento all'interno della tabella è codificato dal numero tipo di trap e dal livello di trap. Metà della tabella è riservata per le trap hardware; un quarto per software trap generate dalle istruzioni trap (Tcc); l’ultimo quarto è riservato per espansioni future dell’architettura. Una trap può essere causata da una eccezione indotta da una istruzione, o da una richiesta esterna di interrupt non direttamente relativa ad un'istruzione particolare. Prima di eseguire l’istruzione, l’IU controlla se esistono eccezioni e richieste di interrupt. Se sono presenti, IU seleziona quella con priorità superiore e lancia la trap corrispondente. 1.5.1 Categorie di Traps Una eccezione o una richiesta di interrupt possono causare tre categorie di trap: precise, deferred o interrupting. Una precise trap è indotta da una particolare istruzione ed occorre prima che lo stato del programma sia modificato dall’istruzione che ha causato la trap. Una deferred trap è anch’essa indotta da una particolare istruzione, ma diversamente da precise trap, essa può accadere dopo che lo stato del programma sia cambiato dall’esecuzione di una o più istruzioni che seguono l’istruzione che ha causato la trap. Una deferred trap può accadere una o più istruzioni dopo che la l’istruzione che ha causato la trap è stata eseguita. Una interrupting trap può essere causata da una richiesta di interrupt esterna direttamente relazionata ad una particolare istruzione, o può essere dovuta da eccezione causata da una particolare istruzione precedentemente eseguita. interrupting trap non è ne una precise trap ne una deferred trap. implementazione non deve necessariamente fornire la condizione sufficiente emulare un'istruzione che ha causato una interrupting trap. non una Una Una per SPARC definisce un default trap model, che deve essere presente in tutte le implementazioni. 1.6 Cambiamenti da SPARC-V8 a SPARC-V9 SPARC-V9 è complementare all'architettura SPARC-V8. Applicazioni software scritte per microprocessori a 32-bit SPARC-V8 possono essere eseguite, senza modifiche, su sistemi SPARC-V9. I cambiamenti alla architettura SPARC-V9 rispetto a SPARC-V8 risiedono in sei aree principali (per una elenco completo delle modifiche si veda [3]): • Trap Model o Invece di supportare un solo livello di trap, sono supportati quattro o più livelli o Molte trap non modificano CWP ____________________________________________________________________________________ SPARC Architecture Overview Pagina 13 di 40 • Data Formats o Sono stati aggiunti data format per interi estesi (64-bit) • Registri o Eliminati: Processor State Register (PSR), Trap Base Register, Windows Invalid Mask (WIM) o Estesi da 32-bit a 64-bit: Tutti i registri interi, tutti i registri di stato (FSR, PC, nPC, Y) o Il contenuto dei seguenti registri è cambiato: § Floating-Point State Register (FSR): i bit fcc1, fcc2, e fcc3 (additional floating-point condition code) sono stati aggiunti ed il registo è stato esteso a 64-bit o Registri aggiunti: § Sedici registri floating-point a doppia precisione § Floting Point State Register (FPSR) § ASI: ASI Register § PSTATE: Processor State Register • Alternate Address Space Access In SPARC-V8, l'accesso a tutto l’alternate address space è privilegiato. In SPARC-V9, le load e le store a ASIs 0016..7f16 sono privilegiati; quelli a ASIs 8016..ff16 sono non privilegiati. • Instruction Set Tutti i cambiamenti all’instruction set sono stati fatti cosicchè le applicazioni software scritte per SPARC-V8 potessero essere eseguite senza modifiche su un processore SPARC-V9. Le applicazione software scritte per SPARC-V8 non dovrebbe neppure rilevare che le relative istruzioni ora processano valori a 64bit. La definizione di alcune istruzioni è stata estesa o modificata per lavorare con il modello a 64-bit. • Memory Model SPARC-V9 definisce un nuovo modello di memoria denominato Relaxed Memory Order (RMO). Questo modello molto debole, permette alle CPU di schedulare gli accessi alla memoria quali load e store in qualsiasi ordine, finchè il programma computa la risposta corretta. Quindi, l’hardware può istantaneamente sistemare i conflitti nell'ordine più efficiente, portando ad operazioni di memoria molto più veloci ed a performance migliori. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 14 di 40 2.0 Implementazioni In questo Capitolo descriveremo le principali implementazioni dell’architettura SPARC. In primo luogo esamineremo la famiglia di processori UltraSPARC sviluppata da Sun Microsystem in collaborazione con Texas Instrument. E’ importante sottolineare che UltraSPARC sembra essere il progetto più attivo nell’ambito dello sviluppo di processori compatibili con l’architettura SPARC. Per questo motivo dedicheremo ampio spazio ad UltraSPARC piuttosto che ad altre soluzioni. In seguito analizzeremo brevemente LEON, soluzione fornita da Gaisler Research in collaborazione con l’Ente Spaziale Europeo (ESA). Concluderemo il Capitolo con una breve rassegna di altre soluzioni conformi allo standard SPARC, ma ormai obsolete. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 15 di 40 2.1 UltraSPARC La famiglia di processori UltraSPARC è basata sull'architettura SPARC-V9 a 64-bit e, come precedentemente anticipato, è stata progettata (e sviluppata) da Sun Microsystem in collaborazione con Texas Instrument. Essa è costituita da quattro modelli di processori: UltraSPARC I, UltraSPARC II, UltraSPARC III e UltraSPARC IV. Nelle prossime sezioni analizzeremo le principali caratteristiche di questi microprocessori ed alla fine della sezione analizzeremo brevemente Visual Instruction Set (VIS), ovvero un’estensione all’instruction set di UltraSPARC per operazioni grafiche complesse. 2.1.1 UltraSPARC I/II In questa sezione esamineremo i processori superscalari UltraSPARC I/II. Benchè obsolete, queste soluzioni forniscono le basi per le implementazioni attuali fornite da Sun Microsystem, ovvero i processori UltraSPARC III e UltraSPARC IV. 2.1.1.1 Unità Funzionali La figura 2.1 mostra un diagramma a blocchi semplificato che identifica le maggiori unità funzionali che compongono UltraSPARC I/II: 1. Front end – La Prefetch / Dispatch Unit (PDU) effettuate il prefetch delle istruzioni basandosi sul meccanismo di dynamic branch prediction e su un campo successivo. Effettuando la predizione accuratamente (tipicamente il 90% delle predizioni sono corrette), il front end può fornire quattro istruzioni per ciclo al blocco di esecuzione centrale. 2. Integer Execution Unit (IEU) – Effettua tutte le operazioni aritmetico logiche. La IEU incorpora un 3D register file che supporta sette read port e tre write port. 3. Floating Point / Graphics Unit (FGU) – Integra cinque unità funzionali ed un register file composto da 32 registri a 64-bit. I sommatori, moltiplicatori e divisori in virgola mobile effettuano tutte le operazioni in floating point, ed inoltre sono potenziati dall’aggiunta di operazioni grafiche di somma e moltiplicazione per effettuare partitioner integer operation richieste da VIS. 4. Load Store Unit (LSU) – Esegue tutte le istruzioni che trasferiscono dati tra la gerarchie di memoria ed i due register file in IEU e FGU. La Data Cache (DCache), Load Buffer, Store Buffer, e Data Memory Management Unit DMMU sono incluse in questa unità. 5. External Cache (E-Cache) – Serve le “miss” dell’Instruction Cache (I-Cache) del front end di UltraSPARC e della D-Cache della LSU. Nelle prossime sezioni analizzeremo le diverse componenti sopra elencate. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 16 di 40 Figura 2.1 – Diagramma a Blocchi semplificato per UltraSPARC I/II 2.1.1.2 Il Front End di UltraSPARC I/II La Figura 2.2 mostra il front end di UltraSPARC I/II. Come precedentemente anticipato la componente principale di del front end di UltraSPARC è la PDU (Prefetch/Dispatch Unit). Figura 2.2 – Front end UltraSPARC I/II ____________________________________________________________________________________ SPARC Architecture Overview Pagina 17 di 40 L’Instruction cache (I-Cache) è una cache di 16 Kbyte di tipo set-associativo a due vie, con blocchi di 32 byte; è fisicamente indicizzata e contiene tag fisici. Per indirizzarla sono necessari, grazie all'algoritmo di predizione, solo i bit di indice (13 bit, che corrispondono alla dimensione minima della pagina). E' in grado di ritornare fino a 4 istruzioni da una linea che contiene 8 istruzioni. A. Integer Execution Unit (IEU) L’Integer Execution Unit (IEU), mostrata in Figura 2.3, effettua computazioni intere per tutte le operazioni aritmetico/logiche. Due ALU formano la parte principale dell’IEU, insieme ad un moltiplicatore e divisore a cicli multipli per gli interi. Sono disponibili otto finestre dei registri e quattro insiemi di registri globali (normali, alternati, MMU e interrupt globali), oltre ai registri di trap. L’unità di moltiplicazione ha una latenza tipica di otto cicli di clock, mentre quella di divisione ha una latenza di 67 cicli di clock per una divisione 64bit x 64bit. Figura 2.3 – Integer Execution Unit B. Floating Point / Graphics Unit (FGU) La Floating Point / Graphics Unit (FGU), mostrata in Figura 2.4, integra cinque unità funzionali ed un Register File 32-registri x 64-bit. I sommatori, moltiplicatori e divisori ____________________________________________________________________________________ SPARC Architecture Overview Pagina 18 di 40 in virgola mobile effettuano tutte le operazioni in floating point, ed inoltre sono stati potenziati dall’aggiunta di operazioni grafiche di somma e moltiplicazione (necessarie per VIS). Figura 2.4 – Floating Point e Graphics Unit La separazione fra le unità di esecuzione nella FPU permette a UltraSPARC I/II di eseguire due istruzioni FP per ciclo di clock. I dati sorgente e i risultati sono immagazzinati in un registro a 32 ingressi, dove ogni ingresso può contenere un valore a 32 o a 64 bit. La maggior parte delle istruzioni sono completamente in pipeline (throughput di una per ciclo), hanno una latenza di tre e non sono influenzate dalla precisione degli operandi (cioè la latenza è la stessa sia in singola che in doppia precisione). La divisione e la radice quadrata non sono in pipeline, e necessitano di 12 cicli (singola precisione) e 22 cicli (doppia precisione), ma non provocano lo stallo del processore: altre istruzioni che seguono possono essere caricate, eseguite e ritirate prima che la divisione finisca. Viene mantenuto un preciso modello delle eccezioni, tramite la sincronizzazione della pipeline FP e di quella intera, e predicendo le trap per operazioni a lunga latenza. UltraSPARC I/II introduce un insieme di istruzioni grafiche che forniscono un veloce supporto hardware per l'elaborazione di immagini 2D e 3D, video e audio. Sono presenti le operazioni di somma, confronto e booleane, sia a 16 che a 32 bit, e la moltiplicazione a 8 e a 16 bit; sono supportate le operazioni di distanza fra pixel, allineamento dei dati, impacchettamento ed unione, tutte eseguite in un singolo ciclo di clock. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 19 di 40 C. Load/Store Unit (LSU) La Load/Store Unit (LSU) esegue tutte le istruzioni che trasferiscono dati tra la gerarchia di memoria e Register files (Interi e Floating-point/Graphics). La LSU include Data Cache, Load Buffer, Store Buffer, ed è strettamente accoppiata con l’extenal cache di secondo livello. La Figura 2.5 mostra un diagramma funzionale della Load/Store Unit. - Data Cache E' una cache di 16 Kbyte di tipo write-through direttamente mappato, con due sottoblocchi da 16 byte per linea; è indicizzata virtualmente mentre il tag è fisico. L'array di tag è di tipo dual-ported, in modo che l'update dei tag dovuto al riempimento delle linee non collida con la lettura dei tag dovuta ai caricamenti. - Load Buffer Il load buffer può eliminare gli stalli causati dalle miss della D-Cache, ed altre tipologie di conflitti. Il load buffer è organizzato come una coda circolare. Ogni load è accodata con una indicazione di hit o miss nella D-Cache. Questa informazione è tracciata per tutta la durata dell’operazione, anche in presenza di snoops. Figura 2.5 – Load/Store Unit - Store Buffer Lo Store Buffer a otto ingressi (ogni ingresso rappresenta un riferimento a 64bit ed il relativo indirizzo corrispondente) fornisce un hoding place temporaneo per le operazioni di store fino a che esse possano essere dichiarate completate e la D-Cache e/o la E-Cache siano disponibili. L’aggiornamento della E-Cache è un processo a due ____________________________________________________________________________________ SPARC Architecture Overview Pagina 20 di 40 fasi. Per prima cosa, i tag della E-Cache sono controllati per verificare la presenza di hit/miss; poi, la avviene E-Cache write. Gli accessi a E-Cache tag e data RAM sono disaccoppiati, cosicchè il controllo di un tag può avvenire in parallelo con una E-Cache Data write di una vecchia store, mantenendo cosi un throughput di una store per clock. Inoltre, store consecutive alla stessa E-Cache line (64B) tipicamente richiedono solo un singolo controllo del tag, minimizzando cosi le transazioni di tag check. - Data Memory Management Unit (DMMU) L'MMU si occupa della mappatura tra i 44 bit dell'indirizzo virtuale e i 41 bit dell'indirizzo fisico; ciò è realizzato attraverso due TLB a 64 ingressi, uno per le istruzioni e uno per i dati, entrambi completamente associativi. UltraSPARC II fornisce un supporto hardware per una strategia di miss dei TLB basata sul software. Sono supportate dimensioni di pagina di 8, 64, 512 e 4096 Kbyte. D. External Cache La cache esterna è usata per servire le miss della I-Cache nel front end di UltraSPARC I/II e nella D-Cache di LSU. Essa è una implementazione SRAM fisicamente indicizzata e fisicamente etichettata. La line size è di 64bytes. Le dimensioni della E-Cache sono dipendenti dal modello del microprocessore (da 512KB a 4MB per UltraSPARC I e da da 512KB a 16MB per UltraSPARC II). Un buffer di scrittura interno ritardato minimizza le penalità Write After Read (WAR). La latenza addizionale per una internal cache miss e E-Cache hit è della durata di sei cicli (tre interni e tre esterni). Le letture possono essere completate ogni ciclo. UltraSPARC I/II non differenzia burst read e due read successive; i segnali usati per una lettura singola sono semplicemente replicati per ogni lettura sequenziale. Le letture sono pienamente parallelizzate cosi da mantenere un pieno rendimento. Anche le scritture possono essere completate ogni ciclo. La penalità write-after-read totale è di due cicli. Non c’è una penalità read-after-read (RAW). E. System Interface La Figura 2.6 mostra un sottosistema UltraSPARC I/II completo, composto dal processore UltraSPARC I/II, componenti SRAM sincroni per la External Cache tag e data e due chip UltraSPARC I/II Data Buffer (UDB). Figura 2.6 – UltraSPARC I/II System Interface ____________________________________________________________________________________ SPARC Architecture Overview Pagina 21 di 40 Le UDB servono per isolare elettricamente le interazioni tra la CPU e la E-Cache dal bus di sistema ed operano alla frequenza di clock del sistema, la quale può essere sia metà che un terzo del clock del processore. In totale le UDB hanno un buffer di lettura da 64byte, due buffer di scrittura da 64byte, e un copyback buffer da 64byte. Le transazioni di sistema sono packet-based, indirizzi e trasferimento di dati sono eventi disgiunti. Un bus di indirizzi da 36bit è utilizzato per trasportare two-cycle request packets che iniziano una transazione. Questo bus può inoltre essere condiviso da altri tre master, in aggiunta ad un controllore di sistema centralizzato. L’Arbitration è distribuita. Ogni master sul bus di indirizzamento ha la stessa logica e vede tutte le rechieste al bus. Esistono cinque potenziali richieste: quattro potenziali master più una da un controllore di sistema ad alta priorità. L’Arbitration è roundrobin con un effetto di isteresi per ridurre la latenza per l’ultimo master. 2.1.1.3 Pipeline Le funzioni effettuate da IEU, LSU e FGU sono implementate in una pipeline duale a nove stadi. La maggior parte delle istruzioni passano all’interno della pipeline in nove stadi esatti. Le istruzioni sono considerate terminate dopo che sono passate attraverso l’ultimo stadio (W), dopo il quale, i cambiamenti sono irreversibili. La Figura 2.7 mostra un diagramma degli stadi della pipeline integer e floating-point. Tre stadi addizionali sono aggiunti alla pipeline intera per renderla simmetrica rispetto a quella floating-point. Questo semplifica la sincronizzazione di pipeline, la gestione delle eccezioni, ed elimina la necessità di implementare una coda floating-point. Le istruzioni di floating-point con una latenza superiore a tre (ad es. divisione e radice quadrata) si comportano in modo diverso rispetto alle altre istruzioni, nel senso che la pipe è “estesa” quando l’istruzione raggiunge la fase N1. Le operazioni di memoria possono procedere in maniera asincrona con la pipeline in modo tale da supportare latenze più lunghe rispetto la latenza della data cache on-chip. Figura 2.7 – La pipeline a nove stadi duale di UltraSPARC I/II ____________________________________________________________________________________ SPARC Architecture Overview Pagina 22 di 40 2.1.1.4 Descrizione delle fasi della pipeline Fase 1: Fetch (F) In questa fase le istruzioni sono prelevate dall’Instruction Cache (I-Cache) e piazzate nell’Instruction Buffer, da dove saranno selezionate per l’esecuzione. Al massimo vengono prelevate quattro istruzioni alla volta, assieme alle informazioni di branch prediction, l’indirizzo target predetto di una branch, ed il predicted set del target. Fase 2: Decode (D) In questa fase le istruzioni che hanno effettuato il fetch sono precodificate ed inviate all’Instruction Buffer. I bit precodificati generati durante questa fase accompagnano l’istruzione durante il suo soggiorno nell’Instruction Buffer. Nel raggiungere la fase successiva (dove risiede la logica di raggruppamento), questi bit accelerano la decodifica parallela fino a quattro istruzioni. Mentre si sta riempiendo, l’Instruction Buffer presenta anche fino a quattro istruzioni alla fase successiva. Una coppia di puntatori gestiscono l’Instruction Buffer, assicurando che la maggioranza delle istruzioni siano presentate in ordine alla fase successiva. Fase 3: Grouping (G) In questa fase, il task principale è raggruppare e spedire un massimo di quattro istruzioni valide in un ciclo. Essa riceve un massimo di quattro istruzioni dalla Prefetch and Dispatch Unit (PDU), controlla l’Integer Core Register File (ICRF), ed inoltra dati validi ad ogni unità funzionale. Fase 4: Execution (E) In questa fase, i dati dall’integer register file sono processati da due ALU intere durante il ciclo attuale (se il gruppo di istruzioni include operazioni ALU). I risultati sono computati e sono disponibili per le altre istruzioni in ogni ciclo successivo. L’indirizzo virtuale di una operazione di memoria è calcolato in questa fase in parallelo con la computazione dell’ALU. Nella pipe Floatinf-point/Graphics, questa fase corrisponde al Register (R) Stage della FGU. Il floating-point register file è acceduto durante il ciclo attuale, le istruzioni sono ulteriormente decodificate e la FGU control unit seleziona le esclusioni adeguate per le istruzioni correnti. Fase 5: Cache Access (C) In questa fase, gli indirizzi virtuali delle operazioni di memoria calcolate nella Fase 4 (Execution) sono inviate al tag RAM per determinare se l’accesso (di tipo load o store) è un hit o una miss nella D-Cache. In una operazione parallela, l’indirizzo virtuale è inviato alla data MMU per essere trasformato in un indirizzo fisico. Le operazioni della ALU eseguite nella Fase 4 (Execution) generano codici di condizione nella Fase 5 (Cache Access). I codici di condizione sono inviati alla PDU, la quale effettua controlli per determinare se un branch condizionato nel gruppo è stato correttamente predetto. Se il branch è stato mal predetto (mispredicted), le ultime istruzioni nella pipe sono ripulite, e viene effettuato il fetch delle istruzioni corrette. Nella Floating-point/Graphics pipe, questo corrisponde alla Fase X1. Le istruzioni cominciano la loro esecuzione durante questa fase. Inoltre le istruzioni di latenza uno, durante la Fase X1 terminano la loro esecuzione. Fase 6: N1 Stage In questa fase, è determinato un data cache miss/hit o un TLB miss/hit. Se è rilevata una TLB miss, viene lanciata una trap e la traduzione di indirizzo è ottenuta da una procedura del software. L’indirizzo fisico di una store è inviata allo Store Buffer ____________________________________________________________________________________ SPARC Architecture Overview Pagina 23 di 40 durante questa fase. Per evitare stalli nella pipeline quando i dati di una store non sono disponibili immediatamente, gli indirizzi delle store e i dati sono disaccoppiati e inviati separatamente allo Store Buffer. Nella Floating-point/Graphics pipe, questa è la seconda fase di esecuzione (X2) dove l’esecuzione continua per la maggior parte delle istruzioni. Fase 7: N2 Stage In questa fase, l’Integer Pipe essenzialmente attende il completamento della Floatingpoint/Graphics pipe. La maggior parte delle istruzioni floating-point nella Floatingpoint/Graphics pipe finiscono l’esecuzione durante questa fase. Dopo N2, i dati possono essere bypassati da altri stadi o rediretti alla porzione di dati dello Store Buffer. Fase 8: N3 Stage In questa fase, Integer e Floating Point/Graphics pipes convergono per risolvere le trap. Fase 9: Write (W) In questa fase, tutti i risultati (interi e floating-point) sono scritti sul register files. Tutte le azioni effettuate durante questa fase sono irreversibili. Dopo questa fase le istruzioni sono considerate terminate. 2.1.2 UltraSPARC III Sun cominciò lo sviluppo di sistemi basati su processori superscalari UltraSPARC III nel 2000. La prima versione di UltraSPARC III fu prodotta inizialmente da Texas Instrument (TI) con tecnologia 0.18µ con metal layer di alluminio (Al). Implementato in questa tecnologia, UltraSPARC III opera ad una frequenza tra 600MHz e 750MHz. Nel 2001, UltraSPARC III fu aggiornato usando la nuova tecnologia sviluppata da TI, ovvero 0.15µ con metal layer di rame (Cu). Implementato in questa nuova ed avanzata tecnologia, UltraSPARC III opera ad una frequenza tra 900MHz e 1050MHz. Nel 2002, UltraSPARC III Cu fu aggiornato all’ultima generation technology, ovvero 0.13µ, raggiungendo una frequenza operativa massima di 1200MHz. Lo scopo del processore UltraSPARC III è quello di migliorare le real performance e di venir incontro alle esigenze di sistemi enterprise per un elevato livello di RAS (Reliability Availability Serviceability), facendo leva sulle precedenti versioni del processore. Nelle sezioni seguenti analizzeremo le caratteristiche raggungimento degli obiettivi sopra elencati. che hanno portato al 2.1.2.1 Caratteristiche per migliorare Real Performance Le caratteristiche di design di UltraSPARC III intendono migliorare in maniera specifica le real performance espresse da questo processore in ambienti di rete enterprise. In particolare i progettisti hanno lavorato per riuscire ad avere: • • • • Elevato picco del rate di uscita delle istruzioni Pipelining per alti clock rate Migliore schema per gestire decisioni di branch Riduzione dei colli di bottiglia nella memoria ____________________________________________________________________________________ SPARC Architecture Overview Pagina 24 di 40 • Nuove istruzioni per accelerare task di computazione specifici 2.1.2.1.1 Picco del rate di uscita delle istruzioni Come le precedenti generazioni di UltraSPARC, UltraSPARC III mantiene un sostanziale rate di uscita di 4 istruzioni in ogni ciclo di clock (il massimo numero di istruzioni che possono essere prelevate dalla cache in un ciclo di clock). In attesa che un’appropriata unità di esecuzione diventi disponibile, possono essere accodate un massimo 16 fetched instructions, ovvero istruzioni per le quali è già stato eseguito il fetch. Ci sono sei unità di esecuzione parallele: 2 ALU intere (identiche), 1 unità di branch, 1 unità di load/store, e due unità di floating-point (1 per operazioni di somma/sottrazione e un’altra per moltiplicazione/divisione). 2.1.2.1.2 Pipelining per alti clock rate Per realizzare alti clock rate, la nuova pipeline di esecuzione di UltraSPARC III è segmentata in 14 fasi separate. Come conseguenza, questo design della pipeline è in grado di scalare da una frequenza iniziale 600MHz alla frequenza corrente di 1200MHz per raggiungere 1500MHz nelle prossime generazioni. 2.1.2.1.3 Gestione delle branch UltraSPARC III implementa un meccanismo avanzato di branch prediction basato su 4KB di stored branch history che predice accuratamente se un branch sarà preso o no circa il 95% delle volte. Predizioni errate hanno una penalità di 7 cicli, richiesti per effettuare il back up, eseguire nuovamete il fetch della istruzione, e ripartire. Tuttavia, UltraSPARC III mitiga l’impatto di misprediction occasionali, riducendo la pena generale di branch misprediction a circa 4,5 cicli, grazie all’uso di una coda speciale Branch Miss. 2.1.2.1.4 Eliminazione di colli di bottiglia della memoria UltraSPARC III incorpora un approfondito e sistematico attacco a problemi di performance relativi alla memoria, partendo dal design stesso della gerarchia di memoria, e considerando di latenza di memoria (tempo di accesso) e banda. - Organizzazione della memoria Come gli altri processori a 64bit, UltraSPARC III permette ai programmi di operare con un enorme spazio di indirizzamento di 16 quintillion (1018) di bytes, 4 billion (109) di volte di più dei 4 gigabyte di indirizzamento limite dei processori a 32bit. Inoltre, per i dispositivi off-chip, esso fornisce 43bit di address data – sufficienti per indirizzare 8 trillion byte (8 TeraBytes) di memoria fisica. Un comprensivo assalto ai problemi relativi alle performance della memoria comincia con una efficiente gerarchia di memoria, in grado di shiftare sistematicamente le istruzioni ed i dati necessari per le computazioni il più possibile “vicino” alla CPU, e gestire essi per quanto è necessario. In aggiunta alla memoria principale, UltraSPARC ____________________________________________________________________________________ SPARC Architecture Overview Pagina 25 di 40 III supporta due livelli di cache memory. Il primo livello (L1) consiste in quattro cache separate, due grandi e due piccole. Il secondo livello (L2) consiste in una singola cache grande. Le due grandi cache L1 tengono le istruzioni ed i dati rispettivamente. Le due piccole cache L1 sono una prefetch cache, principalmente usate da istruzioni di load per gestire dati floating-point, ed una write cache, che serve per ridurre notevolmente l’ammontare della banda di immagazzinaggio richiesta. Tutte e quattro le cache L1 sono on-chip. La grande cache L2 è una cache di istruzione e dati unificata. I contenuti della cache L2 sono immagazzinati off-chip (nella SRAM), ma gli L2 address tags sono tenuti onchip per un accesso più veloce. La Figura 2.8 mostra l’organizzazione della memoria di un sistema UltraSPARC III e la performance strategy associata. Figura 2.8 – Gerarchia di Memoria di UltraSPARC III Cu ____________________________________________________________________________________ SPARC Architecture Overview Pagina 26 di 40 On-Chip Memory Management Units: La MMU contiene due TLB (Traslation Lookside Buffer) che sono acceduti in parallelo durante l’address lookup: un TLB piccolo con a 16 ingressi, ed un TLB grande a 128 ingressi. La data MMU in UltraSPARC III Cu contiene tre TLB che sono accedute in parallelo: una TLB piccola con 16 ingressi e due TLB identiche con 512 ingressi (ogni TLB gestisce un indirizzo virtuale, l’indirizzo fisico corrispondente, e altre page protection associate). On-Chip L1 Data e Instruction Caches: Le cache L1 di dati ed istruzioni usano entrambe una Sum-Address Memory (SAM) per il calcolo degli indirizzi, un tecnica che combina due calcoli separati in uno. La data cache utilizza inoltre micro tags per immagazzinare indici virtuali ad 8-bit. Entrembe le tecniche sopra elencate servono per accelerare gli accessi alla cache. On-Chip Instruction Prefetch Buffer: Questo piccolo buffer è usato quando una miss nella cache L1 delle istruzioni ha un hit nei primi 32byte di una linea a 64byte o sottoblocco nella cache L2. In questo caso, i primi 32bytes della linea sono riempiti nella I-cache, e i secondi 32byte (necessari se il processo continua sequenzialmente) sono salvate nell’IPB. On-Chip L2 Cache Controller: Il cache L2 Controller supporta una larga cache da 8MB esterna, come pure una piccola dalle dimensioni di 1MB e 4MB (per sistemi che necessitano meno performance o per ottimizzare i costi) On-Chip Prefetch Cache: Questa piccola cache da 2KB è acceduta in parallelo con la data cache L1 per load floating-point. I dati possono essere piazzati in questa cache dalle miss floating-point, o prefetch software o hardware. La prefetch cache fornisce un punto di gestione on-chip per dati off-chip che possono prelevati prima del loro uso. On-Chip Write Cache: Il primo vantaggio offerto da questa piccola cache da 2KB è la capacità di preservare banda. Nella sezione Memory Bandwidth approfondiremo ulteriormente questo aspetto. On-Chip Main Memory Controller: La Memory Control Unit on-chip (MCU) fornisce un supporto built-in per chip SRAM da 133MHz. In base al numero ed alla densità dei chip SRAM usati, la dimensione della memoria principale può variare da un minimo di 128MB ad un massimo di 16GB. La MCU fornisce segnali di controllo solo sulla memoria, tutto il traffico risultante finisce attraverso il system data bus, controllato dal system interface unit (si veda di seguito). On-Chip System Interface Controller: Il System Interface Unit (SIU) on-chip implementa tutta la logica necessaria per supportare protocolli efficienti per la gestione dei traffico su bus e coerenza della cache. La Tabella 2.1 mostra i dettagli riguardo i vari elementi del memory system di UltraSPARC elencato sotto. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 27 di 40 STORAGE BLOCK LOCATED LATENCY (CYCLES) SIZE SETASSOCIATION LINE LENGTH (BYTES) WRITE POLICY I-TLBs (2) on-chip 2 16 ingressi 28 ingressi fully 2-way N/A N/A - D-TLBs (3) on-chip 2 16 ingressi 512 ingressi 512 ingressi fully 2-way 2-way N/A N/A N/A - L1 I-cache on-chip 2 32 KB 4-way 32 write-invalidate L1 D-cache on-chip 2 64 KB 4-way 32 write-through no write-allocate on-chip circa 5 1 line N/A 32 N/A on-chip 2 2 KB 4-way 64 write-invalidate on-chip varie 8 entry N/A N/A N/A Write Cache on-chip varie 2 KB 4-way 64 write-back write-allocate L2 Address Tags on-chip 2 90 KB N/A N/A N/A L2 Cache off-chip circa 19 8 MB 2-way 512 write-back write-allocate Main Memory off-chip molti fino a 16GB N/A N/A N/A I Prefetch Buffer Prefetch Cache Store Queue Tabella 2.1 - Instruction, Data, and Address Storage in UltraSPARC III Cu - Latenza della Memoria Un secondo fattore critico nell’evitare colli di bottiglia della memoria è la latenza, misurata in numero di cicli di clock CPU necessari per accedere alla memoria. UltraSPARC III paga considerevole attenzione per ridurre la latenza di memoria il più possibile ad ogni livello della gerarchia di memoria. Vediamo di seguito in dettaglio le latenze delle diverse componenti. On-Chip L1 Data Cache: UltraSPARC III mantiene un accesso veloce (2 cicli) a tutte le cache on-chip. Questo significa che penalità di latenza per accedere un dato trovato nella data cache L1 può essere evitato inserendo una istruzione tra l’istruzione di load e l’istruzione che utilizza i dati caricati. On-Chip L1 Instruction Cache: Siccome UltraSPARC III può eseguire fino a quattro nuove istruzioni ad ogni ciclo di clock, l’instruction cache L1 (come le altre cache onchip) usa una tecnica chiamata wave pipelining per abilitare il lancio dell’indirizzo del prossimo gruppo di quattro istruzioni prima che il gruppo precedente sia ricevuto. Il risultato è un rifornimento costante dei motori di esecuzione di UltraSPARC III ogni ciclo di clock. On-Chip Address Tags for L2 Cache: UltraSPARC III integra nella CPU non solo i controllori per le cache L2 off-chip ma anche gli address tag per le cache L2. L’abilità di elaborare gli address tag alla velocità del CPU clock accelera il calcolo delle hit/miss. Off-Chip L2 Cache Data: La cache esterna può operare a diverse velocità multiple del clock del processore, permettendo alle SRAM di essere selezionate sia per ____________________________________________________________________________________ SPARC Architecture Overview Pagina 28 di 40 performance che per bassi costi. Usando SRAM a 300MHz ad alte performance, nel caso migliore la latenza della cache L2 per un processore UltraSPARC III a 1200MHz è circa 19 cicli di clock. Dopo aver ricevuto informazioni su indirizzo, una L2 cache a 300MHz trasporta i dati richiesti da una CPU a 1200MHz ad un rate di 32 byte ogni 4 cicli di clock della CPU. On-Chip Memory Controller: Integrando la MCU nella CPU riduce il tempo necessario per accedere la memoria di circa il 30% (rispetto ad un memory controller off-chip). Speculative Execution of Loads: Per contribuire a gestire la latenza causata prelevando item dalla memoria, UltraSPARC III fornisce la capacità di eseguire load speculativamente, ad esempio lanciandole prima, fuori sequenza. Per items nella memoria principale, tuttavia, molti cicli di CPU trascorreranno tra il tempo in cui un item è richiesto ed il tempo in cui è ricevuto. Per supportare speculazione qui, UltraSPARC fornisce istruzioni di load speciali ad uso dei compilatori, che hanno la grande overview richiesta per la pianificare l’acquisizione di dati lontani in anticipo al loro uso. Software Prefetching: Anche i compilatori possono prendere i dati prima del necessario pubblicando le istruzioni di “prefetch” esplicite. - Memory (and I/O) Bandwidth In aggiunta alla costruzione di gerarchie di memoria che sistematicamente shiftano i dati necessari e le istruzioni il più vicino possibile alle execution engine (organizzazione), ed all’abbassamento del numero di clock necessari per accedere ogni livello della gerarchia di memoria (latenza), un assalto completo ai problemi di performance relativi alla memoria deve necessariamente aumentare la larghezza di banda, la quantità di dati che possono essere trasferiti in una data unità di tempo. La larghezza di banda è una funzione della larghezza di bus (numero di bit che possono essere trasferiti in parallelo) moltiplicata per la frequenza del bus (tasso a cui il bus cicla). 1,368-pin CLGA package: UltraSPARC III fa uso di un high pin-count Ceramic Land Grid Array (CLGA) package, in gran parte per supportare due data bus separati che ammontano ad una lunghezza di 384-bit (non contando i check ed address bit associati). La larghezza di banda attraverso questi due bus è di 12.0GB al secondo. 256-bit Data Bus to L2 Cache: Usando SRAM a 300MHz, l’interconnessione alla cache L2 permette che la CPU trasferisca le informazioni in e out ad un rate di 9.6GB al secondo (muovendo 32-byte alla volta, 300 milioni di volte la secondo). 128-bit Data Bus to System (Memory, I/O, any remote CPUs): Il bus principale di sistema può essere settato a diverse velocità multiple del clock del processore, fino ad un massimo di 150MHz (1/8 del tasso di clock di una CPU a 1200MHz). A 150MHz, la CPU può trasferire dati ed istruzioni da e verso il sistema ad un rate di 2.4GB al secondo (muovendo 16-byte alla volta, 150 milioni di volte la secondo) – banda a sufficienza per leggere o scrivere completamente una memoria principale da 16GB in 7.16 secondi. On-Chip Memory Controller: La MCU può gestire fino a 15 richieste di load/store allo stesso tempo, con completamento out-of-order. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 29 di 40 8-Entry Store Queue: Questo buffer per operazioni di store serve per disaccoppiare l’emissione delle store dalla loro esecuzione (allo stesso modo in cui la coda delle istruzioni disaccoppia il fetch delle istruzioni dalla loro esecuzione). Le store rimangono in questa coda fino a che non completino un aggiornamento alla Write cache, permettendo che le store relazionate vengano unite insieme e riducendo notevolmente le esigenze nei confronti della larghezza di banda esterna. Write Cache: Questa on-chip cache, benché piccola (2KB), ha un grande impatto sul traffico di store. La Write cache può unire molte piccole operazioni relazionate in una operazione più grande, in grado di trarre un vantaggio migliore sul largo data bus alla cache L2. Il risultato è una riduzione notevole del traffico di write-through da L1, eliminando fino al 90% delle operazioni separate di store richieste. Figura 2.9 – Caratteristiche di performance di UltraSPARC III Cu ____________________________________________________________________________________ SPARC Architecture Overview Pagina 30 di 40 2.1.2.1.5 Accelerare le computazioni con istruzioni speciali Esistono numerosi task computazionali importanti che coinvolgono l’esecuzione di uno o più operazioni altamente specializzate, necessarie ad esempio per accelerare applicazioni multimediali e di rete. Vediamo qualche esempio. - Processing Media-centric Code UltraSPARC I fu il primo processore general-purpose ad includere uno special set di istruzioni per accelerare applicazioni multimediali e grafiche, chiamate VIS (si veda di seguito). UltraSPARC III estende l’eredità di UltraSPARC I con nuove istruzioni capaci ad esempio di estrarre i dati di pixel da una immagine. Ciò ed altri miglioramenti VISibili garantiscono un nuovo numero di versione, per distinguere la funzionalità di VIS 2.0 disponibile con UltraSPARC III dalla funzionalità di VIS 1.0 disponibile con le prime due generazioni dei processori UltraSPARC. Nel paragrafo 2.1.4 analizzeremo più in dettaglio VIS. - Processing Scientific Code Il set di operazioni aritmetiche al cuore di VIS forniscono funzionalità necessarie per accelerare una larga varietà di algoritmi tecnici tipici della High Performance Computing (HPC). Ad esempio, VIS 2.0 aggiunge il supporto per l’aritmetica di intervallo, rendendole molto veloci alcune tipologie di computazioni numeriche. - Processing Java Code In aggiunta per migliorare il dynamic branch prediction, UltraSPARC III aggiunge una istruzione prepare-to-branch, che permette al software di specificare in anticipo la posizione delle branch target instrucions alla fetch unit, in modo tale che l’indirizzo possa essere computato in anticipo. Ad esempio nel codice Java, dove un interprete di byte code potrebbe spendere fino a metà del suo tempo saltando alle nuove procedure, il miglioramento delle prestazioni è notevole. - Processing Network-centric Code Come le precedenti generazioni di UltraSPARC, UltraSPARC III offre blocchi di istruzioni load/store parallelizzate che permettono di copiare dati da una locazione nella memoria centrale ad un’altra locazione, senza essere immagazzinati nella cache, velocizzando dunque il trasferimento di dati. 2.1.2.2 Caratteristiche per migliorare RAS 2.1.2.2.1 Error Detection and Correction (EDC) Per assicurare l’integrità dei dati salvati, UltraSPARC III fornisce protezioni contro vari errori che è possibile riscontrare in grandi semiconductor memory arrays. Le due grandi cache L1 on-chip sono entrambe protette dal controllo di parità, in grado di rilevare ogni singolo errore su bit dovuti a diverse cause. Se avviene un errore di parità, la linea errata della cache L1 è marcata come invalida, innescando un ricambio della linea con dati corretti dalla cache L2 (durante l’accesso successivo). Le memorie off-chip (la cache L2, includendo il suo address tag on-chip e la memoria centrale) sono protette da Error Correcting Code (ECC). Questo può rilevare e ____________________________________________________________________________________ SPARC Architecture Overview Pagina 31 di 40 correggere un singolo bit errato, e rilevare (ma non correggere) due bit errati. I dati rilevati errati ma non corretti sono segnati come invalidi. 2.1.2.2.2 Diagnostic Bus UltraSPARC III include uno speciale bus a 8-bit che opera in modo indipendentemente dal bus principale di sistema. La CPU può caricare il sistema da flash PROM tramite questo bus, e può accedere periferiche come console seriali. In questo modo il sistema è configurabile e testabile anche se la maggior parte di esso non è operativa. Durante il normale funzionamento, il diagnostic bus può essere utilizzato per monitorare la condizione interna del processore in tempo reale, permettendo sia l'individuazione tempestiva dei meccanismi di fallimento che la manutenzione proattiva per impedire o limitare i guasti. 2.1.2.2.3 Error Removal And Recovery Siccome ogni CPU UltraSPARC III controlla la sua memoria locale, rilevando e correggendo ogni singolo bit corrotto, la minaccia di un errore di dati che si propaga in altre CPUs in un sistema MP è eliminata in molti casi. Dove gli errori non possono essere corretti, la capacità di UltraSPARC III di contrassegnare i dati come non validi permette almeno che gli errori siano contenuti. 2.1.2.2.4 Lockstepping UltraSPARC III sostiene lockstepping, o la capacità di due o più CPU di sincronizzare le operazioni dal reset. Questa caratteristica è usata nei sistemi fault-tolerant, in cui CPUs multipli calcolano la stessa cosa allo stesso tempo e confrontano i risultati. 2.1.3 UltraSPARC IV Il processore superscalare UltraSPARC IV è fra i primi processori Chip Multithreading (CMT) che segue la strategia Sun Throughput Computing ed è pienamente compatibile con l’Instruction Set Architecture (ISA) SPARC-V9 a 64bit. Gli odierni processor single-core tradizionali possono processare soltanto un thread alla volta, spendendo la maggioranza del tempo attendendo i dati dalla memoria. Chip Multithreading (CMT) si riferisce alla capacità del processore di processare thread software multipli. Un processore CMT può implementare questo capacità multithread usando diversi di metodi: Core multipli su un singolo chip (CMP), Thread multipli su singolo core (SMT) oppure la combinazione di CMP e di SMT. UltraSPARC IV è un processore dual-thread e supporta fino a 16MB di external level-2 (L2) cache. Ad eccezione di un pin, UltraSPARC IV ha lo stesso footprint di un processore UltraSPARC III. Questo punto nel design minimizza le modifiche da apportare alle motherboard e il time-to-market. L’obiettivo di design primario per il processore UltraSPARC IV è quello di migliorare le prestazioni di rendimento nelle applicazioni commerciali come database, web server ed High Performance Technical Computing (HPTC). Le segunti tecniche chiave sono usate per migliorare le performance del processore UltraSPARC IV: ____________________________________________________________________________________ SPARC Architecture Overview Pagina 32 di 40 • Implementare capacità di elaborazione dual-thread La tecnologia CMT raddoppia le current compute density e riduce la dissipazione di calore generale, con conseguente risparmio e relativo vantaggio per l’utente finale. • Migliore configurazione della cache Level 2 (L2) Ogni thread nel processore UltraSPARC IV può accedere gli 8MB della cache L2 a 2-vie, set-associative. La line size della cache L2 è stata cambiata da 512bytes a 128bytes per ridurre il conflitto di dati associati con i sub-blocked caches. • Migliore Floating Point Unit Una FPU produce elevate performance su diverse tipologie di codice quale ad esempio quello per l’implementazione della Fast Fourier Trasform (FFT). La FPU è assistita da hardware addizionale per IEEE 754-1985 exception processing. • Migliore write cache La write cache, usata per ridurre gli usi inefficenti della banda nel cache bus, è stata migliorata con un algoritmo hashed-index per ridurre la latenza write cache. I thread che vengono eseguiti sul processore UltraSPARC IV condividono: indirizzi e data bus per accedere i dati della cache L2, la Memory Control Unit (MCU) e il Sun Fireplane Interconnect port. I bus alla cache L2 ed i moduli fisici della SRAM contenenti le cache L2 sono condivisi. Benchè la cache L2 sia logicamente separata per ogni thread in esecuzione sul processore UltraSPARC IV, la cache L2 è fisicamente contenuta in un modulo SRAM. La Figura 2.10 mostra lo schema a blocchi del processore UltraSPARC IV. Figura 2.10 – Il processore UltraSPARC IV ____________________________________________________________________________________ SPARC Architecture Overview Pagina 33 di 40 La Tabella 2.2 elenca miglioramenti in esecuzioni single-thread includendo incrementi di clock rate e un nuova organizzazione della cache. Caratteristica Beneficio Ogni thread eseguito sul processore UltraSPARC IV può accedere gli 8MB della cache L2 con 128byte di line size (2 sub-blocks per line) o 4Mb con 64byte per line size (no sub-block) Cache più efficiente su un largo range di applicazioni Cache L2 impiega last-recently-used (LRU) eviction strategy LRU è una cache eviction policy che porta ad avere un migliore hit cache, favorendo esecuzioni veloci e un throughput di sistema migliore Supporta un elevato system clock divisors Aumenta il system throughput performance totale permettendo alti clock multipli di 150MHz L2 cache address bus error protection Comporta una elevata affidabilità Hash-indexing per cache di scrittura Decrementa i conflitti durante scritture multiple portando ad avere un elevate banda di store e performance totali Hardware addizionale per il processamento delle eccezioni floating-point IEEE 754-1985 Decrementa l’overhead di sistema permettendo alla logica hardware del processore di eseguire il processamento delle eccezioni piuttosto che inoltrarle al software dek sistema operativo Software prefetch semantics usata con l’hardware prefetch cache Elevate performance in floating-point Tabella 2.2 – Miglioramenti introdotti nel processore UltraSPARC IV La Tabella 2.3 elenca i cambiamenti dovuti alla tecnologia CMT implementata nel processore UltraSPARC IV. Miglioramenti CMT Le risorse come i registri MCU, pin, e registri Sun Fireplane sono condivisi cosicchè ogni thread nel processore sia in grado di accederli. Nuovi registri sono stati aggiunti per supportare il Modello Sun Standard CMT, permettendo la compatibilità gli standard di sistema operativo e con tutti i processori CMT di Sun Registri di processore inizializzati con valori associati con CMT. Aggiunto un nuovo registro per-thread ASI_CESR_ID. Questo è un thread ID associato con il Sun Fireplane Interconnected block I/O. Un dispositivo remoto può identificare il thread sorgente di un blocco di dati Tabella 2.3 – Miglioramenti dovuti alla tecnologia CMT Il processore UltraSPARC IV eredita tutte le features di affidabilità, disponibilità e servizio (RAS - reliability, availability, and serviceability) implementate nel processore UltraSPARC III con l’aggiunta di L2 cache address bus error protection. Il data bus tra il processore UltraSPARC III e la cache L2 esterna è protetto con Error Check/Correction Code (ECC). ____________________________________________________________________________________ SPARC Architecture Overview Pagina 34 di 40 Il processore dual-thread UltraSPARC IV fa parte della prima generazione di processori CMT sviluppati da Sun per mid-range e high-end server. Per i prossimi processori nella famiglia di UltraSPARC IV saranno ulteriormente migliorate le performance già ottenute dalla prima generazione dei processori UltraSPARC IV. 2.1.4 Visual Instruction Set (VIS) La richiesta di grafica avanzata nei processori general-purpose è dovuta alla crescita di settori molto diversi, come la videoconferenza, la visualizzazione 3D, l'animazione, la realtà virtuale, le trasmissioni dati. L'UltraSPARC utilizza una potenza di elaborazione a 64 bit, che fornisce il throughput necessario per la grafica avanzata e le applicazioni video in tempo reale. Le estensioni VIS (Visual Instruction Set) al set di istruzioni standard dell'UltraSPARC permettono il completamento di istruzioni complesse, che tipicamente richiederebbero dozzine di cicli di clock, in un singolo ciclo. Ciò è ottenuto con operazioni di tipo SIMD (Single Instruction Multiple Data). L'UltraSPARC è basato su un'architettura superscalare, con quattro pipeline che possono eseguire le istruzioni in parallelo. Ci sono due pipeline nell'unità interi e due in un'unità speciale detta Floating Graphics, che si occupa dell'esecuzione delle istruzioni VIS. Con un'istruzione di somma VIS, quattro operandi a 16 bit vengono caricati in un registro a 64 bit, e quattro in un altro registro. Quindi, in un singolo ciclo di clock vengono eseguite quattro operazioni di somma a 16 bit. Figura 2.11 L'istruzione VIS mul8x16 I campi in cui vengono utilizzate le estensioni VIS sono molti; nei prossimi paragrafi analizziamo i due più significativi: • • L'accelerazione delle funzioni di networking La decodifica MPEG2 in tempo reale ____________________________________________________________________________________ SPARC Architecture Overview Pagina 35 di 40 2.1.6.1 VIS e l'accelerazione delle funzioni di networking Con il set di istruzioni VIS, i processori UltraSPARC possono muovere dati ed eseguire i calcoli richiesti dalle routine di rete più velocemente, grazie a due categorie di istruzioni: • Aritmetica parallela: il VIS include operazioni matematiche di tipo SIMD, che possono essere utilizzate per accelerare funzioni intensive di tipo I/O oppure di networking. • Spostamento dati: il VIS possiede anche istruzioni che effettuano il load e lo store in blocchi da 64 bit; ciò permette di accelerare le operazioni di I/O che si presentano nel protocollo TCP/IP, ottenendo così un aumento delle performance delle operazioni di rete. Ad esempio, il movimento dei dati tra buffer di memoria viene aumentato di un fattore pari a 1.9X. Le routine utilizzate per muovere segmenti di dati lungo una rete sono funzioni timecritical, che hanno un notevole impatto sulle prestazioni della rete. Quando una tipica applicazione di rete legge o scrive dati fra i nodi, una chiamata di sistema read/write inizia il movimento dei dati attraverso un driver di rete, che trasferisce tali dati dalla memoria alla scheda di rete. Le istruzioni VIS di load e store possono essere utilizzate per accelerare le operazioni di copia dei dati: più parole possono essere trasferite utilizzando una singola istruzione, bypassando la memoria cache. Ciò aumenta notevolmente il flusso di dati aggregati, rispetto alla copia delle stesse regioni di memoria attraverso le tradizionali operazioni di load/store. 2.1.6.2 Il VIS e la decodifica MPEG2 in tempo reale L'UltraSparc è stato il primo processore general-purpose capace di comprimere le informazioni video in MPEG2, eliminando la necessità di un costoso sottosistema video con processore dedicato. Ciò è possibile grazie all'architettura dell'UltraSparc, composta da due ALU per gli interi e un'unità floating point e grafica (FPGU), in grado di fornire cinque unità funzionali: • • • • • Divisione/radice quadrata in virgola mobile Addizione/sottrazione/valore assoluto/negazione in virgola mobile Moltiplicazione in virgola mobile Addizione grafica Moltiplicazione grafica Nonostante la potenza nella manipolazione intera e floating point, il throughput che si ottiene con UltraSPARC non è sufficiente per la manipolazione di video digitale in tempo reale; aggiungendo parallelismo al modo di manipolare dati del processore è la via più elegante per superare anche questo limite. Le istruzioni VIS possono infatti elaborare quattro pixel in una sola operazione, effettuando la moltiplicazione, l'addizione, la somma o la valutazione logica; inoltre sono presenti speciali istruzioni che migliorano specificatamente le prestazioni della compressione/decompressione video. Per esempio una sola istruzione VIS, che calcola la somma della differenza assoluta fra due vettori di otto pixel, sostituisce le 48 operazioni richieste da molti dei processori convenzionali. In generale, il VIS fornisce un miglioramento di circa quattro volte in molte delle operazioni time-critical della compressione/decompressione video, con un'occupazione ____________________________________________________________________________________ SPARC Architecture Overview Pagina 36 di 40 di area del chip da parte delle istruzioni grafiche pari solamente al 3%. Guadagni ulteriori si possono avere nelle configurazioni multiprocessore. 2.2 LEON LEON, è una implementazione completamente open source scritta in VHDL sviluppata da Gaisler Research in collaborazione con l’Agenzia Spaziale Europea (ESA). LEON è descritto da un modello VHDL sintetizzabile di un processore a 32 bit compatibile con l’architettura SPARC-V8. Il codice sorgente è distribuito con licenza GNU LGPL ed è dunque liberamente utilizzabile e modificabile. Il processore (Figura 2.12) include una integer unit con pipeline a cinque stadi, due cache a mappatura diretta e controllo di parità per dati e istruzioni, 136 registri da 32 bit divisi in otto finestre. Il codice sorgente preso in considerazione (relativo alla versione 2.2) include anche: • • • Un controller per memorie a 8 o 32 bit, che fornisce un’interfaccia per PROM, SRAM e dispositivi di I/O memory mapped; Un controller di interrupt in grado di gestire fino a 15 segnali provenienti dall’interno o dall’esterno del processore; Una porta di I/O a 32 bit, che può essere utilizzata anche per l’ingresso degli interrupt provenienti dall’esterno del processore. Aderendo allo standard SPARC, con LEON possono essere usati compilatori e kernel per l’architettura SPARC V8. Inoltre Gaisler Research fornisce un compilatore C/C++ per LEON, LECCS, e un simulatore del processore, TSIM, che può essere interfacciato a gdb e riprodurre fedelmente il funzionamento del LEON. Figura 2.12: Diagramma a blocchi del processore LEON ____________________________________________________________________________________ SPARC Architecture Overview Pagina 37 di 40 2.3 Altre Soluzioni Di seguito riportiamo per completezza altre soluzioni conformi allo standard SPARC, ma ormai obsolete. 2.3.1 Super SPARC Questa è una soluzione proposta da Texas Instrument in associazione con Sun. Usualmente lavora ad una frequenza di clock intorno a 50 MHz ed è caratterizzata da cache fino a 1MB L2, è disponibile entrambi su moduli a processore singolo e doppio. Dal punto di vista tecnico, questa è una implementazione di SPARC-V8, è un processore superscalare, con due cache, una per le istruzioni ed un’altra per i dati. • • L’instruction cache da 20KB è associativa a 5 vie. La data cache da 16KB è associativa a 4 vie. 2.3.2 Sun SPARC Ormai parecchio obsoleta, è una implementazione dello Standard SPARC-V7; la caratteristica principale è una Integer Unit (IU), una Floating Point Unit (FPU) esterna, una direct associative cache unificata (dati e istruzioni) da 64 KB e una Memory Management Unit (MMU). Esiste una pipeline di 4 fasi per le istruzioni intere (fetch F, decode D, exec E, update WB). FPU e ed IU sono sincronizzati. 2.3.3 Micro SPARC Questa è ancora una soluzione implementata da Texas Instrument in associazione con Sun, usata nelle SparcStation Classic, SparcStation LX, ad una frequenza superiore ai 50MHz. Un suo derivato, MicroSpacr II, può essere trovato in SparcStation 4, SparcStation 5 ad una frequenza superiore ai 110MHz. Dal punto di vista tecnico, le sue caratteristiche principali sono un alto livello di integrazione, la presenza di due cache, una per i dati ed una per le istruzioni. • • Instruction direct associative cache da 4KB Data direct associative cache da 2KB 2.3.4 Hyper SPARC Questo processore è stato introdotto da ROSS nel 1993, ed è usualmente utilizzato dalle SparcStation 10 e SparcStation20, ad una frequenza di 150MHz, ed è disponibile su entrambi moduli a processore singolo e doppio. Dal punto di vista tecnico è un’implementazione della specifica SPARC-V8, ed è superscalare. E’ disponibile con L2 cache superiore a 512KB. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 38 di 40 3.0 Conclusioni e Sviluppi Futuri Scalable Processor ARChitecture (SPARC) permette di avare processori ad alte prestazioni e di implementare sistemi a diversi rapporti di prezzo e prestazioni. In questa analisi abbiamo visto come i concetti tipici della strutturazione RISC di una macchina convenzionale sono stati messi in pratica per la definizione e realizzazione dell'architettura SPARC. In particolare, abbiamo analizzato l’architettura interna e le principali funzionalità delle diverse unità di un processore SPARC. Inoltre, abbiamo descritto le principali implementazioni, focalizzando l’attenzione su UltraSPARC, il progetto attualmente più attivo ed aggiornato. Possiamo dunque dichiarare che i processori SPARC forniscono un’ottima soluzione per ambienti enterprise, grazie alle ottime performance ed in alcuni casi alla capacità di fornire soluzioni robuste e performanti anche per ambienti mission-critical. Concludiamo questa analisi affermando che attualmente Sun Microsystem sta lavorando ad una nuova implementazione di UltraSPARC, in cui la tecnologia 90nm di Texas Instrument, l’aumento della frequenza di clock, la banda, e l’aggiunta una cache level-3 sono solo alcune delle nuove feature. ____________________________________________________________________________________ SPARC Architecture Overview Pagina 39 di 40 4.0 Riferimenti [1] Sito web Sparc International www.sparcinternational.com [2] Sito web Sun Microsystem www.sun.com/processors [3] The SPARC Architecture Manual Versione 9 www.sparc.com/standards/SPARCV9.pdf [4] The SPARC Architecture Manual Versione 8 www.sparc.com/standards/V8.pdf [5] Sito web SPARC www.sparc.com/history.html [6] Sito web Texas Instruments www.ti.com [7] Sito web Gaisler Research www.gaisler.com [8] Wikipedia en.wikipedia.org/wiki/SPARC [9] J. Vahid, T.Givargis “Embedded System Design “, 2003 ____________________________________________________________________________________ SPARC Architecture Overview Pagina 40 di 40