Microarchitettura dei processori per Pc



Documenti analoghi
Calcolatori Elettronici

CPU. Maurizio Palesi

Laboratorio di Informatica

Architettura hardware

CPU pipeline 4: le CPU moderne

CPU pipeline 4: le CPU moderne

C. P. U. MEMORIA CENTRALE

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Architettura del calcolatore

Esame di INFORMATICA

DMA Accesso Diretto alla Memoria

Laboratorio di Informatica

Quinto Homework. Indicare il tempo necessario all'esecuzione del programma in caso di avvio e ritiro fuori ordine.

Calcolatori Elettronici. La memoria gerarchica La memoria virtuale

ARCHITETTURE MICROPROGRAMMATE. 1. Necessità di un architettura microprogrammata 1. Cos è un architettura microprogrammata? 4

Lezione n.19 Processori RISC e CISC

Architettura dei calcolatori I parte Introduzione, CPU

Struttura del calcolatore

Hazard sul controllo. Sommario

Architettura di un calcolatore: introduzione

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Il processore. Il processore. Il processore. Il processore. Architettura dell elaboratore

La memoria centrale (RAM)

La macchina di Von Neumann. Archite(ura di un calcolatore. L unità di elaborazione (CPU) Sequenza di le(ura. Il bus di sistema

CALCOLATORI ELETTRONICI 29 giugno 2011

Memoria Virtuale. Anche la memoria principale ha una dimensione limitata. memoria principale (memoria fisica) memoria secondaria (memoria virtuale)

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Valutazione delle Prestazioni. Valutazione delle Prestazioni. Architetture dei Calcolatori (Lettere. Tempo di risposta e throughput

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Organizzazione della memoria

Calcolatori Elettronici. La Pipeline Criticità sui dati Criticità sul controllo Cenni sull unità di controllo

Calcolo numerico e programmazione Architettura dei calcolatori

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web: Prof. G. Quarella prof@quarella.

Capitolo 11 La memoria cache

Strutturazione logica dei dati: i file

Organizzazione della memoria principale Il bus

CALCOLATORI ELETTRONICI 29 giugno 2010

Esercizi su. Funzioni

All interno del computer si possono individuare 5 componenti principali: SCHEDA MADRE. MICROPROCESSORE che contiene la CPU MEMORIA RAM MEMORIA ROM

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

Informatica - A.A. 2010/11

CALCOLATORI ELETTRONICI 31 marzo 2015

Lezione 3: Architettura del calcolatore

Corso di Calcolatori Elettronici I A.A Il processore Lezione 18

Dispensa di Informatica I.1

Più processori uguale più velocità?

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

I componenti di un Sistema di elaborazione. CPU (central process unit)

Schedulazione dinamica. Elettronica dei Calcolatori 1

STRUTTURE DEI SISTEMI DI CALCOLO

Il Processore: i registri

Gestione della memoria centrale

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

- Algoritmi ed esecutori di algoritmi - ALGORITMI MACCHINA DI VON NEUMANN

Architettura di un sistema di calcolo

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Architettura di un calcolatore

Appunti sulla Macchina di Turing. Macchina di Turing

Architettura dei computer

Database. Si ringrazia Marco Bertini per le slides

La Firma Digitale La sperimentazione nel Comune di Cuneo. Pier Angelo Mariani Settore Elaborazione Dati Comune di Cuneo

Architettura dei calcolatori II parte Memorie

Testi di Esercizi e Quesiti 1

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

LABORATORIO DI SISTEMI

FONDAMENTI di INFORMATICA L. Mezzalira

Gerarchie di memoria Divide et impera. Gerarchie di memoria La congettura 90/10. Gerarchie di memoria Schema concettuale

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

ARCHITETTURA DEL CALCOLATORE

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

In realtà, non un solo microprocessore, ma un intera famiglia, dalle CPU più semplici con una sola pipeline a CPU molto complesse per applicazioni ad

Parte II.2 Elaboratore

Architettura della CPU e linguaggio assembly Corso di Abilità Informatiche Laurea in Fisica. prof. ing. Corrado Santoro

Introduzione all'architettura dei Calcolatori

Novità di Access 2010

Contenuti. Visione macroscopica Hardware Software. 1 Introduzione. 2 Rappresentazione dell informazione. 3 Architettura del calcolatore

Mon Ami 3000 Centri di costo Contabilità analitica per centri di costo/ricavo e sub-attività

Architettura del computer (C.Busso)

Dispositivi di rete. Ripetitori. Hub

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

Sistemi Operativi. 5 Gestione della memoria

Sistema operativo: Gestione della memoria

ARCHITETTURA DI RETE FOLEGNANI ANDREA

Lezione 1: L architettura LC-3 Laboratorio di Elementi di Architettura e Sistemi Operativi 10 Marzo 2014

Transcript:

Microarchitettura dei processori per Pc Le tecnologie delle Cpu moderne si sono affinate al punto da rendere i processori molto complessi. Analizziamo il funzionamento di Athlon e Pentium 4. Analizzando la complessa architettura delle ultime generazioni di processori, impressiona come ci si ritrovi dopo solo pochi anni a descriverla come tecnologia obsoleta e di semplice comprensione se paragonata a quella che nel corso del tempo le è succeduta. Ogni nuovo processore porta con se il frutto dell esperienza e della ricerca, sotto forma di qualche tipo di nuova tecnologia; a causa della rapidità con cui si evolvono la stessa tecnologia e il mercato, il tempo per comprendere a fondo le potenzialità racchiuse in un nuovo processore è così breve che, quando si crede di poter ormai dominare i segreti della sua architettura, questa viene soppiantata in favore di qualcosa che promette prestazioni decisamente superiori. Questo aspetto è stimolante per chi vive con la passione di scoprire e sfruttare le nuove tecnologie, ma per molti si traduce in una frustrante rincorsa a qualcosa che diventa vecchio ancor prima di averlo tra le mani. Quello che ci proponiamo in questa sede è di approfondire il funzionamento di un moderno microprocessore per Pc, muovendosi passo dopo passo all interno dei suoi meccanismi di funzionamento; in questo modo intendiamo fornirvi anche uno strumento di analisi per esaminare le diverse scelte tecniche adottate dai produttori. Per fare questo è necessario costruire un modello analitico di valenza generale con cui poter comparare le diverse tecniche di progettazione dei processori x86, e l impatto che queste hanno sul funzionamento del Pc. In realtà quello che ci proponiamo non è un compito semplice, in quanto esistono alcune differenze radicali nelle architetture proposte dai diversi costruttori, tali da rendere difficoltoso un raffronto diretto. La strada che si può percorre per comprendere e raffronaccesso istruzione decodificazione istruzione esecuzione accesso ai dati scrittura risultati Schema di funzionamento generale di un processore. I passaggi a sinistra possono essere spezzati, combinati o riarrangiati ma sono sempre presenti in ogni microarchitettura. sottosistema memoria Le operazioni dei computer in 5 stadi Di J. Scott Gardner > Stadio 1 Accesso all istruzione (Instruction Access, IA) > Stadio 2 Decodifica dell istruzione (Instruction Decode, ID) > Stadio 3 Esecuzione (EX) > Stadio 4 Accesso ai dati (Data Access, DA) > Stadio 5 Salvataggio dei risultati (Store Results, Write Back, WB) tare al meglio i nuovi processori è di scendere sino ai principi base dell architettura dei processori e mostrare le differenti vie scelte dai produttori per la progettazione dei moderni computer. In questa analisi è importante non perdere di vista un aspetto essenziale: quello che maggiormente conta è la capacità offerta dalla Cpu nell eseguire il software, astraendoci dalle particolari scelte tecniche privilegiate da diversi approcci di costruzione del processore. È infatti assodato che quello che conta maggiormente nell efficienza della macchina Pc è la rimozione dei colli di bottiglia, principali responsabili di rallentamenti e limitazioni alle prestazioni. La progettazione di un processore è un insieme di trucchi ingegneristici e di avanzate tecniche di costruzione, che permettono di stipare in pochi mm quadrati milioni di transistor. Osservando con occhio distaccato un computer, si nota come questo non sia altro che una macchina in grado di leggere istruzioni, decodificarle ed eseguirle. Se il comando in esecuzione necessita di recuperare o immagazzinare alcuni dati, il computer ricerca la locazione per i dati e li sposta. Se non guardiamo al risultato finale questo è quello che fa un computer. Possiamo dividere queste operazioni in un serie di passaggi intermedi. Alcuni progettisti riarrangiano, combinano o spezzano questi passaggi, ma ogni microarchitettura presente nei computer esegue questi cinque stadi. Possiamo quindi appoggiarci a questo semplice schema per analizzare anche le Cpu più complicate. I cinque stadi possono essere eseguiti completamente per una singola istruzione prima di affrontarne una nuova. La complessità delle Cpu inizia nel momento stesso in cui si cerca di superare questo limite. > Accesso alle istruzioni Un istruzione codificata viene letta dal sottosistema di memoria a un indirizzo determinato da un contatore di 316

programma (Program Counter, PC). In questa analisi trattiamo la memoria come un oggetto che affianca l unità di esecuzione della Cpu. > Decodifica dell istruzione Dopo che l istruzione codificata è stata letta, viene tradotta in comandi di controllo che possono essere eseguiti dai circuiti logici del processore. Ogni codice operazione (Opcode) rappresenta una differente istruzione e istruisce la macchina ad operare in modi diversi. Incapsulate nelle Opcode (o immagazzinate nei Byte seguenti all istruzione) trovano posto informazioni di indirizzamento o dati che devono essere processati immediatamente. Le informazioni aggiuntive presenti nelle Opcode possono rappresentare un nuovo indirizzo che deve essere caricato nel Contatore di Programma (branch address, indirizzo di salto) o una locazione di memoria dati (caricare o salvare). > Esecuzione Nello stadio di esecuzione la macchina esegue l operazione comandata dall istruzione. Questa potrebbe essere un operazione matematica (moltiplicazione, addizione, ecc.) o un operazione per muovere alcuni dati. Se l istruzione implica l azione su dati in memoria il processore deve calcolare un indirizzo effettivo (Effective Address, EA); questo rappresenta l attuale locazione dei dati nel sottosistema di memoria, calcolato sullo sfasamento degli indirizzi o risolvendo riferimenti indiretti. > Accesso ai dati A questo livello vengono inviati gli Indirizzi Effettivi al sottosistema di memoria, di modo che le istruzioni possano ricevere i dati di cui necessitano o immagazzinare dati ad indirizzi specifici. > Write back Non appena il processore ha condotto a termine l esecuzione dell istruzione, dopo l eventuale lettura di dati in memoria, i risultati vengono scritti nei registri di destinazione (se previsto). Il modello che abbiamo appena presentato sembra molto semplice, ma in realtà il suo funzionamento si complica molto quando si trova ad operare con lo schema di indirizzamento di un processore x86. Questo tipo di processore è di tipo registro-memoria (register-memory), ovvero presenta un architettura in cui anche le istruzioni della Alu (Aritmetic Logic Unit, Logico Aritmetica) possono accedere alla memoria. In contrapposizione l architettura Risc (Reduced Intruction Set Computing) permette soli comandi di lettura e scrittura per lo spostamento di dati; questo tipo di architettura è denominata registro-registro. Le istruzioni Cisc (Complex Instruction Set Computing) vengono infatti tradotte in istruzioni del tipo Risc. Queste consentono una più facile ottimiz- zazione dell hardware e possono essere eseguite a una frequenza più elevata. L approccio di tradurre internamente alla Cpu le istruzioni Cisc in istruzioni Risc ha permesso all architettura x86 di resistere all avanzata dell architettura puramente Risc. Fino a questo momento abbiamo trattato il sottosistema memoria come un oggetto non ben definito, ma in realtà gioca un ruolo di primo piano nel funzionamento del processore. Sia lo stadio di accesso alle istruzioni che quello di accesso ai dati necessitano di appoggiarsi alla memoria. La ricerca di un ottimizzazione dell accesso alla memoria ha portato già nel 1940 al modello di accesso denominato Architettura Harvard; in questo schema di funzionamento la memoria viene suddivisa in due sezioni distinte: una per le istruzioni e una per i dati; in questo modo ogni stadio ha un accesso dedicato alla sua sezione. Per rendere più semplice ai programmatori la realizzazione del software, la maggior parte degli indirizzi sono indirizzi virtuali, che permettono di ottenere grandi blocchi lineari di memoria. Gli indirizzi virtuali vengono poi tradotti in indirizzi fisici riferiti alla effettiva memoria del computer. Nella quasi totalità dei chip x86, le memorie cache contengono dati di memoria che sono indirizzati con indirizzi fisici. Prima di accedere alla cache, gli indirizzi virtuali vengono tradotti all interno del TLB (Translation Look-aside Buffer). Il TLB è come un archivio degli indirizzi virtuali più recenti che corrispondono a indirizzi fisici, che a loro volta puntano alle effettive zone di memoria in cui sono contenute le informazioni. Se l indirizzo virtuale richiesto dalla Cpu non è presente nella tabella TLB, evento denominato un TLB mancato, allora la tabella deve essere aggiornata in base a una tabella più grande presente nella memoria centrale; l operazione di accesso alla memoria centrale comporta però un notevole rallentamento. Alcuni processori possiedono differenti livelli di TLB e di cache; la loro struttura sarà importante per valutare e confrontare i diversi core delle Cpu. > La Pipeline I cinque stadi possono essere processati completamente per una singola istruzione prima di affrontarne una nuova. La complessità delle Cpu inizia nel momento stesso in cui si cerca di superare questo limite. Invece di attendere che una singola istruzione abbia completato tutti e cinque gli stadi del nostro modello, è possibile inviare al primo stadio una nuova istruzione non appena la precedente sia passata al secondo stadio. Il meccanismo della pipeline è quello alla base di una catena di montaggio; ogni stadio della pipeline è paragonabile ad un segmento della catena di montaggio. Con questo nuovo approccio il processore del nostro schema base è capace di elaborare contemporaneamente cinque istruzioni, mantenendo pieni tutti e cinque gli stadi della pipeline. In questo modo la Cpu processa 318

cinque istruzioni in parallelo, riferendosi al parallelismo a livello di istruzione (ILP, Instruction Level Parallelism). Il microprocessore opera, in questo modo, cinque volte più velocemente. Ad ogni ciclo di clock una istruzione esce dalla pipeline; questo implica che la cache e tutto l insieme del sistema dovrebbero funzionare cinque volte più velocemente per non avere riduzioni delle prestazioni. L approccio adottato trascura in realtà molti aspetti e sottintende implicitamente alcune ipotesi: abbiamo infatti assunto che ogni stadio consuma lo stesso quantitativo di tempo per essere portato a termine e che l ordine delle istruzioni presenti nella pipeline sia esatto; niente vieta infatti che una delle istruzioni costituisca un salto di programma, ovvero una diramazione verso una parte differente del codice di esecuzione. Quelle che si intravedono sono situazioni denominate rischi di pipeline (pipeline hazard), e il loro effetto è uno stallo del processo di esecuzione. Esistono principalmente tre tipi di pericoli: il primo è un rischio sui dati che consiste nel cercare di usare dati ancora non disponibili, generalmente causato da una dipendenza di dati. Il secondo è un rischio sul controllo, generato dalla presenza nella pipeline di istruzioni che risiedono dopo una diramazione del codice. L ultimo è un rischio di struttura, ovvero un conflitto di risorse, che accade in presenza di una richiesta da parte di istruzioni differenti della stessa risorsa hardware (registri); un esempio potrebbe essere la necessità di utilizzare la stessa locazione di memoria per dati e istruzioni nello stesso momento. Esistono diversi accorgimenti per ridurre il rischio di stalli della pipeline; nella pratica, l attuale schema di funzionamento delle Cpu comporta l insorgere di questi stalli. Se un istruzione provoca questa situazione, l esecuzione di questa viene bloccata, mentre le istruzioni che si trovano negli stadi successivi procedono lungo la pipeline; quella che si crea è una sorta di bolla tra le istruzioni bloccate e quelle che procedono lungo la catena di montaggio. Quando l istruzione bloccata riprende il suo percorso, la bolla viene spinta lungo la fine della pipeline. Alcuni errori, come quelli di controllo dovuti a una errata predizione di diramazione, determinano la necessità di eliminare le successive istruzioni nella pipeline in quanto la loro esecuzione non è necessaria. Se l indirizzo della diramazione esatta non si trova nella cache delle istruzioni, allora la pipeline può stallare per molti cicli. Lo stallo viene esaltato dalla latenza per accedere alla cache di secondo livello (L2) o, peggio, alla memoria di sistema. Gli stalli dovuti alle diramazioni sono uno dei principali problemi, insieme ai tempi di accesso alla memoria, che affliggono le prestazioni dei processori. Per alcuni tipi di rischio sui dati, la soluzione comune- Istruzione 1 Istruzione 2 Istruzione 3 Istruzione 4 Istruzione 5 1 IF IF= instruction fetch (caricamento istruzione) ID= instruction decode (decodifica istruzione) EX= instruction decode (decodifica istruzione) 2 3 4 5 6 7 8 9 ID EX DA WB IF ID EX DA WB IF ID EX DA WB IF ID EX DA WB IF ID EX DA WB DA= data access (accesso ai dati) WB= write back (scrittura risultati) La struttura a pipeline consente di cominciare l'esecuzione di un'istruzione prima che quella precedente abbia terminato il proprio percorso, aumentando l'efficienza di esecuzione. mente utilizzata è quella di far avanzare il risultato di una istruzione direttamente a un altra istruzione presente nella pipeline (data forwarding o bypassing). L operazione risulta molto più rapida che scrivere il risultato nella cache e costringere l istruzione successiva a ricaricare i dati. Inoltre i dati caricati dalla memoria in un registro possono essere inviati direttamente alla Alu, senza passare per lo stadio di scrittura nella cache. Un istruzione nella fase di salvataggio dati può quindi inviare i risultati direttamente ad una istruzione che si trova nello stadio di esecuzione. La suddivisione in stadi permette di eseguire le istruzione più velocemente; l aumento degli stadi della pipeline comporta un maggiore rischio di stalli, ma consente di incrementare le frequenze di funzionamento. I processori x86 che analizzeremmo più avanti possiedono tutti pipeline con un numero di stadi superiore a cinque. La tecnica di suddividere l esecuzione in diverse fasi, originariamente denominata super-pipelining, prende il nome di hyper-pipelining nel caso del Pentium 4 di Intel. Anche se, come abbiamo accennato, i rischi nella pipeline divengono maggiori, il super-pipelining conferisce maggiore granularità alle istruzioni, con una conseguente riduzione delle situazioni in cui un istruzione veloce debba attendere che una lenta venga portata a termine. L impiego di alcune tecniche di ottimizzazione nei disegni dei circuiti consentono inoltre di gestire i rischi di pipeline e di portare le frequenze di funzionamento molto in alto. In definitiva il limite che si presenta all orizzonte è la velocità con cui i circuiti digitali riescono a trasferire le informazioni tra i diversi stadi. Per pilotare un operazione all interno della pipeline è necessario che ogni nuovo stadio raggiunto dall istruzione riceva le informazioni dallo stadio precedente, in quanto ogni stadio contiene informazioni differenti. Le informazioni di ogni stadio sono contenute in una memoria speciale generalmente chiamata latch. Con l aumentare degli stadi in cui viene suddivisa la pipeline e conseguentemente con la diminuzione del lavoro svolto da ogni singolo stadio, il tempo impiegato per trasferire man mano lungo la pipeline i dati attraverso i latch dei diversi stadi diventa una percentuale significativa dei cicli di clock. Con il tipo di struttura descritta fino ad ora ogni stadio può eseguire un singolo compito per ogni ciclo di clock. In un architettura di tipo superscalare ven- 320

gono aggiunte risorse hardware per permettere un parallelismo di esecuzione: un esempio è la presenza di due pipeline distinte. In una struttura multi-compito si introducono ulteriori possibilità di incappare in rischi sui dati, in quanto un operazione può dipendere da dati presenti nell altra pipeline; in queste situazioni il controllo e la gestione degli rischi di pipeline assume una rilevanza primaria. > Architettura superscalare contro super-pipelining Un approccio differente, che si posiziona a metà strada tra un sistema superscalare e uno di tipo super-pipelining, si realizza duplicando solo alcune porzioni della pipeline. La sezione dove poter impiegare la strategia superscalare è individuabile nell unità d esecuzione, poiché questa si trova ad operare tipicamente con tre tipi di dati: operazioni con interi, operazioni in virgola mobile e operazioni multimediali. L architettura superscalare permette quindi in teoria di eseguire contemporaneamente differenti operazioni proprio per la presenza di sufficiente hardware per evitare l avvenimento di rischi di struttura. In questo momento può sembrare tutto alquanto confuso, ma le idee si faranno più chiare quando verranno analizzate Cpu reali con esempi pratici. L obbiettivo era introdurre l idea di un architettura che sfrutta il disegno superscalare per realizzare combinazioni di pipeline che funzionano in contemporanea. Un esempio noto si riscontra con le istruzioni multimediali, dove si eseguono operazioni identiche in modo ripetitivo su differenti set di dati; per ottenere migliori prestazioni si potrebbe realizzare uno speciale disegno dei circuiti per rendere il processo più efficiente. Quello che ne risulta è la tecnica Single Instruction Multiple Data (Simd, singola istruzione con dati multipli). La capacità di eseguire più velocemente le istruzioni e di eseguirne anche più di una contemporaneamente implica uno stress per la memoria. Cerchiamo di comprendere meglio con un esempio: una singola istruzione che si muove lungo la pipeline può richiedere la lettura e la scrittura di più dati; la riproduzione di uno stream video implica alcune precise restrizioni temporali per ottenere un risultato fluido e gradevole. Il flusso di dati da elaborare deve quindi essere costante e corretto, così che ogni istruzione e dato si trovi al suo posto per non creare stalli alla pipeline. Questo è uno dei problemi attorno a cui ruotano i produttori, ovvero la realizzazione di processori capaci di eseguire il maggior numero di istruzioni in parallelo. Con i limiti imposti da set di istruzioni che risalgono agli anni 70. L attenzione dei progettisti è rivolta quindi ad ottimizzare al meglio principalmente due degli stadi prima descritti: il recupero dell istruzione (Instruction Fetch) e l accesso ai dati (Data Access); se non correttamente gestiti questi due stadi possono essere fonte di grossi cali di prestazioni. Uno dei problemi è dovuto al fatto che le pipeline dell ultima generazione di processori operano a frequenze nell ordine del GHz e il recupero dei dati nella memoria di sistema può richiedere più di cento cicli della pipeline. La chiave per risolvere il problema è assicurarsi che l istruzione o i dati richiesti siano presenti in un buffer che affianca la pipeline o al massimo in uno stadio superiore della cache, senza doverli recuperare dalla memoria centrale. > Il segreto è prevedere Se fosse possibile predire con una certezza del 100% quale diramazione seguirà l esecuzione del programma (sia in avanti sia indietro), sarebbe possibile accodare all istruzione di salto la corretta sequenza di istruzioni. Nella realtà questo non è possibile, ma l impiego di tecniche di predizione garantisce un marcato incremento delle prestazioni, soprattutto per le architetture con lunghe pipeline come quelle dei moderni processori. Come per le istruzioni, anche la predizione degli accessi ai dati in memoria consente di ridurre in modo drastico i rallentamenti nell esecuzione del programma. Poter riempire in anticipo un buffer con i dati che serviranno alle istruzioni evita di attendere il tempo aggiuntivo per l accesso alla memoria centrale. Particolari istruzioni inserite nel codice permettono di fare questo con l architettura x86. Dopo questa rassegna generale dei problemi connessi con la progettazione delle Cpu è giunto il momento di analizzare in modo più concreto alcune delle recenti innovazioni introdotte nel campo dei microprocessori. Per ottenere i migliori risultati i progettisti studiano e combinano tra loro diversi algoritmi di predizione. La casistica delle diramazioni comprende tre tipi di salti: > Salto condizionale in avanti: a causa di una condizione di esecuzione il PC (contatore di programma, program counter) viene modificato così da puntare a una istruzione che si trova avanti nel flusso delle istruzioni. Salto condizionale indietro: il PC viene modificato così da puntare a una istruzione che si trova nella parte antecedente del flusso di istruzioni. Salto incondizionato: include salti, richiami di procedure e ritorni senza che sia verificata una specifica condizione. > Predizione statica in base a salti statistici Questo metodo di predizione si basa su considerazioni statistiche: sono più frequenti i salti indietro dei salti in avanti, per la maggiore presenza di loop all interno del codice del programma. In base a questa considerazione l architettura può essere ottimizzata per analizzare in maniera ottimale la presenza di eventuali salti indietro non appena un istruzione viene decodificata. > Predizione di salto dinamica basata su una memoria dei salti (BHB, Branch History Buffer): 332

Un metodo più raffinato di quello statico consiste nel registrare in una memoria buffer un bit che indichi, per ogni istruzione di salto, se il salto è stato recentemente effettuato oppure no. Se il bit indica che il salto è stato effettuato di recente, allora la pipeline può portarsi avanti e prepararsi ad elaborare le istruzioni relative a quel salto. Nel caso in cui avvenga un errata predizione vi sarà di conseguenza la lettura e l immissione nella pipeline di istruzioni che non devono essere eseguite; in questo caso la pipeline dovrà essere svuotata e verrà corretto il bit all interno del BHB. In aggiunta a un BHB di larghe dimensioni, la maggior parte degli algoritmi di predizione utilizza un secondo buffer, BTB (Branch Target Buffer, tabella di puntamento dei salti), dove vengono archiviati gli indirizzi dei salti effettuati. Nella tabella vengono registrati gli indirizzi a cui puntano le istruzioni di salto eseguite di recente dal codice del programma. Questa tabella permette, quindi, alla Cpu di capire se una istruzione costituisce un salto e di iniziare a reperire gli indirizzi nei primi stadi della pipeline. Se l istruzione punta a uno degli indirizzi già presenti nel BTB allora viene identificata come un salto; viene quindi avviata la sua esecuzione nella pipeline con le istruzioni seguenti corrette. Questa tecnica è particolarmente efficace in quanto molti programmi utilizzano in ripetizione o con frequenza alcune routine; la Cpu riesce a recuperare gli indirizzi e le istruzioni da inserire nella pipeline in anticipo, così che le istruzioni corrette si trovino nella pipeline nel momento in cui vengono richiamate. Per ottimizzare ulteriormente l esecuzione del programma, il normale ordine di esecuzione delle istruzioni può essere riarrangiato. Per i processori della famiglia Risc questo tipo di procedimento è chiamato esecuzione speculativa o esecuzione fuori ordine ; Intel ha preferito chiamare in altro modo lo stesso tipo di procedimento, definendolo esecuzione dinamica. Sia AMD che Intel impiegano un architettura che, dopo aver decodificato le istruzioni di partenza in istruzioni del tipo Risc, riarrangia il normale ordine d esecuzione in base alla migliore disponibilità delle risorse. Una vola che l esecuzione dinamica, o fuori ordine, è stata completata i risultati vengono riordinati secondo l ordine iniziale. Uno dei problemi dell esecuzione speculativa è la possibilità che diverse istruzioni cerchino di utilizzare contemporaneamente gli stessi registri. È quindi necessario costruire una tabella RAT (Register Alias Table, tabella di reindirizzamento dei registri), che serve a rinominare e mappare gli otto registri x86 in un più ampio set di registri interni al processore. Una determinata istruzione può quindi caricare e salvare dati usando dei registri temporanei, mentre il RAT tiene traccia della corretta mappatura e corrispondenza dei registri virtuali con quelli reali. Una volta che le istruzioni sono state eseguite e riordinate i registri vengono riportati al loro stato corretto partendo dai registri temporanei. Quando un istruzione viene decodificata viene quindi permessa la sua esecuzione fuori ordine non appena i dati sono disponibili; uno speciale buffer di riordinamento (ROB, reorder buffer) tiene traccia dello stato di avanzamento dell istruzione, ovvero dei momenti in cui gli operandi divengono disponibili e del momento in cui l istruzione ha completato la sua esecuzione. Nel momento in cui un istruzione ha terminato la sua esecuzione può essere riordinata mentre il ROB viene ripulito. Nello stesso modo in cui le istruzioni vengono eseguite utilizzando un metodo speculativo è possibile anche accedere alla memoria per operazioni di lettura e scrittura dei dati in modo speculativo. La scrittura dei dati in memoria crea meno problemi della lettura; i dati in scrittura vengono ordinati in un buffer e mandati alla memoria. Per evitare i tempi di latenza dell accesso alla memoria centrale è invece molto interessante riuscire a predire quali sono i dati necessari alle istruzioni presenti nella pipeline. > Intel Pentium 4 Intel sta promuovendo vigorosamente il Pentium 4 come il futuro dei processori per i sistemi desktop; concentreremo quindi la nostra analisi dei processori Intel su questa architettura, riferendoci alla versione con core Willamette. > L architettura NetBurst I cambiamenti architetturali che si annidano sotto la dicitura NetBurst consistono in una pipeline più profonda di quelle attualmente diffuse, in una nuova architettura dei bus, maggiori risorse di esecuzione e cambiamenti al sottosistema della memoria. La pipeline del Pentium 4 consiste di 20 stadi, a differenza dei soli 10 stadi di cui dispone l architettura del Pentium III. Uno degli elementi interessanti della nuova architettura del Pentium 4 è la presenza di due stadi dedicati a instradare i dati all interno del chip. Intel ha dovuto lavorare specialmente per evitare che si verifichino stalli della pipeline; se una pipeline così profonda dovesse essere svuotata di frequente si avrebbe un rapido degrado delle prestazioni, pur disponendo di una frequenza di clock molto elevata. Eventuali stalli che necessitino il completo svuotamento della profonda pipeline del Pentium 4, comportano un notevole impatto sulle prestazioni. In questi casi i benefici di una pipeline profonda vengono persi e un disegno più semplice potrebbe risultare più performante. Il 323

vantaggio della pipeline a più stadi è di eseguire un minor lavoro ad ogni passo; in questo modo la lunghezza dei cicli può essere ridotta, consentendo così di aumentare la frequenza di clock e quindi la velocità di esecuzione. Di conseguenza una pipeline profonda necessita di funzionare a frequenze più alte per eseguire la stessa quantità di lavoro di una pipeline più corta funzionante ad una frequenza inferiore. L impiego di una pipeline profonda a molti stadi consente di avere in esecuzione più istruzioni nello stesso momento; questo consente, analizzando le istruzioni in esecuzione, di ricercare quelle che possono essere eseguite in parallelo. Il Pentium 4 è capace di mantenere 126 istruzioni in attesa, mentre attende che altre istruzioni completino il loro ciclo. Esiste un legame stretto tra la dimensione della cache e la velocità, principalmente per la necessità di pilotare un maggior numero di segnali nelle griglie Sram. Per il Pentium 4, Intel ha deciso di impiegare una cache di dimensioni molto ridotte per limitare la latenza durante gli accessi. Tuttavia, nel caso del Pentium 4, sono comunque necessari due cicli per un accesso alla cache, che salgono a 6 per la richiesta di un dato in virgola mobile. Scendendo lungo la gerarchia della cache troviamo la cache L2 della capacità di 256 KByte; questa dispone di una linea da 128 byte e di una associatività a 8 vie. Una struttura a 8 vie significa avere 8 set di marcatori, capaci di fornire la stessa efficienza di una struttura completamente associativa; questo rende più efficiente la cache da 256 KByte del Pentium 4 in quanto rende il rateo di accesso pari al 60% di quello di una cache mappata in modo diretto. Il rovescio della medaglia è che una cache con associatività a 8 vie risulta più lenta negli accessi. Intel afferma che il ritardo per la lettura di un dato è pari a sette cicli, ma la cache è in grado di trasferire nuovi dati ogni 2 cicli. È da ricordare che la cache L2 è condivisa tra la ricerca di istruzioni e dati in modo unificato. Una delle caratteristiche interessanti della cache L2 del Pentium 4 è l allargamento della linea dati a 128 Byte, ALU (double speed) Add/Sub logic Store data Branches Exec Port 0 Exec Port 1 FP Move FP/SSE Move FP/SSE Store FXCH ALU (double speed) Integer operation FP execute Add/Sub Shift/rotate FP/SSE -Add FP/SSE -Mul FP/SSE -Div MMX Il motore di esecuzione del Pentium 4. E' possibile eseguire un massimo di quattro operazioni sulle ALU per ciclo di clock (le due unità lavorano a doippia frequenza), in contemporanea a due operazioni di lettura e scrittura. Load port Memory Load All loads LEA SW prefetch Store port Memory Store Store Address a differenza dei canonici 32 Byte. Una linea più larga può incrementare gli hit raggiunti, ma richiede un tempo più lungo per essere riempita dal bus di sistema. Qui entra in gioco il nuovo bus del Pentium 4. Impiegando una frequenza base di 100 MHz e trasferendo dati quattro volte per ciclo, il bus a 64 bit riesce a trasferire 32 Byte ad ogni ciclo. Questo si traduce in una ampiezza di banda pari a 3,2 GByte al secondo. Per riempire una linea della cache L2 sono quindi necessari quattro cicli di clock, il medesimo numero necessario impiegando il bus a 32 Byte dell architettura P6. È interessante notare che il bus di sistema ha un protocollo di 64 Byte (corrispondente alla lunghezza di una linea della cache L1) e necessita di due richieste alla memoria centrale per riempire una linea della cache L2. Il bus veloce aiuta nel trasferimento dei dati dal Northbridge alla Cpu; tuttavia la maggiore dimensione del canale causa un ritardo prima che sia completato il riempimento del bus dalla memoria. Diventa essenziale un efficiente sistema di previsione e pre-caricamento, senza il quale il Pentium 4 risulterebbe poco performante in molte applicazioni. La cache L2 richiede automaticamente in anticipo le due linee successive (256 byte) alla locazione attualmente richiesta e in lettura. Questo tipo di ricerca in anticipo consente di mantenere e monitorare la storia delle mancate previsioni e di evitare letture anticipate errate. La logica del reperimento in anticipo via hardware consente di caricare i dati corretti in anticipo, con un marcato incremento delle prestazioni in molte applicazioni. Intel vanta nuovi algoritmi che consentono di incrementare la velocità di accesso agli 8 KByte della cache L1, con associatività a quattro vie. Il Pentium 4 processa le istruzioni di caricamento ricercando i dati sempre all interno della cache L1 e considerando il dato caricato come corretto, senza bruciare alcun ciclo extra per effettuare un controllo sull effettiva correttezza del dato cercato. L istruzione è inviata direttamente lungo la pipeline; se interviene un mancato successo della lettura del dato corretto, si assume che il dato corretto sia disponibile nell arco di due cicli. Una volta che viene scoperto il mancato successo dell istruzione, il dato corretto viene portato attraverso le gerarchie della memoria e l istruzione viene eseguita nuovamente. Non è effettivamente chiaro quanto sia efficiente questo tipo di approccio, in quanto il suo successo dipende dal tipo di struttura del software. Il disegno del Pentium 4 sembra studiato appositamente per effettuare operazioni su flussi di dati multimediali, questi algoritmi sono molto regolari e richiedono alte prestazioni. Se i dati non sono disponibili nella cache L1, un canale ampio 32 Byte, che collega la cache L1 a quella L2, consente di riempire ciascuna linea da 64 Byte consumando due cicli di clock. Il Pentium 4 può gestire contemporaneamente quattro differenti procedure susseguenti a mancati hit nella cache L1. Confidando nella capacità di predizione del Pentium 4, i progettisti hanno optato per una cache di primo livello 326

Struttura del K7 64 KByte cache istuzioni Tabella di previsione dei salti Codice x86 Decodificatori a tre vie Macro OPS di controllo istruzioni (72 voci) Operazioni RISC Ordinatore degli interi (15 voci) Ordinatore della Fpu (36 voci) esecuzione interi generaz. indirizzi esecuzione interi generaz. indirizzi esecuzione interi generaz. indirizzi Fpu Fpu MMX 3DNow Fpu MMX 3DNow Risultati Load/Store unit (44 voci) Risultati Interfaccia per il bus di sistema Bus di sistema 64 KByte cache per i dati SRAM L2 Controller cache 12 (con Tag) differente da quella classica. Invece di immagazzinare le istruzioni x86, la trace cache le contiene nel formato simile a quello Risc. Intel chiama questo tipo di istruzioni micro-ops e la trace cache consente di contenerne 6 per ogni linea. Per le istruzioni già decodificate sono già noti eventuali salti e il processore è in grado di recuperare le istruzioni che seguono ad essi. I salti condizionati sono le diramazioni più problematiche da gestire, in quanto non si può essere certi della direzione che verrà seguita nella diramazione. È quindi possibile che nella trace cache vengano decodificate parecchie istruzioni non necessarie. In questo caso è auspicabile che la trace cache contenga anche le informazioni relative all altra diramazione, altrimenti i dati relativi a questa devono essere recuperati dalla cache L2 o addirittura dalla memoria di sistema. Se il sistema di predizione lavora in modo corretto, la trace cache fornisce al pianificatore d esecuzione tre micro-ops ad ogni ciclo di clock. Il decodificatore è capace di tradurre una singola istruzione x86 ad ogni ciclo di clock, meno di quanto sono capaci di fare altre architetture. Tuttavia, poiché le micro-ops sono conservate e riutilizzate all interno della trace cache, il flusso di tre micro-ops per ciclo dovrebbe essere garantito. Se un istruzione x86 richiede più di quattro micro-ops, allora l istruzione viene decodificata attraverso una ROM che contiene le informazioni sulle micro-ops corrispondenti. Tutte le architetture dei processori x86 utilizzano una sorta di ROM per le istruzioni poco utilizzate o per quelle particolarmente lunghe. Il processore deve poi organizzare la distribuzione del lavoro su sette differenti unità Schema logico di un Athlon. Le istruzioni organizzate in MacroOP possono venire immagazinate e esguite non appena possibile dalle unit sugli interi, mentre le unit in virgola mobile possono processare fino a tre istruzioni contemporanee parallele. Le performance del motore di esecuzione dipendono dal particolare tipo di programma in esecuzione. Se sono presenti solo operazioni per la ALU e in contemporanea operazioni di lettura e scrittura, allora è possibile l esecuzione di 6 micro-ops per ciclo (quattro operazioni sulle ALU, poiché queste sono capaci di due operazioni per clock). Il buffer di riordinamento può lavorare tre micro-ops ogni ciclo, così da pareggiare le micro-ops fornite dal decodificatore. Una delle chiavi per evitare cali nelle prestazioni è quella di evitare gli sbagli di predizione dei salti. Quando un istruzione viene rilasciata dal ROB, l indirizzo del salto viene utilizzato per aggiornare il BTB e il BHB. Intel ha accomunato il BTB e il BHB in un unico buffer, denominato comunque BTB. > Supporto alle istruzioni multimediali Il Pentium 4 supporta le estensioni Mmx e Sse al codice x86; inoltre aggiunge a queste altre 144 nuove istruzioni raccolte sotto il nome Sse2. > Conclusioni riguardo il Pentium 4 Il disegno del Pentium 4 è stato studiato per scalare verso l alto le frequenze di funzionamento; non è infatti un caso che attualmente il processore Intel sia l unico ad aver raggiunto i 2 GHz. A causa della sua particolare architettura, molto sensibile ai cache miss, ovvero alle situazioni in cui il dato richiesto non sia presente nella cache, diventa un operazione critica aumentare la memoria cache e quindi i tempi di latenza per la sua lettura. L aumento della frequenza di funzionamento associato ad una corretta compilazione del codice rende 328

questo microprocessore molto competitivo, soprattutto in previsione del rilascio del core Northwood, realizzato con tecnologia a 0,13 micron, dotato di un quantitativo maggiore di cache e capace di salire in frequenza. > AMD Athlon L architettura del processore Athlon è più simile alla nostra prima analisi di macchine con esecuzione speculativa e fuori ordine. La complessità e lo sforzo necessario per realizzare un architettura ottimizzata ed efficiente per l esecuzione di istruzioni fuori ordine può essere vanificata se non sono disponibili le risorse per l esecuzione parallela delle istruzioni. Questo è uno dei punti di forza dell architettura dell Athlon, che può eseguire simultaneamente 9 istruzioni di tipo Risc (denominate OP da AMD). La scelta di AMD è stata di implementare una cache L1, di primo livello, di grosse dimensioni. I 64 KByte della L1, con associatività a due vie, sono suddivisi in eguale maniera per le istruzioni e per i dati. La sezione L1 delle istruzioni ha un canale da 64 byte con 64 byte sequenziali di pre-fetch. La parte di L1 destinata ai dati fornisce una seconda porta di accesso per evitare l insorgere di rischi di struttura generati da un disegno superscalare. La cache L2 è di 256 KByte unificati con associatività a 16 vie ed è supportata dal veloce bus EV6. Nell ultima incarnazione del core Palomino, supporta anche il prefetching. Per trattare la complessità del set di istruzioni x86, il processore AMD effettua una decodifica parziale delle istruzioni non appena queste vengono trasferite nella cache L1. Alcuni bit extra posti all inizio e alla fine delle istruzioni di lunghezza variabile permettono una migliore e più rapida identificazione da parte delle unità di previsione (pre-fetcher e predictor). La pipeline dell Athlon assomiglia molto al flusso descritto per il nostro modello base di computer. I processi di accesso alle istruzioni e di decodifica di queste sono divisi in 6 stadi della pipeline. AMD utilizza un set di istruzioni a lunghezza fissa dette MacroOP, contenenti una o più OP. L organizzatore di istruzioni scomporrà le MacroOP in OP non appena venga raggiunto lo stadio di esecuzione. Il DirectPath Decoder (decodificatore a percorso diretto) genera MacroOP che consistono di una o due OP. Il VectorPath Decoder elabora istruzioni più lunghe direttamente dalla ROM. L Athlon è capace di instradare tre MacroOP ogni ciclo verso il decodificatore di istruzioni (IDEC stage); queste vengono poi inviate all organizzatore per un totale di sei OP decodificate ad ogni ciclo. > Interi L organizzatore delle operazioni riesce a bufferizzare 18 MacroOP che poi vengono instradate come OP alle unità di esecuzione sugli interi. Il buffer funge da stazione in cui le istruzioni sugli interi attendono anche che divengano disponibili i dati su cui devono operare. > Accesso alle istruzioni La lettura e scrittura dei dati impiega le unità di generazione degli indirizzi per calcolare l indirizzo effettivo e accedere alla cache. La cache risponde con un segnale di successo o di mancato successo; tuttavia se un altra istruzione sta aspettando il dato presente nella locazione di cache letta, il dato stesso viene inviato all istruzione che lo attende. > Istruzioni in virgola mobile e la loro pipeline L Athlon può processare contemporaneamente tre tipi di istruzioni in virgola mobile (FADD, FMUL e FSTORE); l unità di calcolo in virgola mobile è realizzata con una struttura a pipeline, così che l unità può cominciare a processare una nuova istruzione mentre un altra è ancora in esecuzione. Le istruzioni MMX e 3DNow! possono essere eseguite nelle pipeline FADD e FMUL. L unità in virgola mobile può inoltre eseguire istruzioni fuori ordine e ognuna delle tre pipeline dispone di più unità di esecuzione. La particolare architettura dell unità in virgola mobile dell Athlon ha permesso a questa Cpu di superare sia processori Pentium III che Pentium 4 in alcuni test. Tuttavia bisogna anche ricordare che la mancanza di sufficiente software ottimizzato per le istruzioni SSE-2 del Pentium 4 non ha permesso di valutare appieno quale sia il guadagno ottenibile con queste istruzioni. L Athlon dispone di un BTB con 2.048 ingressi che immagazzina gli indirizzi di salto previsti con successo. Il BTB lavora in coppia con un GHT (Global History Table) per prevedere i salti. Se la predizione avviene con successo allora c è un ciclo di ritardo per indirizzare il Fetcher verso la nuova istruzione; se la predizione non va a buon fine allora intercorrono almeno 10 cicli di ritardo. È da notare che la particolare architettura del Pentium 4 consente di eliminare completamente i cicli di ritardo nel caso la predizione sia portata a termine con successo. > Conclusioni sull Athlon Quello che emerge dall analisi è che l architettura dell Athlon con core Thunderbird è più tradizionale di quella introdotta da Intel con il Pentium 4 e risulta più vicina allo schema base di un sistema per l esecuzione di istruzioni fuori ordine, presentando una pipeline con meno stadi di quelli del Pentium 4. Attualmente l Athlon mostra prestazioni superiori al Pentium 4 in molte applicazioni; un paragone migliore potrà essere fatto solo quando saranno presenti software ottimizzati anche per le istruzioni SSE-2. Allo stato attuale il Pentium 4 è favorito con applicazioni che richiedono una notevole banda verso la memoria; rimangono comunque ampi margini di miglioramento del software per ottimizzare la sua esecuzione sulle differenti architetture. 330