|
|
|
![]() |
|
Strumenti |
![]() |
#81 | ||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
![]() Quindi istruzioni complesse e lente anche per i RISC. Diciamo che finora è la prima volta che sento parlare di un RISC con opcode a lunghezza variabile, ma dopo il Thumb di ARM mi sono dovuto ricredere. ![]() Quote:
![]() Quote:
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 |
||||||
![]() |
![]() |
![]() |
#82 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dopo aver letto la news su Tilera... Pensare a qualche ISA VLIW con obiettivo il massimo sfruttamento delle unità di esecuzione ?
Il mercato si sta spostando fortemente verso il multi-threading. Costruire un core semplice RISC o VLIW con sincronizzazione esplicita fra thread non sarebbe secondo me un brutta idea. |
![]() |
![]() |
![]() |
#83 | ||||
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
Quote:
![]() Argh !!! Quote:
![]() Quote:
![]() |
||||
![]() |
![]() |
![]() |
#84 |
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Anteprima
Vi faccio un'anteprima sul set istruzioni a 32 bit:
Poiché volevo semplificare il design ed evitare la parola di estensione, ho inglobato nell' opcode alcuni campi che erano su quest'ultima (come ad esempio il registro indice e la scala). Il problema è che in tutte le altre modalità di indirizzamento questi campi rimanevano inutilizzati, quindi per sfruttarli al massimo ho aperto la fantasia e ho riempito una nuova tabella di modi di indirizzamento. Codice:
Mode| Index Reg. |Operand Reg | Syntax 000 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale] | Indirect address with scaled index 001 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale]+ | Indirect address with scaled index and writeback 010 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale, SInt16] | Indirect address with scaled index and signed 16 bits offset 011 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale, SInt16]+ | Indirect address with scaled index, writeback and signed 16 bits offset 100 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale, SInt32] | Indirect address with scaled index and signed 32 bits offset 101 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale, SInt32]+ | Indirect address with scaled index, writeback and signed 32 bits offset 110 |Index Reg no|Op. Reg. no | [Rn, Ri * Scale, SInt64] | Indirect address with scaled index and signed 64 bits offset 111 | 0000 |Op. Reg. no | Rn + Uint3 | Register plus Uint3 (in the "scale" field) <--- potentissima feature 111 | 0001 |Op. Reg. no | Rn - Uint3 | Register less Uint3 (in the "scale" field) 111 | 0010 |Op. Reg. no | [Rn] + Uint3 | Indirect address with postadd of "Uint3" 111 | 0011 |Op. Reg. no | [Rn] - Uint3 | Indirect address with postsubtract 111 | 0100 |Op. Reg. no | Uint3 + [Rn] | Indirect address with preadd 111 | 0101 |Op. Reg. no | Uint3 - [Rn] | Indirect address with presubtract 111 | 0110 |Op. Reg. no | [Rn, Uint3] | Indirect address with 3 bits unsigned offset 111 | 0111 |Op. Reg. no | [Rn, Uint3]+ | Indirect address with 3 bits unsigned offset and writeback 111 | 1000 |Op. Reg. no | [Rn, SInt16] | Indirect address with signed 16 bits offset 111 | 1001 |Op. Reg. no | [Rn, SInt16]+ | Indirect address with signed 16 bits offset and writeback 111 | 1010 |Op. Reg. no | [Rn, SInt32] | Indirect address with signed 32 bits offset 111 | 1011 |Op. Reg. no | [Rn, SInt32]+ | Indirect address with signed 32 bits offset and writeback 111 | 1100 |Op. Reg. no | [Rn, SInt64] | Indirect address with signed 64 bits offset 111 | 1101 |Op. Reg. no | [Rn, SInt64]+ | Indirect address with signed 64 bits offset and writeback 111 | 1110 |Op. Reg. no | **** | Reserved 111 | 1111 | 0000 | **** | Reserved 111 | 1111 | 0001 | [PC, SInt16] | Indirect PC with signed 16 bits offset 111 | 1111 | 0010 | [PC, SInt32] | Indirect PC with signed 32 bits offset 111 | 1111 | 0011 | [PC, SInt64] | Indirect PC with signed 32 bits offset 111 | 1111 | 0100 | [SP]+ | Indirect SP with postincrement <--- potentissima feature (POP) 111 | 1111 | 0101 | [SP, UInt16] | Indirect SP with unsigned 16 bits offset 111 | 1111 | 0110 | [SP, UInt32] | Indirect SP with unsigned 32 bits offset 111 | 1111 | 0111 | -[SP] | Indirect SP with predecrement <--- potentissima feature (PUSH) 111 | 1111 | 1000 | [FP, UInt3] | Indirect FP with UNsigned 3 bits offset 111 | 1111 | 1001 | [FP, SInt16] | Indirect FP with signed 16 bits offset 111 | 1111 | 1010 | [FP, SInt32] | Indirect FP with signed 32 bits offset 111 | 1111 | 1011 | [FP, SInt64] | Indirect FP with signed 64 bits offset 111 | 1111 | 1100 | [UInt16] | Absolute zero-extended 16 bits address 111 | 1111 | 1101 | [UInt32] | Absolute zero-extended 32 bits address 111 | 1111 | 1110 | [UInt64] | Absolute 64 bits address 111 | 1111 | 1111 | Value | Immediate Codice:
MOV.s Md, Ms |31 30 |29 28 27 |26 25 24 |23 22 21 20 |19 18 |17 16 15 |14 13 12 |11 10 9 8 | 7 6 5 4 | 3 2 1 0 | | 0 0 | Scale s | modalità s| Registro i s | Size | Scale d | modalità d| Registro i d | Registro s | Registro D | # Muove qualsiasi cosa in qualsiasi cosa :D ![]() Ultima modifica di Z80Fan : 24-06-2010 alle 17:17. |
![]() |
![]() |
![]() |
#85 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il mio intervento era per dire che, vista l'esperienza che mi sembra che abbiate, sarebbe bene provare ad implementare qualcosa di innovativo che una architettura CISC, comoda per il programmatore, ma scomoda per il progettista
![]() Anche solo per vedere qualcosa che almeno io non ho mai visto. Nei vari corsi di studio ho sia progettato processori CISC (x86) che RISC, ma mai un VLIW. Tra l'altro quella CPU Tilera dovrebbe avere una feature molto interessante, cioè una specie di SMT al contrario: più core possono lavorare contemporaneamente sullo stesso thread. Sarebbe quindi interessante esplorare questi lidi ![]() |
![]() |
![]() |
![]() |
#86 | |
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
![]() ![]() Una specie di "VLIW" (che "very long" non è, però ci sono più istruzioni in un bundle da 32 bit) è questo: http://www.6502.org/users/dieter/tinst/tinst_0.htm Oppure, possiamo fare una cpu che usa la pipeline allo stesso modo dell' ELEA 9003: ogni blocco della pipeline non lavora su un pezzo dell'istruzione seguente dello stesso thread, ma lavora su istruzioni di thread diversi (l'ELEA, che aveva 3 stadi di pipeline, poteva lavorare su 3 thread contemporaneamente). |
|
![]() |
![]() |
![]() |
#87 | |||||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Basta porre A0 = Indirizzo di inizio + 2 (era questo l'offset che avevi messo prima), e sfruttare poi quell'istruzione con l'update di A0 con l'indirizzo calcolato dall'AGU. Quote:
Sul resto concordo. ![]() Quote:
Quote:
Queste saranno le ultime istruzioni a cui penserò. Quote:
Tra l'altro mi hai fornito lo spunto per eliminare le istruzioni di PUSH e POP, sfruttando due delle tre modalità d'indirizzamento che erano rimaste libere, così da avere -[SP] e [SP]+. In questo modo ho pure recuperato 9 bit dall'opcode table a 16 bit. Grazie! ![]() Quote:
![]() Quote:
![]() Comunque i design che stiamo tirando fuori non sono complicati da implementare a livello di decoder, perché sono abbastanza lineari e ortogonali, senza eccezioni (a parte per i "buchi" lasciati liberi dalle istruzioni non implementate). 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 |
|||||||||
![]() |
![]() |
![]() |
#88 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Non hanno tenuto conto di alcune cose che avrebbero permesso di ottimizzare e sfruttare come si deve l'opcode a 32 bit.
__________________
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 |
|
![]() |
![]() |
![]() |
#89 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ovviamente allungherebbe l'opcode, ma semplificherebbe altre cose. Ad esempio l'esecuzione potrebbe essere in-order, o al limite anche out-of-order ma in base al raggruppamento. Consideriamo anche che essendo RISC l'analisi delle dipendenze da parte del compilatore è molto più semplice visto il numero ridotto di opcode... Faccio un esempio: supponiamo di avere due LOAD/STORE pipeline... Codice:
grp dep 1 0 LOAD R0, op1 1 0 LOAD R1, op2 2 1 LOAD R2, op3 3 1 ADD R0, R1 3 2 SUB R0, R2 4 3 SHR R0, 6 1 0 LOAD R3, op4 1 4 STORE op1, R0 Ultima modifica di cionci : 25-06-2010 alle 08:54. |
|
![]() |
![]() |
![]() |
#90 | ||||
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
Codice:
MOV.Q vett, A0 QMOVEU 8, D7 ciclo: MOV.Q [A0, D7, 0]+, D0 <elabora> Bcc ciclo Quote:
![]() Quote:
![]() Quote:
Codice:
0 LOAD R0, op1 1 LOAD R1, op2 2 LOAD R2, op3 1 ADD R0, R1 2 SUB R0, R2 2 SHR R0, 6 0 LOAD R3, op4 2 STORE op1, R0 Ad esempio, ADD R0, R1 dipende da R0 e R1, la più vicina istruzione che scrive un dato dipendente è LOAD R1, op2 (aggiorna/scrive R1), alla quale è stato assegnato il numero 1, quindi all'ADD sarà assegnato lo stesso 1. Il lavoro della pipeline è questo: quando entra un'istruzione, controlla il suo numero con i numeri di tutte le istruzioni in quel momento sulla pipeline. Se è presente lo stesso numero, l'istruzione è bloccata finchè l'istruzione non esce o supera lo stadio di scrittura-risultato (che tipicamente è l'ultimo). Possiamo usare il numero speciale 0 per indicare un'istruzione che può essere eseguita tranquillamente. Il problema però nella dipendenza esplicita, è che i programmi possono diventare incompatibili cambiando processore, anche della stessa architettura: se un programma è stato ottimizzato per un processore con al più 5 stadi di pipeline, in un processore da 6-7-8 potrebbe non funzionare più, perchè dati dipendenti potrebbero essere ancora dentro la pipeline. |
||||
![]() |
![]() |
![]() |
#91 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Tutte le istruzioni del gruppo possono essere eseguite in parallelo (quindi sì, possono essere eseguite fuori ordine per sicurezza).
La dipendenza indica quale gruppo di istruzioni deve essere eseguito prima di dover eseguire quella istruzione del gruppo. 0 indica che non ci sono dipendenze. Mi sono accorto di aver inserito un errore, volevo scrivere un'altra cosa ![]() Codice:
grp dep 1 0 LOAD R0, op1 1 0 LOAD R1, op2 2 1 LOAD R2, op3 3 1 ADD R0, R1 3 2 SUB R2, 2 4 3 SUB R0, R2 5 4 SHR R0, 6 1 0 LOAD R3, op4 1 5 STORE op1, R0 Così come l'ho messo io, supponendo di avere 2 unità LOAD/STORE e 2 ALU è possibile eseguire le prime due LOAD contemporaneamente. Poi possono essere allocate tutte le unità di esecuzione contemporaneamente potendo eseguire: Codice:
2 1 LOAD R2, op3 3 1 ADD R0, R1 3 2 SUB R2, 2 1 0 LOAD R3, op4 Supponendo che un gruppo sia composto da istruzioni in sequenza e che all'interno del gruppo le istruzioni sano ordinate per dipendenza, è possibile assegnare l'unità di esecuzione in modo relativamente semplice. |
![]() |
![]() |
![]() |
#92 | ||||
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
La cpu legge il primo load, ha dipendenza 0 quindi lo manda nella pipeline load/store n°1; legge la seconda load, non ha dipendenze, va in load/store n°2. Legge la 3^ load, ha dipendenza 1, quindi attende che le 2 istruzioni (perchè sono tutte gruppo 1) finiscano, quindi la manda nel load/store 1. prende l'add, la dipendenza 1 è soddisfatta, la manda all'alu 1. prende la sub, attende che il load r2 finisca (se non lo è già), e quindi la manda in alu 2, e così via. è giusto? Quote:
Codice:
0 LOAD R0, op1 1 LOAD R1, op2 2 LOAD R2, op3 1 ADD R0, R1 2 SUB R2, 2 2 SUB R0, R2 2 SHR R0, 6 0 LOAD R3, op4 2 STORE op1, R0 Quote:
Quote:
![]() |
||||
![]() |
![]() |
![]() |
#93 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì, hai capito...
Quote:
L'ho riscritta ed ho fatto ancora più casino, comunque credo tu abbia capito. |
|
![]() |
![]() |
![]() |
#94 | |
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
Si. |
|
![]() |
![]() |
![]() |
#95 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
mi sono letto tutto il thread adesso, mi sembrava di essere di nuovo a lezione di architettura xD
non riuscirò ad intervenire ma seguirò la discussione ![]()
__________________
![]() ![]() |
![]() |
![]() |
![]() |
#96 | |
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#97 | ||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
e non è che brilli (come molti VLIW) per prestazioni GP... ![]() Quote:
![]() Quote:
![]() ![]() Quote:
Il 68050 (chiamato N050) del progetto Natami a cui stanno lavorando impiega anch'esso un singolo ciclo di clock nello stadio di calcolo dell'EA della pipeline per queste modalità, tranne appunto quelle con doppia indirezione (che anche noi non abbiamo). Il fatto è che i CISC complicati di un tempo non avevano pipeline efficienti come quelle più moderne, ovviamente, ma a meno di non esagerare non ci dovrebbero essere difficoltà. ![]()
__________________
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 |
||||
![]() |
![]() |
![]() |
#98 | |||
Senior Member
Iscritto dal: Sep 2009
Messaggi: 638
|
Quote:
Quote:
![]() Quote:
Codice:
MOVE.Size Source EA, Destination EA 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 | Size |Dest. Mode |Dest. Register|Source Mode |Source Reg.| |
|||
![]() |
![]() |
![]() |
#99 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
![]() Quote:
![]() EDIT: qui c'è il commento di Gunnar delle 18:53 in cui mostra come funziona la pipeline dell'N050 a cui sta lavorando.
__________________
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 Ultima modifica di cdimauro : 26-06-2010 alle 07:32. |
|||
![]() |
![]() |
![]() |
#100 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Magari assegnando l'unità di calcolo ancora prima della fase di decodifica in base a quel numerino e al tipo di istruzione, semplificando quindi ulteriormente la gestione interna del decoder. L'assegnazione delle unità di calcolo può essere fatto tramite una specie di priorità rotante. Ad esempio dovrebbe funzionare un algoritmo di questo tipo (utilizzando l'idea di Z80Fan per la precedenza): ALU(i) = ALU(i-1) + prec(i) - prec(i-1) LSU(i) = ALU(i-1) + prec(i) - prec(i-1) Secondo me può essere tranquillamente fatto in fase di fetch. Ovviamente è un conto che andrebbe fatto tutto in modulo (è più semplice farlo in hardware). Dopo la fase di decode si duplicano le varie unità. Si bloccano le unità che hanno indici di precedenza uguali a quelli in esecuzione. In fase di esecuzione ricordiamoci che siamo sicuri che non ci siano dipendenze, quindi si possono scrivere direttamente i risultati nei registri e liberare le istruzioni dipendenti già nella fase di esecuzione (ovviamente solo se la destinazione è un registro). Ultima modifica di cionci : 26-06-2010 alle 08:08. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:03.