View Single Post
Old 30-09-2009, 12:35   #5
capitan_crasy
Senior Member
 
L'Avatar di capitan_crasy
 
Iscritto dal: Nov 2003
Messaggi: 24166
Approfondimento su Bulldozer/Fusion

Aggiornamento 28.08.2010

Quote:
Originariamente inviato da bjt2 Guarda i messaggi
Il caro Dresdenboy si prende una settimana di "riposo", ma prima ci lascia un post sul suo blog MOOOOOOLTO interessante:

http://citavia.blog.de/2010/08/27/a-...links-9265110/

La cosa più interessante è la seguente:

Thuban e company hanno una pipeline di 22 FO4 (non 24, sorry). Mentre Bulldozer ha una pipeline di 17 FO4. Quindi una pipeline del 30% più veloce. Questo vuol dire che a parità di processo (quindi anche se buldozer fosse fatto con il 45nm low-k liscio di adesso), potrebbe andare fino al 30% più veloce in clock. Considerando il nuovo processo, questo significa frequenze MOLTO alte. Ricordo che il FO4 del Pentium 4 è stimato in 16. Quindi possiamo aspettarci anche frequenze dell'ordine del 5GHz (almeno in turbo mode)...

Facciamo 2 conti per un ipotetico bulldozer X6. Un X6 Phenom II attuale va a 3.2GHz. +30% per la pipeline più lunga, +40% per il processo più parco, sono 5.8 GHz. Ora non credo che arriveremo a tanto perchè penso che AMD faccia i transistors più piccoli (e quindi più lenti) per occupare meno area e comunque con una pipeline del 30% più veloce non si va il 30% più su di clock perchè i tempi di ritardo tra i vari stadi non migliorano e quindi una pipeline così corta garantisce un 15, massimo 20% in più. Questo per dire che un clock stock di oltre 4GHz come X6 e forse anche come X8 lo si può sperare...
Quote:
Originariamente inviato da bjt2 Guarda i messaggi
Il FO4 è una misura della complessità dello stadio della pipeline. Fissata la pipeline, la complessità è data. Poi si può implementarla a 130, 90, 65, 45, 32nm ecc... A seconda del processo, sarà maggiore la frequenza a cui potrà andare... Non esiste un limite intrinseco al clock dato un processo, o meglio, esiste un limite intrinseco dato un FO4 di una architettura. La combinazione di FO4 e processo da la velocità.

Per esempio. Il Power 7 ha un FO4 di 17 (mi pare) ed è stato implementato con il 45nm, mi pare con il Low-k. Ora quel processore ha una caterva di transisors. Il quadcore arriva a 4.14 GHz e l'octacore a 3.96 Ghz... Un ipotetico bulldozer X4 fatto a 45nm (il processo del Thuban) sarebbe arrivato a 4.2-4.3 stock, minimo, sia perchè il Power 7 ha molti più transistors e molte più unità attive (un quad core ha 16 thread, e ogni core ha mi pare 12 unità di esecuzione), sia perchè il Power 7 è una CPU server e tradizionalmente queste hanno qualche centinaia di MHz in meno delle controparti desktop...

EDIT: in ogni caso, nel caso peggiore, un buldozer X4 a 4.1 Ghz e un Bulldozer X8 a 3.9 Ghz è fattibile visto il Power 7, anche con questo 45nm Low-k. Ricordiamo che IBM usa lo stesso processo di GF/AMD...

EDIT: Su wikipedia dice che esiste una versione quadcore da 4.25 Ghz. Il Power6 che aveva un FO4 di 13 arrivava a 5GHz e IBM aveva in laboratorio un prototipo funzionante a 6GHz...

EDIT: sto leggendo su google gruppi che tra Thuban e Buldozer, c'è un progetto cancellato che aveva un FO4 di 13... Sarebbe arrivato a 5GHz con il 45nm! Dice anche che BD dovrebbe avere un IPC (A PARITA' DI FREQUENZA) del 20-25% in più. Il tizio sembra essere un ex dipendente AMD che ha lavorato al progetto... Il gruppo in guestione è http://groups.google.de/group/comp.a...14f6049?hl=de# e il tipo si chiama Mitch_qualcosa...
Aggiornamento 28.08.2010

Quote:
Originariamente inviato da cionci Guarda i messaggi
Quote:
Originariamente inviato da paolo.oliva2 Guarda i messaggi
@Bjt2.

Domanda da nubbio.

La lunghezza delle pipeline è una costante o comunque dipendente dal silicio?
Tipo... procio X, pipeline 10 su 90nm, max 5GHz, se il silicio arriva a quella frequenza bene, altrimenti amen. Stesso procio, pipeline 10, ma silicio 45nm, l'architettura avrebbe lo stesso limite di 5GHz anche se il silicio potesse dare 6GHz? Oppure la pipeline risente comunque di latenze inferiori per la riduzione del silicio e quindi permettere di più?

Perché il PIV era fatto a 90nm o 120nm? Se Buldozer ha una pipeline simile ma 32nm è equiparabile o promette più velocità?
In un circuito digitale sincrono (con clock), il critical path è il percorso del circuito che provoca maggiori ritardi e di conseguenza limita la frequenza.
Solitamente c'è un registro sorgente, un circuito che elabora il contenuto del registro ed infine il registro di destinazione. Il circuito per poter funzionare ad una data frequenza deve essere in grado di presentare i risultati in modo stabile all'ingresso del registro qualche istante prima del nuovo fronte di clock (esattamente Tsetup + Thold dei flip-flop che compongono i registri).
Chiamando Tcp il tempo massimo di attraversamento del circuito, o meglio il T di attraversamento del critical path, abbiamo che:

Tsetup + Thold + Tcp < T

dove T è il periodo di clock, cioè 1 / F (F è la frequenza di clock).

Semplificando...la pipeline non è altro che una suddivisione in stadi (stage) dell'esecuzione di una istruzione. Ogni stadio esegue una piccola parte dell'istruzione fra un registro sorgente ed un registro di destinazione. Lo stage successivo, al clock successivo, prende il risultato e mette a sua volta il suo risultato in un altro registro entro la fine del ciclo di clock.
Di fatto nella pipeline abbiamo in esecuzione un massimo di una istruzione per stage della pipeline (le cose possono anche andare diversamente in caso di duplicazione delle unità di esecuzione, ma come dicevo: semplifichiamo).
Con la pipeline a regime abbiamo comunque la terminazione di una istruzione per ciclo di clock. Con la pipeline vuota dobbiamo attendere un numero di clicli di clock pari alla lunghezza della pipeline prima che l'esecuzione di una istruzione sia terminata.
Quindi possiamo applicare il discorso fatto prima: il critical path di una CPU è il critical path con ritardo più alto fra i critical path di ogni stage. Questo critical path servirà a determinare la frequenza massima raggiungibile dalla CPU con una determinata tecnologia litografica (potenza permettendo).

Aumentare il numero di stadi ha però delle contro-indicazioni: se la pipeline va in stallo (cioè deve essere svuotata) in caso di misprediction (fallimento della branch prediction, l'algoritmo che "prevede" dove andrà a finire un salto condizionale e quindi riempirà di conseguenza la pipeline) o per il cambio di contesto, prima di terminare una nuova istruzione passeranno ben 31 cicli di clock. E' chiaro che per ovviare a questi overhead bisogna avere un ottimo algoritmo di branch prediction e bisogna avere la possibilità di raggiungere frequenze nettamente maggiori dei concorrenti.

Il Prescott aveva una pipeline di 31 stadi per gli interi. Una cosa praticamente mai vista (normalmente sono intorno ai 10-12 stadi per gli interi, tranne le prime implementazioni). Aveva però gravi problemi di leakage (è uno degli elementi che vanno a determinare la potenza necessaria a far funzionare la CPU) che non gli permettevano di raggiungere le frequenze che gli ingegneri avrebbero voluto fargli raggiungere (pensate che Intel avrebbe voluto raggiungere gli 8-10 Ghz entro due generazioni litografiche). Questa fu la motivazione per cui il progetto Tejas, il successore di Prescott, non arrivò nemmeno sul mercato.
Aggiornamento 28/09/2010

Sandy Bridge Vs Bulldozer:
il confronto di bjt2



Quote:
Originariamente inviato da bjt2 Guarda i messaggi
Allora... Per smorzare un po' i toni e per chiarire una volta per tutte parliamo del confronto Sandy bridge core vs Bulldozer module.

2 thread vs 2 thread. Poi vediamo un confronto alla buona 1 thread vs 1 thread considerando metà delle risorse condivise.

Decodifica istruzioni:
Un core SB può decodificare al massimo 3 istruzioni semplici e una complessa oppure una sola microcodificata alla velocità di 3 uop per ciclo, questo per ciclo di clock e per un dato thread, mentre un core BD può decodificare un qualsiasi mix di istruzioni semplici o moderatamente complesse (2 mops) purchè non si superi le 4 mops per ciclo, oppure una microcodificata alla velocità di 4 mop per ciclo, tutto questo per ciclo e per thread. Anche ammettendo che le uop intel siano equipotenti alle mops AMD, qui c'è un chiaro vantaggio AMD (ancora maggiore se si pensa che le MOP amd ammettono fino a 3 ingressi e una uscita, vedi FMAC, mentre quelle INTEL max 2 ingressi e una uscita, da cui le FMA3). Se il mix di istruzioni non è del tipo complessa+3 semplici, il decoder INTEL perde MOLTISSIMO in prestazioni. Per fortuna che un compilatore decentemente inteligente riordina le istruzioni quando possibile, ma il rischio ovviamente c'è... Però per compensare, SB usa una cache delle microoperazioni che può sparare fino a 18 uop/ciclo... Non si sa se anche BD la usa. E i branch prediction sono stati migliorati sia in SB che BD e non si sa quale sia meglio. L'approccio del BD con le code degli IP predetti è però interessante...

Dispatch:
Qui dovrebbe avvenire il micro/macro op fusion. Entrambe le architetture possono fare il dispatch di 4 uops/mops. L'architettura INTEL può fare una uop fusion per ciclo, arrivando a 5. Anche BD può fare la uop fusion, ma non si sa se una o più di una e in che casi. Comunque considerando le MOP e le uop equivalenti in potenza (anche se non è vero), siamo in situazione di parità.

ROB:
Qui INTEL ha un enorme ROB che deve dare spazio a due thread (160 uop). AMD ha 2 ROB (da 128 mops l'uno) per il fatto che i due cores sono fisicamente separati. Qui giacciono le istruzioni in attesa di esecuzione o di ritiro.

Scheduler:
Qui le differenze si fanno interessanti. AMD separa INT e FP. Ha 2x40 mops intere/memoria più 60 mops FP, condivise tra i due thread. INTEL ha un unico calderone di soli 54 elementi condivisi tra interi, memoria FP e per di più di entrambi i thread. E' inutile dire chi ha le potenzialità maggiori...

Esecuzione:
INTEL ha 6 porte dove sparare le micro ops. Quindi può sparare 6 uop per ogni ciclo di clock, condiviso tra due thread. 3 porte sono dedicate alla memoria: 2 per le 2 AGU e una per gli store. 3 porte sono per le operazioni. Badate bene: le 3 porte residue sono CONDIVISE tra operazioni INT e SIMD/FP di ENTRAMBI i thread. Ossia in ogni ciclo si possono al massimo fare 3 operazioni tra INT e FP/SIMD.
AMD può, per ogni ciclo di clock e per 2 thread, sparare: 4 istruzioni FP (di entrambi i thread), 4 AGU/memoria (2 per thread max) e 4 ALU/intere (2 per thread MAX).
Considerando che anche un codice fortemente FP comunque contiene istruzioni per i loop, salti, confronti, insomma contiene istruzioni INTERE che su INTEL si contendono le 3 porte (per di più i thread sono 2!) mentre su AMD corrono su binari separati. Solo le istruzioni per la memoria hanno binari separati. Ma questo anche in AMD. Ecco che il potenziale AMD è maggiore.

Memoria:
Su SB si possono fare 2 letture a 128 bit e una scrittura a 128 bit per ciclo. Poichè però la cache L1 ha solo 2 porte, questo può essere fatto per breve tempo. E comunque queste 3 operazioni devono essere condivise tra i due threads.
Su BD, invece, ogni thread ha la sua cache L1, le sue 2 porte, le sue due letture a 128 bit e scrittura a 128 bit, le sue code di lettura e scrittura e le sue AGU. Inutile dire chi vince in questo caso.
E' vero che SB può fare fino a 3 operazioni FP a 256 bit per ciclo (1 add, 1 mul e una shuffle), ma può farlo per molto? No.

Retirement:
Qui siamo 4 a 4, ma sempre presupponendo che le mops AMD non siano più potenti di quelle INTEL.

Frequenza operativa:
A giudicare dalle latenze delle caches, sembrerebbe che BD possa avere un clock nettamente superiore a SB. Poichè la banda memoria è maggiore, anche a parità di clock, i due thread dovrebbero scorrere più fluidamente su un BD, considerando che la velocità di ritiro è la stessa e supponendo che le unità prima dello stadio di ritiro siano veloci a sufficienza (più probabile per BD che per SB alla luce di quanto visto). Se poi consideriamo che il clock sarà probabilmente maggiore...

Confronto alla buona 1 thread vs 1 thread considerando metà delle risorse condivise. In realtà in INTEL alcune risorse sono condivise dinamicamente.

Decodifica istruzioni:
Qui valgono le stesse considerazioni del 2 vs 2 considerando che la decodifica è probabilmente fatta a cilci alterni.

Dispatch:
Qui valgono le stesse considerazioni del 2 vs 2 considerando che il dispatch è probabilmente fatto a cilci alterni.

ROB:
Qui INTEL ha un enorme ROB condiviso, quindi un thread ha da 0 a 160 uop di spazio. AMD ha ROB separati da 128 mops l'uno. A secinda del carico INTEL può essere svantaggiato o meno. In un caso medio siamo 80 vs 128.

Scheduler:
AMD ha 40 mops int + 0-60 mops FP. In media 40+30.
INTEL ha 0-54 uops condivise. In media 27 totali.
La differenza è alta anche nel caso peggiore.

Esecuzione:
INTEL ha 0-6 porte disponibili per un thread. In media 3.
AMD ha 2 ALU + 2 AGU/MEM + 0-4 FP. In media 2+2+2.
La differenza è alta anche nel caso peggiore.

Memoria:
INTEL da 0 a 3 operazioni memoria. In media 1.5.
AMD 3 operazioni memoria.
Inutile dire chi vince in questo caso.

Retirement:
Qui siamo 4 a 4, ma sempre presupponendo che le mops AMD non siano più potenti di quelle INTEL.

Frequenza operativa:
Entrambi qui hanno il turbo. Il leackage in AMD è di partenza più basso. Poi lo spegnimento dei core con gli NFET è più efficiente. Prevedo che per AMD la frequenza turbo core sia ancora più elevata...




Conclusioni:
In sostanza a parità di thread Bulldozer dovrebbe surclassare SB. A parità di cores (come li intendono INTEL e AMD) non è detto che AMD la spunti. Ma comunque c'è addirittura questa possibilità...
Aggiornamento 27.12.2010

Quote:
Originariamente inviato da bjt2 Guarda i messaggi
http://support.amd.com/us/Processor_TechDocs/40546.pdf

Manuale di programmazione AMD aggiornato. Menziona la famiglia 10h e 12h. Questo 12h dovrebbe essere Llano. Sono arrivato a metà e finalmente sono incappato in differenze di prestazioni: il fantomatico processore famiglia 12h (mai nominato il nome commerciale fino alla metà che ho letto) ha la divisione intera nettamente più veloce, fino al doppio, probabilmente paragonabile a quella INTEL (non ricordo le latenze a memoria)... E' molto probabile che questo 12h sia Llano... Proseguo la lettura e vi faccio sapere se ci sono altre differenze... (la parte più ghiotta è alla fine dove parla delle latenze delle istruzioni)
Quote:
Originariamente inviato da bjt2 Guarda i messaggi
E' molto probabile che il 12h sia Llano, perchè dice che non ha cache L3, ha l'ICU allargato (28x3=84 mops, sia intere che float) e lo scheduler intero che passa da 24x3 a 30x3. In più l'integer divide è un circuito in più attaccato alla terza ALU. Evidentemente nelle CPU precedenti la DIV era microcodificata, quindi vector path, per cui non c'era una vera e propria unità per la divisione. Questo consente sicuramente velocizzazioni elevate di codice intero con molte divisioni... Continuo la lettura...

EDIT: ora la FPU ha 14x3 mops nel reorder buffer. Se non ricordo male era 12x3 nel 10h...

EDIT2: il 10h ha controller RAM DDR2 e DDR3, il 12h è espressamente DDR3 only... Il 12h non supporta ECC e non supporta DIMM con chip da 4 bit... L'ECC sopratutto esclude una CPU server... Il 12h supporta solo la modalità unganged, inoltre supporta le interfacce "Onion" e "Garlic" (letteralmente cipolla e aglio)... Ho scorso velocemente quella parte... Ci ritorno dopo per cercare di capire cos'è, ma probabilmente è l'interfaccia con la GPU integrata... Il 12h supporta 8 streams di prefetching (mi pare che il 10 ne supporti 5, o 3, non ricordo)... Quindi controller migliorato...

EDIT3: il 12h non ha il controller hypertransport... Ciò implica che avrà qualche altra cosa, probabilmente PCIExpress...

EDIT FINALE: per le latenze delle istruzioni, a parte quelle sulla divisione intera, le differenze sono minime. Per poche istruzioni (di cui la maggior parte sono istruzioni di sistema) è riportato solo il valore per la CPU 12h. Non è dato sapere se migliora o peggiora, ma suppongo sia diverso da quello del 10h. Se qualcuno avesse la versione vecchia, si potrebe confrontarli... Comunque modifiche di poco conto...


In sostanza la CPU 12h ha scheduler migliorati, divisione intera migliorata, prefetcher migliorati e qualche cosa piallata, come le memorie DDR2, l'ECC, il controller ganged (che non serve a molto con 4 core + GPU), l'hypertransport...

Aggiornamento 11/04/2011

Quote:
Originariamente inviato da bjt2 Guarda i messaggi
Allora... Menziono le cose più importanti mano a mano che leggo...


- E' confermato che internamente BD usa ancora macro-op (operazione intera oppure FP + operazione memoria). Ciò è importante per stabilire quanto riesce a macinare...

- E' confermato che esistono ancora operazioni single, double e vector (anche se i nomi sono cambiati: FastPath Single, FastPath Double e Microcode). Ciò è importante per stabilire la potenza del decoder.

- Parla delle istruzioni supportate: AVX, XOP, FMA(C) ecc... Tutto confermato. Più qualche cosa poco nota come istruzioni per l'estrazione della parte frazionaria di un numero FP e istruzioni vettoriali di rotazione, shift, shuffle.

- Menziona le nuove unità FP a 128 bit e dice che le prestazioni possono essere fino al doppio. Non mi è chiaro questo punto. Anche le unità del K10 sono a 128 bit. Ma poi spiega l'uso del FMAC che non è automatico e dice che l'FMA è più preciso di una ADD+MUL (si sapeva già). Forse è a questo che si riferisce quando parla di prestazioni doppie.

- Ora BD non soffre più in prestazioni se le istruzioni sia di load/store, sia load/execute lavorano su dati non allineati. Possibili benefici con codice con dati non allineati. Questo potrebbe essere un refuso del documento del K10. Mi pare di ricordare che era una delle novità del passaggio da K8 a K10...

- Novità del fetching istruzioni. Non più una finestra di 32 bytes, ma DUE finestre di 32 bytes da cui possono essere prodotte fino a 4 mops/ciclo. Si accenna al fatto che queste due finestre assieme alla FPU a 128 bit consentono di avere un ritmo di fetch/execute/retire di 4 mops/ciclo... Ora come ora è molto nebulosa la cosa. Non menziona mai il fatto che è condivisa tra due thread...

- Accenno al fatto che molte istruzioni sono state promosse da vector a double o a single, che sono migliorate le latenze e che molte istruzioni FPU sono state spostate di pipe... ATTENZIONE! Fino ad ora avevamo supposto che l'architettura a FO4 17 avrebbe comportato l'aumento delle latenze delle istruzioni... Secondo quanto scritto qui E' IL CONTRARIO! Potrebbe anche questo essere un refuso della modifica del documento del K10.

- Miglioramento in velocità delle istruzioni di shuffle, di trasferimento registri FP-interi (nonostante la FP condivisa!), di trasferimento FP-FP (quello a cui accennava JF-AMD degli zero latency move), delle operazioni su stringhe (i vari REP, SCAS ecc), delle operazioni stack e del paging a 1GB.

- Le operazioni di shuffle (tallone di achille) possono essere fatte al quadruplo della velocità grazie a più unità, al fatto che sono a 128 bit (???) e ora le istruzioni sono Direct Path e non vector path (mi sa che è un refuso del vecchio documento perchè parla delle pipeline FADD, FMUL e FSTORE... anche per le operazioni di move reg-reg)

- poi parla delle TLB e della virtualizzazione.

--- FINE SEZIONE INTRODUTTIVA ---

- Confermate le cose che si sapevano sull'architettura (caches ecc). Predizione e fetch sono disaccoppiati, decoding a 4 vie (limite teorico). Scheduling dinamico. 2 istruzioni ALU + 2 AGU per ciclo (confermato). 2 128 BIT FPU. Supporto AVX, XOP ecc. Superforwarding (probabilmente quella cosa del poter usare subito i risultati di una operazione).

- Descrive il fatto delle 4 microop/ciclo. Dice che può fare il fetch di 32 bytes per ciclo e che puo fare la scansione di due blocchi da 16 bytes per ciclo (su due finestre di 32 bytes). Può decodificare fino a 4 mops/ciclo. E' un limite teorico che dipende dalle istruzioni presenti nelle finestre di 16 bytes e anche dalla modalità in cui si trova la CPU: FAST o SLOW (???)

- Schema a blocchi della CPU: nulla da notare se non che non divide le ALU/AGU ma le chiama genericamente pipeline e anche qui la FPU è indicata con solo le due pipeline a 128 bit...

- Caches: L1 istruzioni UNICA da 64 KB, a 2 vie con linea da 64 bytes e lettura di 32 bytes (come quella del K10). Quando è letta una nuova cache line è automaticamente fatto il prefetch di quella successiva. Il predecoing è fatto subito dopo il load. La L1 dati è da 16 KB. Può fare 2 load a 128 bit per ciclo. Ha 16 banchi e un solo load per banco. Quindi i due load sono simultanei se sono in banchi separati. Latenza di 4 cicli (! data l'alta latenza, prevedo clock stratosferici). Menziona genericamente il prefetching. La cache L1 è write through e non write back come il K10... Hanno imparato da INTEL... Ci sono vantaggi nello snooping. Solo la cache L2 va testata... Quest'ultima appunto è inclusiva e condivisa tra i due core. Menziona il write trough e finalmente conferma che le caches sono due. La latenza è 18-20 cicli e la cache è full speed (quindi con il clock alto... ). Il perchè è presto detto: la dimensione è dipendente dall'implementazione! Ci possono essere modelli con più o meno L2 per core (magari parzialmente disattivata per difetti...). La cache L3 può essere massimo 8MB con 4 blocchi di massimo 2MB (anche qui il binning per difettosità...). La cache L3 è non inclusiva e victim buffer. Ci vanno i dati buttiati dalle L2. Un dato rimane nella L3 se è usato da più cores (un predittore?). Altrimenti va nella L1 del core che la usa. La L3 è dichiarata migliorata come banda. Latenza non specificata.

- Branch prediction: penalità da 15 a 20 cicli in caso di miss. In caso di hit, un solo ciclo se è nella cache L1, 4 cicli se è nella L2. La L1 è 4x128 entry e la L2 5x1024 entry. 512 entry per gli indiretti e 24 per il return stack. Il branch prediction è abbastanza complesso ma credo che sia simile a quello del K10...

- Fetch e decode. Sono letti 32 bytes/ciclo. Le finestre sono di 16 bytes e esistono due code (una per thread). Si possono decodificare fino a 4 istruzioni per ciclo contenute in 2 finestre a 16 bytes.

- TLB: L1 istruzioni 48 4KB, 24 2MB o 1GB. Entry da 4MB occupano due entry da 2MB. L1 dati 32 (64 per i modelli 20H-2FH) per 4KB, 2MB e 1GB. Entry da 4MB occupano due entry da 2MB. L2 istruzioni 512 4KB. L2 dati 1024 condiviso tra 4KB, 2MB e 1GB. Entry da 4MB occupano 2 slot.

- Esecuzione intera: c'è lo scheduler e le unità di esecuzione. Lo scheduler è completamente data-driven. Non ci sono più le lane del K10. Ossia è più inteligente: l'unico limite è la disponibilità dei dati e delle unità. Inoltre tiene traccia del completamento e delle eccezioni delle istruzioni FP: è questa unità che decide il da farsi. L'unità FP fa solo il "lavoro sporco"... Lo scheduler intero può ricevere e schedulare fino a 4 mops/ciclo. Fa il register renaming e sveglia le istruzioni in attesa. Le unità di esecuzione sono 4. ATTENZIONE: 2 ALU e 2 AGLU. Le due ALU sono chiamate Ex0 e Ex1. Possono fare tutte le operazioni aritmetiche, logiche e di shift. La Ex0 fa anche DIV e POPCNT. La EX1 fa anche MUL e BRANCH. Le AGLU possono fare le AGU e operazioni ALU SEMPLICI. NOVITA' rispetto al K10: le mops sono divise nello scheduler in microops. Possono essere eseguite indipendentemente e fuori ordine (non più le lanes... ) quando dati e unità esecutiva sono libere, in particolare in contemporanea in ALU e AGLU separate. Lo scheduler può ricevere 4 MOPS/ciclo (quindi potenzialmente 4 istruzioni intere più 4 memoria). Questo è un dispatch group. Il divisore di EX0 non è pipelined ed è a latenza variabile. Il moltiplicatore in EX1 è pipelined. L'AGLU contiene una ALU semplice per fare istruzioni aritmentico logiche semplici... Guardando le tabelle delle latenze sembra che le AGLU siano sfruttate in poche istruzioni, giusto per non usare le EX unit. LZCNT e POPCNT sono gestite in EX0.

- FPU. E' dichiarato che la FPU ha 4 volte la potenza di picco di quella del K10. 4 pipeline. 2 FMAC a 128 bit. Una può fare anche le IMAC (multiply - accumulate su dati interi) e le conversioni tra int e fp e una ha un crossbar per gli shuffle SIMD. 2 unità SIMD intere per MMX e SIMD intere. Una delle due ha la pipeline FSTORE. C'è poi una unità di load/store che può fare 2 letture a 128 bit + una scrittura a 128 bit. La CPU può ricevere fino a 4 mops/ciclo, ma da un solo thread alla volta. Il thread può cambiare a ogni ciclo. La FPU può eseguire 4 mops/ciclo. Una volta ricevute in cicli separati, poi possono essere eseguite anche inframezzate nello stesso ciclo, al ritmo di 4/ciclo. Nella FPU possono essere accettati fino a 2 loads per ciclo, anche da 2 thread separati. 4 pipeline, 2 FP e 2 INT. 2 128 bit FMAC. Ognuno può fare anche ADD e MUL anche x87. Ogni FMAC ha anche un divisore e calcolo radice quadrata a latenza variabile. Una istruzione a 256 bit può essere eseguita in un ciclo. Se non ci sono due unità libere è spezzata in due senza penalità. Cioè in pratica una istruzione a 256 bit è spezzata in due subistruzioni a 128 bit che possono essere eseguite indipendentemente (e anche in due cicli separati) senza bloccare le altre. Massima flessibilità, dunque.

- Unità di load/store. Una per core, due per modulo. Ogni unità supporta 2 letture a 128 bit e una scrittura a 128 bit per ciclo. La coda di scrittura è di 24 entry. La coda di lettura ha 40 entry. Due pipeline per ogni unità LS per fare 2 operazioni in contemporanea. Menziona il fuori ordine per le operazioni memoria ma non entra nei dettagli. Il write combining supporta 4 stream, con 4 buffer da 64 bytes (condivisi tra i due cores). C'è una cache di 4KB prima della L2 (64 blocchi da 64 bytes) per gestire il write combining da sorgenti varie (compreso il write chaining per la trasmissione su bus HT).

- Controller RAM. Supporta DIMM da 4, 8 e 16 bit, interleaving, ECC, e canali a 64 bit indipendenti. Ha algoritmi di scheduling e predizione ottimizzati in particolare per sequenze alternate di read e write. Il prefetcher tiene i dati nel controller e non li spedisce alle caches. Può adattarsi a pattern ascendenti e discendenti e altri più complicati. Le specifiche del MC possono cambiare da modello a modello.

- HT: supporto a 25.6GB/s (quindi 3.2 GHz) e varie features dell'HT 3. HT assist per sistemi a 4 o più socket: ancora con consumo di 1-2 MB di L3.

- Branch fusion. Non è specificato un limite al numero massimo di branch fusion però molto probabilmente al massimo uno. Perchè i limiti sono che il compare e il branch devono essere adiacenti, che il compare non deve essere la quarta istruzione del dispatch group, che il branch deve avere indirizzamento rip-relativo, che il compare non deve avere dati immediati o indirizzamento SIB.

- LATENZE istruzioni. Purtroppo è difficile confrontare le latenze senza avere a fianco quelle del K10. Ci dobbiamo fidare dei proclami dell'inizio del PDF. Molte istruzioni hanno un N/A, non so se per NDA oppure perchè effettivamente al tempo di stesura del PDF non erano note. Però lo scheduler data-driven, le uops che possono andare indipendentemente, le pipeline intere e FP separate possono addirittura far sperare in un IPC superiore al SB!

Questo è quanto...
Aggiornamento 21.06.2011
Revision Guide for AMD Family 12h Processors: Le analisi di bjt2!

Quote:
Originariamente inviato da bjt2 Guarda i messaggi
Dunque. Leggendo il documento si nota subito che parla solo dei Llano mobile (forse quando usciranno quelli desktop aggiorneranno il documento). C'è un solo step ed è contrassegnato come B0. Ipotizzo che sia questo quindi lo step in vendita. C'è la solita filippica sugli errata fix e gli errata che devono essere visibili al SO e non ci sono errata gravi che richiedono dei fix. Tutti gli errata elencati successivamente hanno un "no fix planned", quindi non sono gravi... Suggested workaround è "nessuno", tranne dove indicato espressamente.

57: errore lieve che consiste nel riportare in rari casi errori più gravi del dovuto nel caso di errori cache dati.
60: in alcuni casi un errore di parità nella cache dati viene erroneamente riportato come errore multiplo anzichè singolo.
77: mancata segnalazione di errore per call o jump far in casi che non si verificiano in realtà
230: errore nell'accesso a una precisa locazione di I/O se si effettua un accesso non allineato. Si suggerisce di farlo allineato (come sarebbe norma)...
250: problema con l'accesso in modalità compatibile dell'area I/O allocata per la VGA. Non grave.
297: come il 60 ma per la cache istruzioni.
343: problema di perdita dati quando la cache L2 è usata come meoria al BOOT dal BIOS (e quindi prima di abilitare il controller RAM). La soluzione è disabilitare una feature, probabilmente della cache, quando si usa la L2 come memoria. Ovviamente nell'operatività normale deve essere riabiliata.
361: in rarissimi casi una eccezione di debug è persa in codice in una macchina virtuale. Qualche eccezione debug può essere persa in codice che gira in una macchina virtuale. Evento rarissimo e di nessun impatto nell'uso normale.
366: problema di affidabilità con la memoria se si settano dei parametri del controller memoria lontano dai valori raccomandati da AMD. Soluzione: usare i parametri raccomandati da AMD...
418: problema di traduzione pagine in una macchina virtuale se l'host usa il PAE (quindi SO a 32 bit con oltre 4GB di RAM, sostanzialmente versioni linux o windows server) e se le pagine guest sono nella parte iniziale della memoria. La soluzione proposta è che l'Hypervisor in tal caso non memorizzi la tabella pagine ad inizio memoria... Problema poco grave.
430: se un core è in stato CC6, non rileva i cambiamenti del segnale A20M. Essendo un segnale legacy usato solo da sistemi operativi non multicore (sostanzialmente DOS, vecchi windows) non c'è alcun problema, perchè essendo il SO mono-core, non c'è null'altro che può cambiare lo stato di quel segnale.
432: se si fa un warm reset durante una fase di accesso DMA al reset potrebbe essere riportato erroneamente un errore DMA.
441: un errata che riguarda il debug. Per trasferire lo stack pointer in un registro di debug si deve usare la codifica esatta della istruzione in linguaggio macchina. Altre codifiche che sono legali ma non standard, possono far caricare il valore sbagliato nel debug register.
465: il primo comando di settaggio RAM dopo l'inizializzazione del controller può impiegare fino a 2.5ms per essere compeltato e quindi far andare in timeout il BIOS. Workaround: usare un timeout superiore ai 2.5ms.
470: se si fa un warm reset nell'istante preciso in cui si accede ai registri di configurazione del PCI express il sistema si blocca. Il workaround è settare dei registri in un dato modo (ci vorrebbe il documento con i registri per sapere se inficia le prestazioni, ma poichè c'è no fix planned presumo che non impatti le prestazioni) e particolare cautela se si deve riconfigurare un link PCIex.
474: la funzione di azzeramento della memoria potrebbe non scrivere zero. Il suggested workaround è una procedura particolare di scrittura di zero in cache e poi rilettura della stessa, prima di avviare la procedura di azzeramento memoria.
541: problema con il conteggio di alcune statistiche se la CPU entra nello stato CC6 prima della lettura delle stesse. Il suggested workaround è che i software che usano queste statistiche devono leggere i dati prima di mandare la CPU in stato CC6.
564: questo sembra un baco non da poco e riguarda un possibile malfunzionamento nel ritorno dalla stato CC6 se si verifica una SMI esattamente quando si sta eseguendo l'HLT per portare la CPU in stato CC6. Dice di contattare il proprio AMD rapresentative...
565: ancora sull'IBS, ossia le statistiche di uso. I registri sono separati per ogni core. Se si settano i cores in modo diverso ci potrebbero essere problemi di conteggio. La soluzione è settare tutti i cores in modo uguale.
573: questo sembra un baco non da poco e riguarda un possibile malfunzionamento dopo l'istruzione FSINCOS (una istruzione legacy della FPU x87 che fa calcolare seno e coseno assieme, evidentemente poco usata, poichè esistono istruzioni separate per seno e coseno). Dice di contattare il proprio AMD rapresentative...
596: il NB può essere messo per sbaglio in clock gating in rare circostanze in cui si sta facendo un prefetch causando la corruzione dei dati. Dice che non è stato osservato nei software commerciali, ma comunque il workaround è disabilitare il clock gating del NB.

In sostanza non ci sono errata gravi e lo step messo in commercio è quello B0 (ciò potrebbe spiegare i clock bassi)
__________________
AMD Ryzen 5600X|Thermalright Macho Rev. B|Gigabyte B550M AORUS PRO-P|2x16GB G.Skill F4-3200C16D-32GIS Aegis @ 3200Mhz|1 M.2 NVMe SK hynix Platinum P41 1TB (OS Win11)|1 M.2 NVMe Silicon Power A60 2TB + 1 SSD Crucial MX500 1TB (Games)|1 HDD SEAGATE IronWolf 2TB|Sapphire【RX6600 PULSE】8GB|MSI Optix MAG241C [144Hz] + AOC G2260VWQ6 [Freesync Ready]|Enermax Revolution D.F. 650W 80+ gold|Case In Win 509|Fans By Noctua

Ultima modifica di capitan_crasy : 20-06-2011 alle 23:02.
capitan_crasy è offline