Intel IA-64 Daniele Venzano Davide Chiarella Francesco Figari 1/29 Obiettivi della Intel 1 Espandibilità futura: IA-64 è stato progettato per permettere espansioni future fornendogli sufficiente capacità architetturale Spazio di indirizzamento a 64 bit File dei registri ampio e direttamente accessibile Numero sufficiente di bit di istruzione per la comunicazione fra compilatore e Hardware Elevato ILP (Instruction Level Parallelism) 2/29 Obiettivi della Intel 2 Retrocompatibilità con Architettura IA-32 Per ragioni di mercato Intel ha preferito conservare la retrocompatibilità con la vecchia architettura IA-32, permettendo così ai vecchi applicativi di essere eseguiti anche su IA-64, a discapito tutttavia dell’efficienza. 3/29 Obiettivi della Intel 3 Risolvere le limitazione delle attuali architetture Attualmente gli incrementi di prestazioni delle CPU sono dovuti in massima parte al miglioramento del processo tecnologico della lavorazione del silicio piuttosto che ad innovazioni strutturali delle macchine. Tenendo conto della legge di Moore, Intel ha scommesso su questa nuova architettura che, a parità di tecnologia, sulla carta dovrebbe sbaragliare la vecchia IA-32. 4/29 Obiettivi della Intel 4 Elevato ILP (Instruction Level Parallelism) Esempio di gruppi di istruzioni I compilatori per i processori attuali producono codice senza tenere presente come il processore le eseguirà: IA-64, per aumentare l’ILP, permette al compilatore di creare gruppi di istruzioni che possono essere eseguite in parallelo. Questo compito può sembrare complesso, ma i compilatori attuali possiedono già tutte le informazioni necessarie. 5/29 Obiettivi della Intel 5 Elevato numero di registri dedicati e general purpose IA-64 è stato fornito di un elevato numero di registri (128) per aumentare le performance del processore (ad es. minori swap fra registri e memoria) 6/29 Architettura EPIC (Explicit Parallel Instruction Computing) Una architettura EPIC fornisce: 1. Meccanismi per permettere al compilatore di organizzare efficientemente la computazione basandosi sulla sua conoscenza globale 2. Risorse sufficienti (registri ed unità funzionali) per eseguire operazioni multiple in parallelo e memorizzare i risultati intermedi 3. Formati di istruzioni che permettono al compilatore di comunicare all’hardware le informazioni chiave che ha raccolto in fase di compilazione 7/29 Formato delle Istruzioni 1 Ogni istruzione è ampia 41 bit così divisi: • 14 bit per l’operazione • 7 bit per il primo operando • 7 bit per il secondo operando • 7 bit per il terzo operando • 6 bit per il registro predicato La dimensione, alquanto singolare, delle istruzioni è stata determinata dalla scelta della codifica che usa IA-64: una codifica a 128 bit (chiamata bundle) che raggruppa 3 istruzioni. 8/29 Formato delle Istruzioni 2 Un bundle, come già detto, contiene tre istruzioni per un totale di 123 bit: i rimanenti 5 bit costituiscono il template che specifica il mapping fra gli instruction slot e le Execution Unit Type (Integer Unit, Floating Point Unit, Memory Unit e Branch Unit) e inoltre contiene informazioni sulla separazione dei basic block. 9/29 Modalità di Funzionamento L’architettura IA-64 supporta tre modalità di funzionamento: IA-32 System Environment supporta sistemi operativi IA-32 a 32 bit IA-64 System Environment supporta sistemi operativi IA-64-based IA-32 mista supporta su sistemi operativi IA-64-based applicazioni sviluppate su IA-32 10/29 Sommario dei Registri 2 1 3 4 11/29 Supporto al Sistema Operativo Problema: IA-32 -> spazio di indirizzamento 4 GB IA-64 -> spazio di indirizzamento 16x109 GB Utilizzare le pagine da 4KB significa avere una page table con 1015 entry, che non può essere contenuta completamente in memoria Soluzione: Pagine di dimensioni più grandi Suddivisione dello spazio di indirizzamento 12/29 Soluzioni IA-64 supporta pagine di dimensione variabile tra 4 KB e 256 MB Lo spazio di indirizzamento è suddiviso in 8 regioni che il sistema operativo può destinare a differenti compiti: Librerie condivise Memoria condivisa e IPC Kernel ... 13/29 Register Stack Lo stack dell’IA-64 è implementato sui 96 registri generali che possono essere ridenominati sotto controllo software. L’RSE (Register Stack Engine) provvede ad allocare un nuovo stack frame al momento della chiamata ad una procedura, occupando i registri necessari. Se non c’è più spazio una parte dello stack viene copiata in memoria, liberando dei registri. Questo meccanismo può anche essere implementato in modo speculativo. 14/29 Ridenominazione dei Registri 1 2 3 1. Chiamata: i registri locali vengono nascosti. 2. Allocazione: registri vuoti vengono allocati per la nuova procedura. 3. Ritorno: vengono ristabiliti i nomi dei registri come erano prima della chiamata. 15/29 Software Pipelining I loop sono molto comuni, una loro ottimizzazione porta grossi vantaggi in tutto il software esistente. IA-64 offre un supporto hardware che riduce di molto la dimensione del codice che il compilatore deve generare per l’esecuzione delle singole iterazioni all’interno di una pipeline. Ogni iterazione inizia prima che quella precedente sia terminata, quindi in ogni istante potrebbe essercene in esecuzione più d’una. 16/29 Esecuzione Software Pipelining IA-64 offre istruzioni e registri appositi per la gestione dei loop. Il contatore viene decrementato automaticamente ad ogni iterazione. C’è una istruzione di jump apposita per terminare il ciclo e un registro (l’epilog count) che mantiene un conteggio degli stadi ancora attivi nella pipeline quando il ciclo termina. 17/29 Istruzioni Predicated 1 Predication: esecuzione condizionale di una singola istruzione, dove il valore di guardia è dato da un registro per predicato Supporto nell’IA-64 Hardware: 64 registri (16 statici + 48 sottoposti alla RSE) Instruction set: target delle istruzioni di test e compare tutte le istruzioni possono essere predicate (salvo poche eccezioni) 18/29 Istruzioni Predicated 2 If conversion Asm tradizionale if (r1 == r2) r9 = r10-r11; else r5 = r6+r7; cmp cjmp < ramo jump r1,r2 then else > end IA-64 (p1) (p2) cmp.eq p1,p2 = r1,r2;; sub r9 = r10,r11 add r5 = r6,r7 then: < ramo then > end: … Altre applicazioni: Multiway branches, Parallel Compare 19/29 Branch Prediction 1 E’ resa necessaria dalla struttura a pipeline Alcuni salti sono eliminabili tramite predication Si introducono istruzioni che forniscono al branch predictor informazioni per migliorare la corretta predizione, la velocità (meno bolle nella pipeline) e lo sfruttamento di risorse hardware 20/29 Branch Prediction 2 Hints a disposizione vengono forniti via modificatori o istruzioni brp Prediction strategy meccanismo hw di predizione valore più probabile del salto Sequential prefetch Static / Dynamic Taken / Not-Taken Few / Many numero di linee da precaricare Predictor deallocation Clr azzera le informazioni sul salto 21/29 Compiler-directed Speculation 1 Necessità: riordinare il codice per sfruttare il parallelismo Problemi: dipendenze di flusso (control ) e di accesso alla memoria (data ) Soluzioni: istruzioni speculative e differimento delle eccezioni Speculation: esecuzione di codice che probabilmente sarà utile 22/29 Compiler-directed Speculation 2 Suddivisione del set di istruzioni: Istruzioni speculative Istruzioni non-speculative Scrivono solo nei registri GR e FR Differiscono o propagano eventuali eccezioni Modificano lo stato dell’architettura Sollevano eccezioni Rappresentazione eccezioni Registri NaT (GR) e valori NaT (FR) (NaT – Not a Thing) 23/29 Control Speculation Nuova classe di istruzioni: speculative loads possono essere rischedulate prima di un salto condizionale al loro posto istruzioni di check ed eventuali procedure di recovery instrA ld8.s r1 = [r2] instrB use r1 … instrA br instrB … ld8 r1 = [r2] use r1 br chk.s 24/29 Data Speculation 1 Ulteriore classe di istruzioni introdotta dalla architettura Intel: advanced loads possono essere inserite prima di una serie di store in dipendenza ambigua con un’operazione di load al loro posto sono sostituite da check load, se in caso di modifica è sufficiente ricaricare il valore advanced load check ed eventuale recovery, se sono state eseguite speculativamente operazioni più complesse si appoggia ad una cache hardware che tiene traccia delle locazioni caricate nei registri, chiamata ALAT – Advanced Load Address Table 25/29 Data Speculation 2 Esempio 1: recovery utilizzando check load Senza Data Speculation Con Data Speculation // altre istruzioni ld8.a r6 = [r8];; st8 [r4] = r12 // altre istruzioni ld8 r6 = r[8] st8 [r4] = r12 add r5 = r6, r7;; ld8.c.clr r6 = [r8] st8 [r18] = r5 add r5 = r6, r7;; st8 [r18] = r5 26/29 Data Speculation 3 Esempio 2: recovery con advanced load check Senza Data Con Data Speculation Speculation [r4] = r12 ld8 r6 = r[8] add r5 = r6, r7;; st8 [r18] = r5 r6 = [r8];; add r5 = r6, r7;; // altre istruzioni // altre istruzioni st8 ld8.a st8 [r4] = r12 chk.a.clr r6, recover st8 [r18] = r5 recover: ld8 r6 = [r8];; add r5 = r6, r7 br back back: … 27/29 Software per Itanium 1 Itanium Server: Debian SuSE Linux Enterprise Server 7 Windows 2003 Adv. Server Lim. Ed. RedHat Linux Adv. Server 7.2 28/29 Software per Itanium 2 Itanium Workstation: RedHat NULL HP-UX 11i v1.5 (workstation HP) Windows XP 64-bit Edition IBM AX-5L Turbolinux SuSE Linux 7.2 29/29