Architettura AMD K10
immagine descrittiva del die di un AMD Phenom II X6
• lo
scheduler è ora in virgola mobile a 36 vie, ampio di 128bit;
• è stato raggiunto il raddoppio del bandwidth della
instruction fetch, portato a 32 bytes per ciclo di clock;
• esiste ora il supporto integrato delle SSE dual 128bit, e contestualmente molte di queste istruzioni, così come anche la
CALL e la
RET (quelle usate in maniera più frequente), sono state declassate insieme ad altre istruzioni su interi;
• molte istruzioni, anche di tipo intero, sono state spostate dal
vector path al
direct path;
• si è giunti ad una maggiore ottimizzazione in scenari di utilizzo in cui ci si venga a trovare in presenza di ripetute istruzioni di spostamento di dati (
move);
• l'unità di branch prediction (
Branch Prediction Unit) è stata completamente ridisegnata, giungendo anche all''espansione delle altre unità di branch prediction;
• è stato sviluppato un
Super Forwarding per alcune operazioni floating point e load da memoria;
• non esistono più limitazioni di esecuzione per alcune istruzioni floating point: nel K8 alcune di queste potevano essere eseguite solo su pipeline specifiche (
FADD, FMUL, FSTOR), ora alcune istruzioni sono invece state modificate in modo da poter usare due o qualsiasi pipeline;
• l'unità
Sideband Stack Optimizer ha sganciato le unità intere (
integer units) dall'esecuzione di operazioni
push/pop nello stack;
• anche il
return stack è stato ampliato;
• i
prefetcher sono stati opportunamente modificati, potendo ora rifornire in maniera diretta i dati alla cache L1;
• le cache L1 ed L2 hanno un ponte connettivo di 2 bus indipendenti da 128bit ciascuno
• il memory controller può configurarsi sia in modalità single a 128bit o dual a 64bit, specificamente sviluppato e ottimizzato per sfruttare la presenza di cpu multi-core;
• è stato aggiunto un efficiente prefetcher di memoria, integrato nel memory controller;
• è stato sviluppato e portato a termine un maggiormente efficiente bus HyperTransport di nuova generazione (
rev3.0);
• il controller di memoria e la cache L3 condividono funzionalmente il medesimo PLL, a sua volta completamente indipendente e sganciato dal generatore di clock della cpu: avrà ora modo di poter ridurre il divisore e/o modificare la relativa tensione di alimentazione in maniera scorrelata dal quelli della cpu;
• la gestione del risparmio energetico è stata completamente riveduta e ha raggiunto un livello estremamente avanzato e sofisticato, con la possibilità di utilizzo di modalità indipendenti;
• la tecnologia di virtualizzazione AMD-V® (
AMD Virtualization) è stata ulteriormente perfezionata, risultando ora sviluppata in tutte le sue componenti, pressoché completamente in hardware;
• sono stati ingegnerizzati dei nuovi TLB (
Translation Look-aside Buffer) per poter gestire pagine sino a 1GB, utilizzabili soprattutto in previsione delle nuove features della tecnologia AMD-V®, quindi in presenza di ambienti virtualizzati.
fonte AMD
fonte AMD
Flusso elaborativo delle istruzioni
Tutte le istruzioni del programma in esecuzione vengono dapprima caricate nella cache L1, e non appena questo si verifica viene effettuata una iniziale operazione di pre-decodifica (ciò si rende necessario per poterne determinare la lunghezza); a questo punto possono essere previsti gli indirizzi di destinazione per tutte le istruzioni di salto caricate. Risulta ora possibile memorizzare correttamente i dati attuali nella cache L1, insieme ai dati di pre-decodifica e a quelli di salto appena elaborati.
Dalla L1 tutte le istruzioni precedenti vengono quindi caricate, in blocchi da 32 byte, nell'unità di fetch-decode dove, a seconda del tipo di istruzione, sono singolarmente spedite nel decoder
Direct Path o in quello
Vector Path, e in questi vengono tutte opportunamente decodificate in macro-operazioni (
macro-ops). In questo particolare passaggio viene effettuata una importante suddivisione delle istruzioni ricevute: quelle di semplice e media complessità sono passate all'unità di decodifica Direct Path, dove ognuna di esse viene tradotta in una o al massimo due macro-operazioni. Il Vector Path decoder, invece, si incarica di ricevere le istruzioni maggiormente complesse, ed è deputato alla loro decodifica, che porta a ridurle in una o più macro-operazioni.
Fermandoci un attimo a valutare a questo punto l'aspetto delle performance, abbiamo da fare due valutazioni: la prima positiva è che entrambi i decoder sono capaci di decodificare le istruzioni in ragione di tre macro-ops per ciclo di clock, la seconda negativa che i decoder non hanno la possibilità di lavorare in parallelo, in quanto uno solo di essi è in grado di operare nel medesimo intervallo di tempo.
Tornando al flusso operativo, le macro-ops, ormai tutte decodificate, vengono inviate all'unità di controllo delle istruzioni (ICU -
Instruction Control Unit) e lì conservate in 72 contenitori di riordino di macro-ops (
re-order buffer). L'ICU, a questo punto, può inviare il contenuto dei buffer allo scheduler degli interi e a quello in virgola mobile. Entrambi gli scheduler hanno la possibilità di lavorare in modalità indipendente l'uno dall'altro, e lo fanno suddividendo dapprima le macro-ops in micro-operazioni più semplici (
micro-ops), e dopo passandole rispettivamente all'unità di esecuzione degli interi (IEU -
Integer Execution Unit) e all'unità in virgola mobile (FPU -
Floating Point Unit).
L'unità di esecuzione degli interi IEU è costituita da tre unità aritmetico-logiche (ALU -
Arithmetic Logic Unit) e da ulteriori tre unità di generazione degli indirizzi (AGU -
Address Generation Unit). Ognuna delle ALU/AGU è singolarmente in grado, a propria volta, di eseguire una micro-op per ciclo di clock: è facile quindi arrivare a stabilire come il throughput totale dell'unità degli interi è di 6 micro-ops per ciclo di clock.
Ogni ALU è, da par suo, in grado di gestire la maggior parte delle micro-operazioni, con sole due eccezioni: tutte le micro-ops di moltiplicazione di interi sono sempre schedulate dall'unità 0, mentre le nuove istruzioni
LZCNT e
POPCNT sono sempre appannaggio dell'unità 2.
Lo scheduler FPU, invece, rifornisce l'unità di esecuzione floating-point che può arrivare ad eseguire fino a tre istruzioni x87, MMX, 3DNow!, SSE, SSE2, SSE3 e SSE4A per ciclo. L'unità di esecuzione FP contiene tre pipes (
FADD, FMUL e FSTOR); ognuna di queste pipe ha a disposizione un buffer di 12 macro-ops,ed è in grado di gestire solo alcuni tipi di istruzioni:
•
FADD, in grado di gestire addizioni, sottrazioni, confronto, operazioni logiche e alcune istruzioni mov di dati MMX;
•
FMUL, gestisce moltiplicazioni, divisioni, operazioni logiche e alcune istruzioni mov sui dati MMX;
•
FSTOR, nella possibilità di operare sulle istruzioni di conversione, memorizzazione, carico e spostamento dei dati.
Siamo giunti ora alla fase finale, e lo stato di esecuzione delle micro-ops, sia degli interi che in virgola mobile, è correttamente inviato alla ICU, cosicché quando tutte le micro-ops in sospeso per una determinata macro-op sono state portate a termine, quella particolare macro-op viene definitivamente rimossa dal contenitore di riordino (
re-order buffer).
A questo proposito è utile far presente l'adozione di una nuova unità SSO (
Sideband Stack Optimizer) deputata a tener traccia di tutte quelle istruzioni che referenziano dei puntatori sullo stack, come ad esempio le istruzioni
POP, LEAVE, PUSH e altre: in pratica l'unità SSO, supponendo che non esista alcuna dipendenza tra queste, è in grado di eseguire in parallelo più di una di tali istruzioni.
Principali novità architetturali
Nuovo scheduler a 128bit
AMD ha deciso progettualmente di lasciare immutato il numero di entrate (
entry) dello schedulatore (
scheduler), che rimane sempre del tipo a 36 entry come quello utilizzato nelle cpu di classe K8, ma ha correttamente provveduto al raddoppio della banda di entrata dello stesso per le operazioni in virgola mobile, con una ampiezza passata da 64bit a 128bit.
Nuovo algoritmo di Branch Prediction
La predizione dei salti è il mezzo tradizionale tramite il quale i processori aumentano le prestazioni delle sezioni di codice ramificati. Potendo effettuare una ipotesi anticipata su quale ramo del codice sarà di importanza rilevante per una sessione di esecuzione individuale, la cpu sarà in grado di eseguire in anticipo tale salto avendo così, qualora se ne rendesse necessario, il relativo output già a portata di mano.
Migliore sarà l'algoritmo di predizione, migliore saranno le prestazioni, ma dal momento che il processore dovrà scartare l'uscita di rami eseguiti inutilmente e ritornare ad eseguire il ramo corretto, i benefici di predizione dei salti saranno azzerati e superati dai deficit della cosiddetta '
branch mis-prediction': in questo caso, infatti, il gran numero di diramazioni nella gestione del codice potrebbe portare a dei
salti mal-predetti, che potranno ridurre le prestazioni a livelli inaccettabilmente bassi.
Da questo punto di vista, che costituisce un elemento davvero importante al fine di ottenere un incremento prestazionale, AMD può ora disporre con l´architettura K10 di un apposito algoritmo in grado di far uso, ora, di un appropriato buffer (BTB -
Branch Target address Buffer) in grado di contenere 2048 indirizzi di predizione, e soprattutto di una tabella di predizione indiretta degli indirizzi (
Indirect Address Prediction Table), composta da ben 512 elementi. Questa evoluzione ha dato di conseguenza la possibilità, efficiente tramite un ottimo algoritmo, di mutare in modalità dinamica gli indirizzi dei salti indiretti basati sui puntatori (
pointers): a titolo di paragone, nell´architettura K8 questo meccanismo era davvero poco efficiente in quanto era reso possibile far uso di una tabella composta da soli 8 elementi.
Nell'ottica di una migliorata efficienza, in questa nuova struttura sono stati apportati altri significativi ampliamenti: risultano ampliati i registri globali deputati all'immagazzinamento della cronologia dei salti, passati da 8bit a 12bit, così come la tabella del GHBC (
Global History Bimodal Counter) che ora può contenere 16384 contatori a 2bit, e per finire è stata modificata, portandola al raddoppio, anche la tabella della coda degli indirizzi di ritorno (
Return Address Stack Table), ampliata da 12 a ben 24 posizioni.
Tutto questo, in vista di maggiori performance finali, dovrebbe soprattutto portare i processori basati su questa nuova architettura nelle condizioni di portare a temine più velocemente soprattutto l'esecuzione dei programmi scritti con linguaggi di alto livello, che rappresentano oramai la stragrande maggioranza di quelli in circolazione: tale obiettivo, purtroppo, era stato perso di vista e non appieno centrato attraverso i risultati ottenuti con la generazione precedente dei K8.
fonte Guru3D.com
Il semplice benchmark sugli interi
Queens si concentra sulla capacità di prevedere il ramo di salto e le penalità dovute ad erronei mis-prediction da parte della cpu. In pratica permette di trovare le soluzioni al classico "problema delle Regine", su una scacchiera bi-dimensionale 10 * 10. Teoricamente, alla medesima velocità di clock il processore con pipeline più corta e algoritmo di
branch prediction più efficiente, capace quindi di apportare un minor numero di sanzioni dovute a
mis-prediction, dovrebbe raggiungere punteggi di riferimento più alti, quindi migliori. La tabella mostra i risultati della bontà della struttura di branch prediction e dell'algoritmo di salto integrati nell'architettura K10 a 6 core 4 e 2 core.
Instructions Fetch e SSE a 128bit
La tecnologia SSE di Intel, fornisce otto registri general-purpose a 128-bit, ognuno dei quali può essere indirizzato direttamente utilizzando i nomi di registro da XMM0 a XMM7. Ogni registro si compone di quattro unità in singola precisione a 32bit e numeri in virgola mobile, numerati da 0 a 3. I registri MMX sono mappati sui registri a virgola mobile, e richiedono l'istruzione EMMS per passare dal codice MMX al codice x87 in virgola mobile. Dal momento che i registri SIMD a virgola mobile sono un file di registro separato, le istruzioni MMX a virgola mobile possono essere utilizzate insieme ad istruzioni SSE, senza l'esecuzione di un'istruzione speciale come EMMS. D'altro canto, hanno bisogno del supporto da parte del sistema operativo, dal momento che devono essere salvati quando si effettua uno switch tra i vari task.
Un registro di controllo di stato
MXCSR, viene utilizzato per mascherare o smascherare la manipolazione delle eccezioni numeriche, impostare le modalità di arrotondamento, per impostare la modalità
flush-to-zero, e visualizzare i flags di stato.
Le istruzioni SSE operano in parallelo su tutte le coppie di operandi di dati pacchettizzati, o su quelle meno significative, significando che le istruzioni pacchettizzate (con suffisso PS) operano su una coppia di operandi, mentre le istruzioni scalari (con suffisso SS), operano da sempre sulla coppia meno significativa dei due operandi, mentre per le operazioni scalari i tre componenti superiori sono passati dal primo operando direttamente a destinazione.
AMD è dovuta correre ai ripari nei confronti di uno dei principali svantaggi rispetto alle cpu di classe Core 2 dell'antagonista Intel, decidendo così di inserire all'interno del nuovo core di architettura K10 anche il supporto SSE a 128bit e portando, in stretta analogia, anche al raddoppio dei valori di tutti i principali elementi ad esso collegati.
Se con i processori della famiglia K8, con unità di esecuzione (execution units) ampie 64bit, AMD poteva eseguire due operazioni SSE per ciclo di clock, con K10 è in grado ora di portare sempre ad esecuzione due operazioni SSE per ciclo di clock, ma tramite una sola unità di esecuzione a 128bit. Una unità di esecuzione del K10 necessita ora di un solo ciclo di clock per portare a termine l'operazione, mentre in K8, durante lo stadio di decodifica della pipeline, si rendeva necessario dividere l'istruzione come se fosse stata composta da due distinte operazioni da 64bit ciascuna. In pratica, quando una istruzione SSE a 128bit (tra le più esose in termini di peso) era caricata in una cpu di classe K8, apportava inevitabilmente delle latenze supplementari in quanto doveva essere obbligatoriamente tradotta in due micro-operazioni (
micro-ops), rappresentanti in buona sostanza le più piccole azioni eseguite dalla cpu come risultato di una istruzione.
fonte AMD
Gli effetti di una evoluzione di questo tipo ha condotto il K10 ad avvantaggiarsi rispetto al passato con una percentuale a doppia cifra: ad esempio nell'ambito delle moltiplicazioni matriciali (operazioni matematiche binarie in cui data una coppia di matrici ne viene prodotta una terza, concordante con il risultato di composizione delle trasformazioni lineari) il K10 è riuscito ad avvantaggiarsi con un incremento dell'85%, mentre ha permesso di migliorare tra il 10% e il 50% le prestazioni del resto delle applicazioni matematiche ad alta intensità. Questa percentuale risulta variabile a seconda dell'insieme delle istruzioni utilizzate, dando modo in pratica di migliorare nettamente le performance al momento di elaborare software, soprattutto quello vettorizzato di tipo multimediale.
L'aver introdotto una unità di esecuzione SSE di tale ampiezza ha di conseguenza, e logicamente, spinto AMD a raddoppiare sia il bandwidth delle
instructions fetch, passato da 16bit a 32bit per ciclo di clock, che il bandwidth del data cache, raddoppiato da 2x64bit a 2x128bit
loads per ciclo di clock. Per poter fornire in tempo i dati alle unità di esecuzione senza che queste debbano inutilmente attendere, sprecando cicli di clock, gli ingegneri AMD hanno preferito portare anche ad un raddoppio dell'ampiezza del bandwidth di collegamento tra la cache L2 e il North Bridge, passando dai 64bit dell'architettura K8 ai 128bit di quella K10.
E' stato utilmente raddoppiato anche il bandwidth tra la cache L1 per i dati e i registri SSE, passando da 2 load a 64bit per ciclo di clock a 2 load a 128bit, sempre per ciclo di clock; questo ha permesso di trasferire dalla memoria, in ogni situazione, 128bit per ogni ciclo di clock, e di riuscire così a saturare completamente la banda a disposizione, sfruttando appieno tutti i bus ora raddoppiati, sino a giungere definitivamente alle relative unità di esecuzione. Ovviamente a tale scopo si è reso necessario raddoppiare anche il bandwidth tra cache L1 e L2, così da non creare un inevitabile collo di bottiglia al trasferimento dei dati inviati direttamente all'indirizzo delle unità di esecuzione.
Si evince, quindi, come AMD con K10 abbia voluto da un lato attivarsi per portare al raddoppio della potenza elaborativa delle unità di esecuzione SSE da 128bit, e dall'altro fare in modo che i dati possano transitare dalla memoria alle cache e da queste alle unità di esecuzione creando tutti i presupposti per cui i 128bit di ampiezza vengano sempre e completamente sfruttati in maniera efficiente.
Nuovo Bus HyperTransport v3.0
HyperTransport™ (HT) è una tecnologia sviluppata da AMD sulla base del progetto del Consorzio omonimo, e che consiste nell'utilizzo di un collegamento LVDS (
Low Voltage Differential Signal) di tipo
Double Pumped ad alta velocità, stabilito con una connessione diretta punto-punto (
point to point), appositamente prevista per le interconnessioni tra i circuiti principali sulla scheda madre: tale collegamento è in grado di mettere in comunicazione la cpu sia con le periferiche o i dispositivi di I/O, sia con altre cpu nei sistemi multi-processori. Prima del K10 l'ampiezza del bus HyperTransport™ 1.0 poteva variare tra 4, 8, 16 e 32 bit per una larghezza di banda complessiva di 12.8GB/s. Per fare un esempio, L'Athlon™ 64 sk754 presentava l'Hyper Transport™ a 4x (800mhz), mentre L'Athlon™ 64 sk939/AM2 e l'Opteron™ sk 940/1207 hanno il bus HyperTransport™ impostato ad un moltiplicatore 5x (1Ghz).
fonte AMD
L'HyperTransport™ 3.0 introduce significative novità da un lato volte a migliorare le prestazioni velocistiche complessive, dall'altro ad aprire uno spazio ad utilizzi ancora più complessi di quanto non fosse stato fatto finora. Le nuove specifiche 3.0 prevedono infatti un significativo incremento nella frequenza di clock, passata dagli 1,4GHz della versione 2.0 agli attuali 2,6GHz, di conseguenza, il bandwidth massimo teorico passa ora dai precedenti 11.2 GB/s agli attuali 20.8GB/s per ciascun link a 16bit, ottenibili introducendo anche un nuovo connettore denominato HTX (
HyperTransport Expansion Slot). Nelle cpu Opteron, i dati sono inviati in pacchetti^9 a 16bit, e il picco aggregato di bandwidth per una delle cpu è di 3 links x 2 direzioni x 4.8 GT/s x 2 bytes/transfer, quindi si ottengono 57.6 GB/s.
Sviluppato originariamente dall'omonimo consorzio HyperTransport™, permette di installare schede di espansione che risultino in via definitiva direttamente collegate alla cpu: si può infatti pensare a questo come ad un nuovo bus, alternativo a quello PCI-Express ad esempio. Le differenze tra le due tipologie di comunicazione appaiono sulla carta sostanziali, in quanto HTX permette una comunicazione diretta tra periferica associata e cpu, senza dover necessariamente passare attraverso un controller o un hub collegato a propria volta sulla scheda madre che divenga a propria volta responsabile, sia con le proprie relative frequenze operative interne che soprattutto con i circuiti di controllo, di generare in maniera sensibile un impatto sostanzialmente negativo sulle latenze globali del meccanismo circuitale.
fonte AMD
Altra caratteristica estremamente importante è la possibilità di collegare una serie di macchine server in cluster tra loro, semplicemente utilizzando una connessione HyperTransport™, che promette in questo caso di mantenere un collegamento diretto tra i processori, dei diversi server, pur senza dover adottare un sistema di connessione che sia in grado di gestire, alla fine, la trasmissione dei dati tra le diverse macchine, come ad esempio Infiniband. Per poterne apprezzare le particolari caratteristiche in merito alla effettiva lunghezza del canale trasmissivo, il segnale HT ha la possibilità di essere trasmesso senza alcun tipo di perdita di efficienza del segnale, per lunghezze che possono arrivare anche da 1 metro, e soprattutto integrato in hardware il Retry, che permette la verifica dei pacchetti corrotti e di operarne una nuova trasmissione.
Considerato che le cpu K10 integrano al proprio interno sino a quattro indipendenti link Hypertransport™ 3.0 a 16bit, contro i tre link 1.0 presenti nelle cpu K8, esiste ora la possibilità, tramite una tecnologia denominata
Link Splitting, che questa evoluzione porti a conferire una superiore flessibilità in ambito server utilizzando cpu Opteron™: ognuno dei suddetti quattro link a 16bit può, a propria volta ed in modo trasparente, essere configurato in due link a 8bit: ciò permetterà globalmente a ogni cpu di gestire fino a otto link indipendenti da 8bit ciascuno, utili per configurare sistemi server con un massimo di otto socket, corrispondenti a 32 processori fisici (con cpu quad core).
Controller di memoria integrato in die
Il controller di memoria delle cpu K10, integrato all'interno del core, può supportare sia le memorie di tipo DDR2 che DDR3, e ha subito una serie di ottimizzazioni: la più significativa di queste è che i dati da scrivere in memoria non vi vengono inviati immediatamente, ma siano dapprima appoggiati ad un buffer appositamente implementato all'interno dello stesso controller. Solo una volta che il buffer raggiunge quantitativamente una determinata soglia, i dati verranno tutti insieme inviati alla memoria e, soprattutto, si avvantaggeranno di una scrittura in modalità sequenziale.
fonte AMD
AMD, inoltre, ha introdotto sensibili miglioramenti laddove ha permesso di non dover necessariamente svuotare in modo completo la cache L3 da quei dati di prefetch non utili ai core per le eventuali elaborazioni, mentre sarà proprio il buffer integrato nel controller a memorizzare i dati di prefetch e a venir svuotato e ricaricato di dati qualora le elaborazioni successive abbiano rivelato dei miss. Alla base di questo approccio può essere valutata la volontà di evitare di passare da letture a scritture alla memoria, e viceversa, in quanto tali passaggi implicano necessariamente delle penalizzazioni prestazionali. Tramite questo buffer, invece, buona parte delle scritture verso la memoria verranno eseguite sequenzialmente, riducendone significativamente il numero di passaggi.
Dal punto di vista architetturale, il controller presenta pur sempre un'ampiezza di 128bit, come per il K8, ma a differenza di questo è composto di fatto da due singoli controller a 64bit, caratteristica che dovrebbe permettere di ottenere benefici dal punto di vista prestazionale, soprattutto nelle versioni quad-core delle cpu, e a maggior flessibilità ogni controller è messo nella condizione di poter operare anche in modalità indipendente dall'altro, qualora questo sia effettivamente richiesto.
L'indirizzabilità della memoria fisica è stata ampliata a 48bit, (42bit nelle cpu K8), e questo permette di gestire fino ad un massimo di 256TB di memoria.
Disegno di una nuova Cache di 3° livello
Il K10, in aggiunta alle cache di 1° livello (512KB) e 2° livello (2MB) dedicate alla totalità dei core, presenta integrata nella propria architettura anche una novità, consistente nella cache di 3° livello che viene invece utilizzata in modalità condivisa (
shared)fra tutti i core: il quantitativo proposto è stato inizialmente fissato a 2MB per le cpu a 65nm e successivamente (nel novembre 2008) a 4MB/6MB per quelle a 45nm, mentre l'avanzata soluzione tecnica utilizzata per gestire il controllo del comportamento dei tre livelli di cache viene definita da AMD come
Balanced Smart Cache.
Entrambe le cache, sia la L1 corrispondente a 128KB per ciascun core (divisi egualmente tra dati e istruzioni), che la L2 della dimensione di 512KB per ciascun core, appaiono di tipologia di accesso esclusivo, caratteristica già presente nelle versioni precedenti delle cpu sia Athlon™ 64 che Opteron™: questo particolare comporta il fatto che i dati contenuti nella cache L1 ed L2 non possano divenire vicendevolmente replicabili tra i diversi core, relegandoli esclusivamente al core di pertinenza, e giunge a rappresentare un vantaggio, o uno svantaggio, strettamente legato al tipo di operazioni e di utilizzo dell'applicazione che ne fa uso.
Per quanto riguarda la struttura utilizzata nei tre livelli, la cache L1, continuando a mantenere l'impostazione di quella già utilizzata nei processori K8, è a due vie di tipo associativo e presenta ora una latenza corrispondente a 3 cicli. La cache L2 è ugualmente di tipologia associativa ma ampliata sino a sedici vie con una latenza di 9 cicli, mentre per la nuova cache di 3° livello, infine, questa si presenta invece condivisa fra tutti i core, e di conseguenza AMD ha scelto una struttura associativa ma decisamente molto allungata, a 32 vie, e presenta una latenza di circa 45 cicli.
La novità principale presentata nella cache L3 del K10 sta nell'introduzione di una struttura di tipo
victim (come la L2), grazie alla quale, qualora se ne rendesse necessario, risulta possibile spostare un determinato dato dalla cache L1 a quella L2 o anche all'interno della L3. In questo modo, al momento dell’arrivo di una serie di dati più rilevanti su un determinato core, si rende possibile liberare uno dei suoi primi due livelli di cache: in questo scenario si può realmente pensare alla cache L3 come ad un vero e proprio contenitore di appoggio temporaneo, lasciando quindi che le informazioni non elaborate siano disponibili, allorché richieste, a quelle singole sezioni di cache L1 e L2 (ricordandone l'esclusività) nella disponibilità unica di ciascun core del processore.
Bisogna anche rendere chiaro che può esistere purtroppo l'evenienza di una particolarità negativa dovuta all'incremento della quantità della memoria cache L3, ed è da intravedere nell'aumento degli errori presenti all’interno della stessa: per risolvere questo problema AMD ha messo a punto la tecnologia denominata
L3 Cache Index Disable, che sarà in grado di controllare l'integrità dei dati, tenendo quanto più possibile gli spazi di memoria L3 indenni da errori.
Nuove ed avanzate funzionalità di risparmio energetico
fonte AMD
Il sistema di risparmio energetico implementato in talune architetture quad core permette di gestire in modo individuale, e indipendente per ciascun core, la frequenza di funzionamento ma non la propria tensione operativa, che potrebbe comunque rimanere identica tra i vari core costituenti la cpu. Accade infatti che, sebbene ogni core disponga di un proprio PLL indipendente, questo controsenso possa accadere in quanto la tensione di alimentazione è pur sempre gestita in modo omogeneo per la totalità dei core, e permanga bloccata sul valore più alto, necessario al core che, allo stato, presenti la percentuale di occupazione più alta.
Differenziandosi da questa, se vogliamo, discrasia nell'ottica del maggiore risparmio energetico ottenibile, K10 integrerà invece una nuova logica di gestione dell'alimentazione denominata
Dual Dynamic Power Management (utilizzabile solo su socket AM2+ e con l'utilizzo di cpu a 45nm) che sarà in grado di differenziarla e personalizzarla sia tra i core stessi della cpu (tramite il
PowerCap Manager), sia tra la cpu e il memory controller. A motivo di questa gestione avanzata della'alimentazione, non solo cpu e controller di memoria potranno ricevere tensioni differenti in funzione del particolare tipo di carico richiesto in quel preciso istante (
Split Power Lane), ma soprattutto esisterà questa possibilità anche nell'ambito degli stessi core della cpu, così da rendere quanto minimo possibile l'impatto sul consumo energetico complessivo.
Unitamente a queste nuove features, una cpu K10 potrà far uso di diversi stati energetici, e in particolare avrà a disposizione due stati di sistema:
•
C0 (operating)
•
C1 (halt)
e 5 stati peculiari del processore:
•
S0 (working)
•
S1 (caches flushed)
•
S3 (standby)
•
S4 (hibernation)
•
S5 (soft off)
D'altro canto, l'approccio progettuale che prevede il memory controller con un proprio e distinto PLL, quindi separato da quello della cpu (a differenza di quanto accade con i processori K8 che presentano un singolo e medesimo PLL per cpu e memory controller), ha così permesso l'eliminazione dell'annoso problema di avere una sincronizzazione perfetta tra clock base della cpu e clock della memoria solo a patto di utilizzare dei ben precisi divisori di frequenza di quest'ultima. Alla luce di questa precisa scelta progettuale, con le versioni sia desktop che server sarà sempre possibile avere, ad esempio, memoria standard DDR2-PC6400 o DDR3-PC10600 pienamente sfruttate a 400MHz e 667Mhz di clock (in riferimento DDR), a prescindere dalla relativa frequenza operativa utilizzata dalla cpu.
fonte AMD
Un PLL indipendente per il memory controller permette, in aggiunta, di poter modificare in maniera dinamica la frequenza di clock internamente al controller stesso; pertanto, qualora il tipo di elaborazioni eseguite non richiedano al controller di lavorare al pieno delle proprie potenzialità, sarà possibile ridurne dinamicamente la frequenza di funzionamento, sia in maniera completamente indipendentemente, sia in modo trasparente alle attività della cpu: tutto ciò contribuirà, quindi, anche al contenimento del consumo energetico complessivo non solo della cpu stessa, ma di tutto il sistema.
fonte AMD
Le misure prese in considerazione da AMD per produrre una efficace gestione del risparmio energetico all'interno del K10, sono andate anche oltre: alcune circuitazioni possono, tramite la tecnologia AMD
CoolCore™, essere spente in modo indipendente a seconda del tipo di richiesta inoltrata dalla specifica applicazione in uso; nel particolare, su quei componenti realmente privi di utilizzo la frequenza di funzionamento verrà azzerata, contribuendo in modo ancora più incisivo e determinante alla riduzione del consumo energetico complessivo.
A tal proposito, per ridurre sapientemente il consumo di energia nelle cpu K10 con tecnologia costruttiva a 45nm è stato sviluppato un apposito sistema di risparmio energetico denominato
Smart Fetch. Tramite tale sistema, la cpu è in grado di controllare costantemente lo stato operativo di ognuno dei core, e quando uno di questi viene a trovarsi in stato
idle, la cpu è in grado di gestire completamente i dati al momento contenuti nei suoi pertinenti ed esclusivi spazi nella cache L1 ed L2, spostarli nella più ampia e condivisa cache L3, ed immediatamente dopo switchare il core interessato direttamente nello stato
halt. Risulta utile sottolineare come in uno scenario di utilizzo standard del sistema, lo
Smart Fetch è in grado di poter ridurre i consumi di circa un ulteriore 20%.
Sofisticati circuiti di Virtualizzazione
Tra le novità introdotte ed integrate da AMD all'interno dell'architettura K10, possiamo segnalare alcune innovazioni specificamente legate all'ambito della virtualizzazione. Come noto sia Intel che AMD hanno implementato queste tecnologie a livello hardware all'interno delle proprie cpu più recenti, ma con le cpu K10 AMD ha proposto alcune innovazioni rispetto all'approccio seguito con le precedenti cpu K8, riunendole sotto la denominazione della tecnologia
AMD-V.
In un ambiente virtualizzato i processori non hanno possibilità di accedere direttamente all'hardware per indirizzare richieste di reperimento di dati situati precedentemente in particolari indirizzi di memoria da parte del sistema operativo, verso l'indirizzo invece fisicamente utilizzato dall'hardware. Per limitare l'impatto di questa doppia richiesta l'
hypervisor del sistema di virtualizzazione utilizza una tecnologia software chiamata
shadow paging che non ha dalla sua, come punto di forza, caratteristiche di velocità nell'esecuzione.
Tramite le ASIDs (
Address Space ID) una cpu AMD64 con architettura K10 partiziona in modo dinamico il TLB. L'hypervisor assegna a sua volta un valore unico di ASID ad ogni
guest programmato per essere eseguito sul processore. Nel corso della ricerca su un TLB, il valore ASID del client attualmente attivo viene confrontato con il tag ASID nella voce TLB e i numeri del frame lineare di pagima (
linear page frame) sono confrontati al fine di ottenere un potenziale hit nel TLB. Così le voci nel TLB appartenenti a vari sistemi guest e all'hypervisor possono coesistere senza causare traduzioni di indirizzi non corretti, e queste voci di TLB possono rimanere perdistenti durante i cambi di contesto, mentre senza l'ASIDs, tutte le voci del TLB dovrebbero essere azerate prima di un cambio di contesto e nuovamente ripopolate in seguito.
All'interno delle cpu K10 è stato quindi implementato del nuovo hardware a questo preciso scopo, che in definitiva permette di gestire le guest pages senza dover chiamare direttamente in causa l'
hypervisor. Questa nuova tecnica, sviluppata da AMD in modalità hardware pressoché completa e denominata nested paging, non dovrebbe in teoria, per poter essere proficuamente utilizzata, richiedere complicati sforzi ai produttori di software di virtualizzazione, ma solo marginali e modeste modifiche, risultando concettualmente di rapida adozione una volta che le cpu K10 avranno preso campo in commercio.
fonte AMD
Anche i
lockup della memoria, in ambiente virtualizzato, verranno sempre gestiti dalle cpu K10 esclusivamente in hardware attraverso il DEV (
Device Exclusion Vector). Questa nuova modalità comporterà che ad ogni macchina virtuale venga associato un determinato quantitativo di memoria fisica; se una macchina virtuale dovesse richiedere una porzione di memoria ad essa associata, può essenzialmente accedervi. Qualora, invece, una macchina virtuale dovesse trovarsi nella condizione di richiedere una porzione di memoria ad essa non associata, tale richiesta verrà direttamente bloccata in hardware dalla cpu K10, così che quella macchina virtuale non possa andare a modificare la memoria fisica associata ad un'altra diversa macchina virtuale o ad un task differente. Le cpu Intel possono fare la stessa cosa, ma l'approccio tenuto è peculiarmente finalizzato all'intervento software, quindi demandato ad istruzioni non direttamente in hardware. Le prestazioni dell'approccio utilizzato nel K10 porterà di conseguenza a prestazioni superiori, così come più elevata sarà la sicurezza complessiva del sistema.