|
|
|
![]() |
|
Strumenti |
![]() |
#41 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Nella fascia bassa è estremamente difficile competere coi cinesi. Per chiunque. Intel ha dalla sua il vantaggio delle fabbriche, per cui rispetto agli altri produttori può sfruttare questo vantaggio, ma la sua storia dimostra che non le interessa correre per i centesimi. Quote:
Fallo e avrai un'idea quanto incida una CPU in un SoC, e quelle unità sulla CPU e, di conseguenza, sul SoC. Io ho numeri molto precisi sia sulla dimensione dell'area impegnata sia sul consumo a runtime, ma non posso divulgarli. Un'idea, comunque, la si può fare lo stesso con quanto suggerito sopra. Quote:
Un core da un po' di decine di milioni di transistor su un SoC da un miliardo di transistor ha un peso molto basso sul totale. E un'unità di decodifica da un milione di transistor su un po' di decine di milioni ne ha un altro, tanto per fare un altro esempio. Facendo le debite proporzioni puoi comprendere da te l'incidenza della parte legacy dei core x86 sul totale di un SoC. Se fai qualche ricerca magari riesci a ottenere dei numeri più precisi, ma il concetto che ho esposto è quello. Quote:
Quote:
T'invito a documentarti in merito. Puoi anche chiedere informazioni sul newsgroup comp.arc, che è frequentato da parecchi esperi in materia.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
![]() |
![]() |
![]() |
#42 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Come in un software intervenendo sulle sequenze di codice più frequentemente utilizzate si possono migliorare (o peggiorare) in modo notevole le prestazioni, altrettanto avviene a livello di architetture. Puoi avere cache enormi, ma se il core che esegue il codice ha "un piccolo svantaggio" rispetto ad un altro core, a parità di dimensionamento di cache e del resto del SoC la cosa si nota. Di solito eventuali svantaggi intrinseci nel core si possono compensare con bus più ampi/veloci, cache più ampie ecc. ma questa comporta pagare un altro prezzo su altre caratteristiche. Altrimenti, se fosse vero che "la x86-tax non conta più", come mai Intel ha avuto così grandi difficoltà a contenere i costi ed consumi a livelli accettabili rispetto alla concorrenza che usava ARM ? In teoria hanno il personale ed il know-how per produrre dispositivi fatti come si deve e l'unica differenza rilevante rispetto alla concorrenza ARM è guardacaso la cpu. |
|
![]() |
![]() |
![]() |
#43 | |||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Ho scritto una serie di articoli un paio d'anni fa sull'argomento, di cui trovi qui l'ultimo. Un'altra serie di articoli l'ho scritta circa un anno fa riguardo alle statistiche relative alle istruzioni eseguite, di cui trovi l'ultimo qui. Con questo materiale puoi vedere in che modo incide l'aspetto legacy di x86 sia a livello di funzionamento interno sia per quanto riguarda il codice effettivamente eseguito. Per quest'ultimo è bene notare che la stragrandissima maggioranza di istruzioni eseguite NON sono roba vecchia & datata, ma istruzioni di gran lunga più semplici, che in genere sono mappate 1:1 con le cosiddette uop "RISC". Niente "legacy", insomma. A ciò aggiungiamo il fatto che già da parecchi anni proprio negli hot spot viene attivato il cosiddetto Loop Stream Detector (LSD), che consente di disabilitare i decoder ed eseguire direttamente le uop da questa piccola cache interna, consentendo un notevole risparmio di energia (con Haswell mi pare che mediamente l'80% del tempo la CPU lavora coi decoder spenti grazie a questa tecnologia). Il quadro adesso dovrebbe essere più chiaro e completo. Quote:
Questo significa, ad esempio, che il codice è più denso, quindi: - meno spazio occupato - tutta la gerarchia di memoria (cache L1/L2/L3, memoria) è meno stressata; - più TLB hit e meno flush Questo comporta un minor consumo per tutte queste componenti. Altro esempio, con istruzioni più complesse è possibile eseguire meno istruzioni per implementare un particolare algoritmo. Anche qui vale quanto scritto sopra, a cui si aggiunge il risparmio di energia dovuto all'esecuzione di meno istruzioni. Per cui è vero che l'aspetto legacy di x86 porta problemi, ma è anche vero che porta pure vantaggi, e non di poco conto, che incidono sulla bilancia energetica. Quote:
La situazione, come dicevo, è cambiata, e un core Atom non è più solo, ma si trova all'interno di SoC da miliardi di transistor... Quote:
Ci sono altri pezzi integrati in un SoC, su cui è possibile fare lo stesso ragionamento. Qualcomm è famosa per avere realizzato e integrato un DSP particolarmente efficiente a cui demandare parecchie delle operazioni relative ai modem e al multimedia. Infine, un altro esempio lampante è dato dalle GPU. Come sai, quelle Intel non eccellono rispetto alle controparti, e penso che la situazione sia la stessa anche in ambito mobile: probabilmente non sono efficienti, sia a livello prestazionale sia di consumi, rispetto alla concorrenza. Si tratta di una situazione non idilliaca, dunque, ma nemmeno così malvagia, a giudicare dai risultati raggiunti da qualche tempo. E la cosa interessante è che ci sono ampii margini di miglioramento per Intel... Ricapitolando, se una CPU oggi occupa circa il 10% dell'area di un SoC, puoi facilmente immaginare perché il rimanente 90% sia così importante e quanto incida a livello di consumi. Purtroppo, essendo i componenti del SoC totalmente diversi non solo a livello di CPU, non è possibile fare dei confronti diretti, e bisogna accontentarsi delle misure dell'intero SoC. Ma anche senza i dati a disposizione relativi ai singoli pezzi, puoi comunque farti un'idea del peso che ha oggi una CPU incastonata in un SoC da miliardi di transistor, e trarre da solo le tue conclusioni. P.S. Al solito le mie sono soltanto opinioni personali: non riporto informazioni aziendali, ma soltanto ciò che in giro può trovare chiunque.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||||
![]() |
![]() |
![]() |
#44 | ||||
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
![]() Ecco, la x86-tax è uguale, crea piccoli problemi che fanno pendere l'ago della bilancia verso altre direzioni nei settori in cui gli x86 non dominano già e la retrocompatibilità con software per x86 non è sufficientemente rilevante. Quote:
nell'implementazione e nelle prestazioni. Quote:
Quindi tali vantaggi non sono più rilevanti come un tempo e per le applicazioni in cui lo sono gli ARM possono usare le estensioni THUMB che sono molto più efficienti su quel lato anche rispetto alle istruzioni x86. Quote:
Il grosso problema per Intel è la componente radio/modem, ma per tutto il resto (inclusa la GPU) non ha svantaggi significativi se non maggiori consumi legati al voler avere per forza maggiori prestazioni anche quando sarebbe il caso di pensare di più a ridurre i consumi. |
||||
![]() |
![]() |
![]() |
#45 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Il fatto che citi riguardo Sun è corretto, ma oggi i processori, anche RISC, includono CENTINAIA di istruzioni perché tendono a coprire particolari casi che però sono molto importanti. Vedi, ad esempio, il supporto al CRC32, all'AES, e allo SHA, che di recente è stato aggiunto su praticamente tutti i processori. Ma questo non c'entra nulla con le vecchie istruzioni legacy x86. Dimmi, secondo te, che utilità può avere una AAD, ad esempio? Infatti vorrei vedere il compilatore che riesce a riconoscere il contesto e a emetterla correttamente. Poi che siano presenti in vecchissimo codice e, dunque, eseguite, nulla da dire. Ma chi esegue quel codice? Rispetto alle centinaia e centinaia di milioni di PC che eseguono codice, sarà una sparuta minoranza di aziende che eseguono applicazioni DOS-based (magari "portate" su Windows con la classica... CUI). Viceversa, disassembla qualunque gioco o applicazione da un bel po' di anni a questa parte, e vedrai che i loro compilatori, come pure eventuali parti in assembly, non abbiano fatto uso di quelle istruzioni. Quote:
Riguardo all'efficienza dei RISC, immagino riguardi l'implementazione / facilità di esecuzione (a parte le eccezioni di cui sopra) e i relativi consumi. Quindi non a livello prestazionale (qui l'ISA incide, come già detto). Quote:
Per cui, ricapitolando: se prediligi le prestazioni ricorri a una serie di istruzioni ma espandi il codice (e stressi molto la cache codice & relativa banda di memoria). Se, invece, prediligi lo spazio, ricorri alla load e stressi la cache dati (e il memory controller). Ovviamente quest'ultimo caso vale solo se risulta semplice raggiungere la costante in memoria usando il piccolo offset che una LOAD mette a disposizione, altrimenti è facile che ti convenga la prima soluzione. Questo esposto è un caso molto comune in ambito RISC (e in generale di programmazione, ma i CISC hanno, in genere, la possibilità di specificare direttamente un valore immediato, anche lungo, per cui non si pongono tutti questi problemi), e coi quali i compilatori possono combattere quanto vogliono, ma le problematiche rimangono. Quote:
Dulcis in fundo, funziona soltanto a 32-bit: non ne è stata presentata una versione a 64-bit, ed è difficile che accada (perché si perderebbero i vantaggi dei 32 registri introdotti), anche se non impossibile (leggi: con molti più compromessi rispetto alla versione a 32-bit). Ma a parte questo, rimangono i problemi tipici dei RISC di cui ho discusso prima. Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
![]() |
![]() |
![]() |
#46 | ||||||
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Quote:
Quote:
Quote:
Infatti per esempio a parità di processo produttivo un core Cortex A53 (64bit armv8) occupa il 40% in meno di un core Cortex A9 (32bit armv7) ed in modalità a 64bit ha le stesse prestazioni in termini di capacità di elaborazione. L'A53 non ha le ottimizzazioni circuitali dell'A9 ma in modalità a 64bit se la gioca alla pari in termini di potenza i calcolo (suppongo nel senso di quando si elaborano dati in unita da 64bit). Insomma anche con l'aumento di complessità dovuto ai 64bit ed al supporto della modalità a 32bit si sono potuti permettere di togliere roba ed avere qualcosa di più "leggero" in termini di implementazione. [quote=cdimauro;41386945] Permettimi: i compilatori non posso superare i limiti dell'ISA, ma devono per forza conviverci. Se, ad esempio, hai da caricare un costante "grande" a 32-bit, puoi piangere in aramaico: o la costruisci con una serie di MOV con dati immediati più piccoli + shift + ADD / OR (oppure ricorrerendo ad approsite istruzioni di MOV che coinvolgono la parte alta del registro, per le ISA che ce l'hanno), oppure la carichi direttamente dalla memoria (e qui devi scomodare una ben più costosa LOAD dalla memoria, con tutto ciò che comporta). Per cui, ricapitolando: se prediligi le prestazioni ricorri a una serie di istruzioni ma espandi il codice (e stressi molto la cache codice & relativa banda di memoria). Se, invece, prediligi lo spazio, ricorri alla load e stressi la cache dati (e il memory controller). Ovviamente quest'ultimo caso vale solo se risulta semplice raggiungere la costante in memoria usando il piccolo offset che una LOAD mette a disposizione, altrimenti è facile che ti convenga la prima soluzione. Questo esposto è un caso molto comune in ambito RISC (e in generale di programmazione, ma i CISC hanno, in genere, la possibilità di specificare direttamente un valore immediato, anche lungo, per cui non si pongono tutti questi problemi), e coi quali i compilatori possono combattere quanto vogliono, ma le problematiche rimangono. Quote:
Quando si eseguono istruzioni ARM quello stadio viene semplicemente bypassato. Insomma, il supporto di THUMB non pesa sulla decodifica ed esecuzione delle istruzioni ARM a 32bit e quando viene attivato l'incremento di densità delle istruzioni compensa ampiamente gli svantaggi ... presenti solo in modalità THUMB. Quote:
Se poi consideri che THUMB è stato introdotto essenzialmente per dare il compo di grazia alla concorrenza che per roba embedded proponeva cpu a 16bit o anche ad 8bit ... Poi sarebbe il caso di ricordare che il vantaggio di compattezza del codice "asimmetrico ed irregolare" degli x86 non è stato decisivo nei confronto degli altri RISC ... ma nei confronti degli Itanium. ![]() |
||||||
![]() |
![]() |
![]() |
#47 | ||||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
![]() A parte questo, la realtà di x86 (e x64) è che la stragrande maggioranza delle istruzioni si mappa 1:1 con le uop, perché... si tratta di istruzioni semplici. Dunque non serve un decoder enormemente complesso per gestire il caso peggiore, con istruzioni molto lunghe (che sono una rarità) o che fanno uso di tanti prefissi (al più se ne usa uno, e questo avviene o per indirizzare memoria locale del thread, oppure quella del s.o., oppure per mappare le istruzioni SIMD). Difatti già da parecchi anni esiste UN solo decoder complesso per gestire tutti i casi possibili, che è affiancato da 2 o 3 (nei processori degli ultimi anni) decoder molto più semplici (ed efficienti / parchi di energia & transistor) che si smazzano le istruzioni molto più comunemente usate. Ecco qui un link a un articolo interessante in merito, di cui riporto alcune parti significative: "In a typical x86 program, more than 2/3 of the instructions are simple enough to be represented by a single (non-fused) micro-op. Most of the other 1/3 can be decoded into 4 micro-ops or less, with a (very) few taking more to execute. Recognizing these facts, especially the 2:1 simple-to-complex ratio, the P6 design divides its decoders into the well-known 4-1-1 structure, giving only one decoder full capability: [...] By differentiating the decoders and put performance emphasis on the common simple-instruction cases, instruction decode and issue complexity can be minimized, and higher clock rate can be reached. RISC design rule #1: Make the common-case fast." Mi sembra sia abbastanza eloquente. ![]() Per informazioni più dettagliate sui decoder delle varie micro-architetture, c'è il solito Agner Fog e il suo omnio manuale. ![]() Quote:
Quote:
Quote:
Ha senso parlare di zavorra eliminata soltanto per processori che implementino esclusivamente ARMv8 come architettura. Quote:
Quote:
Quote:
Quote:
Non ho dati in merito, e mi piacerebbe vederne qualcuno, ma per quello che ho visto delle due ISA la mia esperienza mi porta a dedurre che sia così. Quote:
Checché se ne dica, la densità di codice rimane molto importante a prescindere, perché non impatta soltanto sullo spazio occupato, ma anche sulla banda di memoria e sulle cache TLB. Ecco perché tanti produttori di RISC alla fine sono stati costretti a calare le corna, e adottare un'ISA a lunghezza variabile (e, dunque, CISC; questo era uno dei punti fermi e distintivi fra le due macro-famiglie). Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||||||
![]() |
![]() |
![]() |
#48 | ||||||
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Quote:
Non a caso gli ARM erano i "meno RISC" tra le cpu uscite negli anni '80 e '90 (quasi tutte le istruzioni erano condizionali con cose tipo addizioni a tre operanti e barrel shifter bidirezionale sul terzo operando). Ad esempio, il seguente statement in C: a = b + (c << 2); Corrisponde ad un singola istruzione ARM se a,b e c sono già caricati in registri: ADD Ra, Rb, Rc, LSL #2 Ma anche le altre cpu RISC avevano le loro particolarità (i set di registri "a finestre" degli SPARC, l'execution slot dopo i jump dei MIPS, ecc.). Quote:
Quote:
Nel caso dei Thumb si possono pure implementare come "uno stadio in più" su un decoder ARM32 con costi ridottissimi in termini di implementazione rispetto ad un decoder "completo". Senza contare lo schema di estensioni basato sui coprocessori. Quote:
per ARM è stato possibile realizzare il Cortex A53 (la versione "economica" ed a basso consumo della prima generazione ARMv8) in modo da renderlo competitivo a parità di tecnologia di implementazione con un Cortex A9 sia in termini di prestazioni che di area su chip. Quote:
I RISC furono davvero battuti a livello di prestazioni per quel che riguarda desktop e server solo quando Intel cominciò a produrre cpu con 1..2 step di scala d'integrazione di vantaggio sulla concorrenza RISC. Mentre per tutto il resto del tempo fu la retrocompatibilità con il software x86 già in circolazione a fare la fortuna di Intel. Senza contare che a far fuori definitivamente MIPS ed Alpha nel settore server furono gli accordi commerciali in vista dell' "inevitabile" successo degli Itanium. |
||||||
![]() |
![]() |
![]() |
#49 | ||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Non mi possono raccontare che fosse una buona scelta all'epoca, perché la tendenza dei 32-bit era già ben delineata, coi maggiori produttori di CPU che avevano sfornato o stavano per sfornare ISA pienamente a 32-bit. Quote:
Le applicazioni andavano ricompilate, oppure riscritte nelle parti in assembly che manipolavano il PC (e relativi flag). Quote:
Ma almeno un paio di punti per discernere se un'ISA è RISC o CISC dovrebbero essere rimasti: esclusivo modello load/store per l'accesso alla memoria e opcode a lunghezza fissa, mentre viceversa possibilità per (la maggior parte del)le istruzioni di accedere direttamente alla memoria e opcode a lunghezza variabile. Il tutto IMO, ovviamente, ma qualcosa serve per distinguere le due famiglie, altrimenti parliamo soltanto di processori e ISA senza tenere conto di queste due etichette. ![]() Quote:
Quote:
Quote:
![]() Quote:
Quote:
Non è stata questione di processo produttivo, ma di prestazioni. Poi sei ci fossero anche accordi commerciali, questo non lo so, ma non cambia nulla dal punto di vista prestazionale.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||
![]() |
![]() |
![]() |
#50 | ||||||
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Si voleva una cpu molto efficiente su hardware che non fosse troppo costoso, con una gestione degli interrupt molto rapida ecc. ecc. da usare su un home computer non su dei server. Per questo mentre gli altri RISC debuttavano sui server e poi tentavano la "discesa" negli altri settori, ARM nacque già ad un passo dal settore embedded. Quote:
(e lo sono stati molto a lungo) e si pensava di usarlo su prodotti che non avrebbero richiesto grandi quantità di ram prevedibilmente molto più a lungo di quanto serviva sui server e simili. Poi combinare program counter e status register in un unica word a 32bit eliminava 1 load ed 1 store ad ogni chiamata di funzione C ed assembly, non era una cosa da poco; faceva parte delle tante piccole migliorie che rendevano gli ARM così performanti. Quote:
Il "problema" del passagio di codice "a 26bit" verso i 32bit non era così differente da quello che avveniva con gli x86 a 16 bit (modello "small" a 64KB di dati, "large" a segmenti con limite di 64KB per una singola struct o array e "huge" con segment+offset gestiti emulando un puntatore con indirizzamento lineare). Quote:
(perche lo si può ottimizzare ulteriormente). Quote:
La transizione verso i 64bit degli ARM sta avvenendo in un contesto totalmente diverso da quando Intel tentò il "suo" passaggio ai 64bit ... con gli Itanium ed ARM non si fa problemi a seguire la strada tracciata dagli Alpha (letteralmente nati per essere cpu a 64bit "tutte prestazioni ed efficienza"). Quote:
![]() Furono letteralmente uccisi dall'accordo tra HP ed Intel, non perche non riuscissero a reggere il confronto. Mentre SGI fu pure costretta a prolungare di due generazioni lo sviluppo di cpu MIPS "da server/workstation" a causa dei problemi di prestazioni degli Itanium. |
||||||
![]() |
![]() |
![]() |
#51 | |||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Nell'84 Intel presentò l'80386, che rese disponibile nell'85. L'80386 consentiva 46 bit d'indirizzamento virtuale e 32 bit d'indirizzamento per la memoria fisica. Lo stesso anno Motorola presentò e commercializzò il 68020, che era dotato di bus esterno a 32-bit, e si poteva indirizzare fino a 4GB di memoria (o 16GB; vedi sopra per il 68012). Nell'84 era arrivato il Macintosh che montava un 68000, il quale poteva già indirizzare 16MB e fino a 64MB (idem come sopra per il 68012), ma queste limitazioni erano esclusivamente dovute alla dimensione del bus esterno: internamente l'architettura era 32-bit era lo spazio d'indirizzamento era 32-bit. Era Motorola che, per meglio differenziare il suo catalogo e i target di mercato, offriva processori con bus esterni (indirizzo e/o dati) castrati (vedi anche 68008: bus indirizzi a 20 e dati a 8, ma i registri dati e indirizzi erano sempre a 32-bit, come per tutta la famiglia di processori 68K fin dal day 1). Nell'85 arrivano Atari ST prima e Amiga dopo, che montavano entrambi il 68000. Il primo modello di ARM fu presentato nell'85 (quindi un anno dopo la presentazione del 386 e dello 020, e di cui Acorn era sicuramente a conoscenza), ma il primo prodotto arrivò soltanto l'anno dopo. Il primo Archimedes arrivò soltanto nell'87, per competere finalmente nel mercato dei personal computer. Con ciò voglio dire che Acorn, a mio avviso, sbagliò completamente il design dell'architettura ARM, con quel limite invalicabile dei 26 bit di spazio d'indirizzamento. Il trend dell'industry era ben noto e consolidato, come ho mostrato. Il fatto che all'epoca non esistessero personal computer con 64MB o più di memoria fisica non vuol dire che non si potessero realizzare: era estremamente costoso farlo, senz'altro, e aveva poco senso all'epoca. Ma non c'era alcun limite fisico in ciò, che invece era presente negli ARM. E stiamo parlando della sola memoria fisica, ma più di 64MB di memoria virtuale avevano perfettamente senso già all'epoca. Quote:
Quote:
Quote:
Quote:
Per le architetture ARM a 26 e 32-bit, invece, i puntatori erano sempre della stessa dimensione: 32-bit. L'unica differenza è che nel primo caso alcuni bit erano a zero / inutilizzati, e che se si salvava il PC ci si trascinava dietro anche il registro di stato & flag (idem per il ripristino). Dunque le applicazioni non andavano cambiate per quanto riguarda l'indirizzamento della memoria (i puntatori rimanevano gli stessi), ma soltanto nelle parti di codice che manipolavano il PC e/o i flag. Quote:
Puoi vederlo come un decoder semplice di x86, che traduce un'istruzione x86 in un uop RISC: sarà quest'ultima a essere poi decodificata ed eseguita. Le versioni THUMB-only non hanno bisogno di questa traduzione, ovviamente, per cui non è necessario avere entrambi il decoder: ce n'è soltanto uno, più grosso di quello ARM ma inferiore alla somma dei decoder THUMB + ARM. Quote:
![]() Quote:
Per quanto riguarda x86, già verso la fine degli anni '90 aveva prestazioni sugli "interi" comparabili a quelle dei migliori RISC, Alpha incluso. Peccava nei calcoli in virgola mobile, complice la vecchia FPU x87. La musica, però, è cambiata con l'introduzione delle SSE, che con apposito codice consentivano prestazioni mediamente superiori anche all'Alpha. Alpha è una bella architettura, senz'altro, ma era votata esclusivamente alle prestazioni, e il codice era tutt'altro che denso. Oltre al fatto che la opcode table era già abbastanza inflazionata, e c'era ben poco spazio per aggiunte come una nuova unità SIMD. Con l'esplosione dei SIMD dubito che sarebbe rimasta competitiva. In ogni caso il suo target era esclusivamente quello dei server / workstation.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||||||||
![]() |
![]() |
![]() |
#52 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Visto che con certi compilatori l'ABI può variare anche in base alle opzioni di compilazione (uso oppure no di registri come base pointer, numero degli scratch register, ecc.), usare macro (in modo da cambiare il codice in un solo punto invece che ad ogni entry point o punto di chiamata) era una scelta quasi obbligata. Insomma, le modifiche richieste per il passaggio dal modello a 26bit a quello a 32bit con un ISA come quella degli ARM non mi sembrano così problematiche. |
|
![]() |
![]() |
![]() |
#53 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Insomma, 7 anni dopo la presentazione, ma 2 anni dopo il passaggio ad ARM Holdings che aveva idee differenti riguardo i possibili campi d'impiego. |
|
![]() |
![]() |
![]() |
#54 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
|
|
![]() |
![]() |
![]() |
#55 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
![]() Era ovvio che aveva codice poco "denso" rispetto ad un x86 nato come cpu a 16bit, ma era anche vero che nasceva con un set di 64 registri a 64bit (32 interi e 32 fp) e che la direttiva primaria era avere il massimo delle prestazioni ottenibili con un architettura a 64bit. Tra le altre cose aveva istruzioni SIMD (le MVI) ma i suoi progettisti per EV8 avevano già previsto di implementare un "vero" multithreading (non quella roba assurdamente mal dimensionata dei Pentium 4). Per rendere l'idea EV8 doveva avere 4 thread per core con sino ad 8 istruzioni per ciclo per thread (il numero di thread era dimensionato in modo tale che nel caso peggiore le pipeline funzionassero comunque a pieno regime o quasi). Roba che avrebbe prodotto prestazioni "da ottimizzazioni SIMD" anche eseguendo codice normale o che non poteva essere parallelizzato in modo efficiente con istruzioni SIMD. Roba che non si poteva fare con gli x86 senza modifiche radicali al loro set d'istruzioni (e per cui per essi l'unica strada percorribile era introdurre le SIMD e nuovi registri). SOLO DOPO EV8 era prevista l'aggiunta di estensioni SIMD "stile SSE2" per continuare a salire di prestazioni, guardacaso si trattava di registri a 128bit (non a 256bit o 512bit come per gli x86) perche per come era strutturata l'architettura conveniva di più "aggiungere thread" invece che "allargare troppo i registri". Il fatto che anche gli ARM (inclusi gli ARMv8) abbiano registri "SIMD" che sono "solo" a 128bit non è casuale. Il set d'istruzioni non è così irrilevante, ha influenzato l'evoluzione stessa degli x86 ed ora con ARMv8 forse si potrà verificare se la roadmap dei progettisti di Alpha influenza anche da un differente set d'istruzioni era valida oppure no. |
|
![]() |
![]() |
![]() |
#56 | ||||||||||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
Voglio dire, è paradossale che per i personal computer (e pure i server; infatti Acorn cercò di inserirsi anche nel mercato Unix) abbia proposto un'architettura castrata, salvo poi, diverso tempo dopo, riprogettarla in maniera più pulita quando si stava buttando sul settore embedded (che aveva, e spesso ha pure oggi, esigenze di gran lunga minori). Quote:
Quote:
![]() Quote:
Quote:
Quote:
![]() Quote:
Quote:
Per essere chiari, pensare di competere con un'unità SIMD con un'architettura come quella di EV8 è come sparare a una mosca con un cannone: hai messo in campo enormi risorse quando la problematica ne richiede molte meno per essere risolta. Comunque ne parlo meglio dopo. Quote:
Non c'è nulla che impedisca di fare lo stesso con x86. Non lo si fa perché i vantaggi non sono commisurati all'implementazione troppo complicata. Oggi ci sono altre vie per ottenere prestazioni anche migliori; vedi sotto. Quote:
![]() Quote:
Quote:
E se Alpha aveva deciso di introdurre un'unità SIMD dopo EV8, sarà stato sicuramente a causa dell'enorme complessità dell'implementazione di EV8 per gestire tutta quella roba, che invece con un modello SIMD è di gran lunga più semplice (i registri "larghi" servono anche a questo: a "spalmare" la complessità di gestione dei registri sulla loro ampiezza. Meno registri ma più larghi -> molta meno logica per gestire il tutto). Quote:
Quote:
![]() Stamattina mi sono divertito a smazzarmi un po' di documentazione sugli Alpha, inclusa la opcode table. Le istruzioni load/store e di salto si mangiano più di metà dello spazio, ma ho visto che ci sono diversi buchi che potrebbero essere tranquillamente utilizzati per implementare le istruzioni di load/store per l'unità SIMD, come pure le istruzioni necessarie; con un'opportuna codifica ci sarebbe anche spazio per istruzioni quaternarie (con 4 registri; molto utili per particolari istruzioni come FMAC & FMA). Altra cosa interessante è il fatto che Alpha è comunque abbastanza complessa come ISA, contando qualche centinaia di istruzioni (fra cui alcune per il "legacy" che si porta dietro dai VAX), di cui alcune abbastanza complicate. La ricordavo molto più semplicemente, ma evidentemente anche Digital ha pensato di allinearsi alla tendenza ormai delineata, inserendo istruzioni specializzate nella sua ISA. Rimane sempre una "bella" architettura, anche se scarsamente densa per il codice. Ma gli obiettivi, appunto, erano ben altri.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||||||||||
![]() |
![]() |
![]() |
#57 | |
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Il motivo per cui intendevano aggiungere istruzioni SIMD con registri a 128bit era perche con essi avrebbero aggiunto nche il supporto in hardware dei float a 128bit (con "gratis" altre istruzioni SIMD che tornavano utili). Non si erano spinti oltre perche se si esagera con l'ampiezza dei registri si hanno maggiori limitazioni sulla frequenza operativa massima (per tener sotto controllo il clock skew) e su quanti thread si possono eseguire in simultanea. I progettisti di Alpha privilegiavano il multithreading perchè il software che facevano girare traeva più vantaggio senza dover ricompilare dal multithreading che dalle istruzioni SIMD, inoltre questo permettera di scalare maggiormente di prestazioni senza dover cambiare il set d'istruzioni per accomodare registri SIMD più grandi in mancanza di alternative migliori come attualmente fa Intel. Inoltre con il multithreading si possono aggiungere ulteriori thread o rimuoverli completamente dall'implementazione mantenendo la retrocompatibilita totale con il software già sviluppato, mentre è più complicato "tornare indietro" se si cambia il set d'istruzioni (e diventa sempre più complicato "andare avanti" aggiungendo nuove istruzioni). Non si risolve tutto a colpi di registri SIMD sempre più ampi. Intel segue una certa strada perche le sono precluse altre opzioni che invece erano disponibili per gli Alpha. |
|
![]() |
![]() |
![]() |
#58 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
Riguardo al numero di thread, l'unica famiglia di processori x86 che ne adotta 4 per core è Xeon Phi, che ha registri SIMD a 512-bit, ma frequenze ridotte per contenere i consumi. Per cui non si può prendere a campione per analizzare l'impatto della lunghezza dei registri SIMD sul numero di thread. Quote:
Quote:
![]() Quote:
Finora aumentare l'ampiezza dei registri SIMD ha dato ragione a Intel, come pure l'assenza di implementazioni multithreading estremamente aggressive da parte di altri vendor (eccetto IBM con POWER8 che dovrebbe essere confrontabile con EV8, se non ricordo male, ma presenta consumi elevatissimi ed è pensato per ambiti molto specializzati). La microelettronica non è il mio campo, ma a naso direi che quest'ultima soluzione crea decisamente più problemi rispetto alla prima, ed è il motivo per cui sia praticamente scomparsa a favore della prima soluzione. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||
![]() |
![]() |
![]() |
#59 | ||||
Senior Member
Iscritto dal: Jan 2007
Messaggi: 6007
|
Quote:
Non erano "nuove" ed evidentemente non c'era tutta quell'urgenza di introdurre nuove istruzioni SIMD. Quote:
Quote:
Quote:
(vedi le soluzioni multi-core ARM). Ma come tu stesso hai notato, dove sono le prestazioni il requisito primario e dove il set d'istruzioni lo permette (i POWER di IBM) si segue un approccio multi-thread e multi-core. L'approccio SIMD "modalità smodata" è un "successo" (per gli x86) perchè Intel è ritornata a dettar legge riguardo i set d'istruzioni x86 (dopo che AMD per una volta riuscì ad imporre come standard di fatto x86-64, ma ci riuscì solo per il supporto di Microsoft che si rifiutò di supportare un altro standard a 64bit per x86 come Intel era disposta a fare). Tutti gli altri hanno introdotto nel tempo istruzioni SIMD ma "guardacaso" si sono limitati a registri a 128bit (Altivec, NEON, e MIPS SIMD) e se servivano maggiori prestazioni hanno aumentato il numero di core. |
||||
![]() |
![]() |
![]() |
#60 | ||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
In ogni caso le applicazioni eseguono in genere soltanto codice scalare (per l'FPU, intendo) o vettoriale. Per cui riutilizzare lo stesso register set per entrambi è una gran comodità. Specialmente nel caso dell'introduzione dei float a 128-bit, visto che si tratta di codice scalare e Alpha ha già un'FPU molto veloce e potente, sarebbe stato meglio estenderne i registri a 128-bit e aggiungere il supporto questo nuovo tipo di dato. D'altra parte l'FPU supporta pure il formato floating point VAX (per questioni legacy, ovviamente), e dunque gestire un altro tipo non sarebbe certo un problema. A questo punto avendo esteso l'FPU con registri a 128-bit, si sarebbero potuti aggiungere gli opcode opportuni (e distinti) per i calcoli vettoriali SIMD. Quote:
Voglio dire: non è certo un problema per il decoder gestire le nuove istruzioni SIMD che operano su 256-bit. Non è certamente questo che limiterebbe la frequenza massima raggiungibile dal processore. La tua tesi era che l'aumento della dimensione dei registri SIMD portasse a problemi nello scalare in frequenza. L'introduzione delle AVX con registri a 256-bit (tock) non ha mostrato nulla di ciò, pur usando lo stesso processo produttivo della precedente famiglia di processori (tick). Vedremo poi fra Broadwell (AVX2, 256-bit) e Skylake (AVX-512, 512-bit) cosa succederà, nelle medesime condizioni. Quote:
Quote:
Quote:
Quote:
Comunque cosa doveva fare Intel? Continuare a mettere pezze all'ISA per le SSE? Se dai un'occhiata alla struttura degli opcode di AVX, ti renderai conto da solo che rappresenta il classico uovo di Colombo per quest'architettura: opcode molto semplici da decodificare (nessun prefisso!), che consentono codice molto denso, supporto alle operazioni ternarie, estensione dei registri a 256-bit, e una schema pensato per future estensioni senza mettere pezze. Quote:
Nel frattempo Intel continuerà per la sua strada, allargando i registri SIMD, raddoppiando le prestazioni in maniera più economica rispetto all'aggiunta di core (una sola istruzione da decodificare, ma molte più operazioni eseguite: SIMD docet), e offrendo anche un supporto migliore alla doppia precisione. Sì, perché dimentichi anche è ormai possibile eseguire 4 operazioni a doppia precisione per ciclo di clock con le AVX, grazie al fatto che in 256-bit è possibile impacchettare 4 dati di questo tipo. Se in futuro verrà aggiunto il supporto a precisione quadrupla a 128-bit, con le AVX-512 sarà possibile fare lo stesso. Gli altri RISC potranno pure continuare a usare registri a 128-bit, e offrire prestazioni castrate per questi tipi di dati, che perà sono sempre più utilizzati.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||||||||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:11.