Quanti cicli di clock richiede un'istruzione RISC / CISC?


13

Secondo Digital Design e Computer Architecture di Harris e Harris, esistono diversi modi per implementare un processore MIPS, tra cui:

La microarchitettura a ciclo singolo esegue un'intera istruzione in un ciclo. (...)

La microarchitettura multiciclo esegue le istruzioni in una serie di cicli più brevi. (...)

La microarchitettura pipeline applica la pipeline alla microarchitettura a ciclo singolo.

Le architetture sono spesso classificate come RISC o CISC. Da RISC vs. CISC :

I processori RISC utilizzano solo semplici istruzioni che possono essere eseguite in un ciclo di clock.

Dato che MIPS è un'architettura RISC, sono un gruppo confuso dalle definizioni precedenti e mi chiedo se non vi sia una sorta di contraddizione tra loro. Più specificamente:

  1. Se un'istruzione RISC può essere suddivisa in cicli più brevi (Recupera, Decodifica, ...), come possiamo dire che è necessario un solo ciclo di clock per eseguire l'intera istruzione? Non è necessario un ciclo di clock per eseguire ciascuna delle fasi?
  2. Ci vuole davvero un ciclo di clock per eseguire un'istruzione RISC? Cosa succede, ad esempio, se si verifica un errore nella cache e il processore deve attendere una DRAM lenta? Questo non dovrebbe prolungare di un po 'l'esecuzione dell'istruzione?
  3. Cos'è esattamente un ciclo di istruzioni? È il tempo impiegato per il completamento di un'istruzione (ovvero uno / più cicli di clock)?
  4. Quanto tempo impiega un'istruzione CISC in cicli di clock / istruzione?

2
Di solito non meno di uno :-).
Russell McMahon,

Risposte:


22

Le definizioni pratiche di RISC e CISC sono così confuse e sfocate ora che sono quasi insignificanti. Ora è meglio pensarli come qualcosa di più sulla "filosofia", nel senso che un'architettura CISC ha un set di istruzioni più ricco con istruzioni individuali più potenti (ad esempio DIV e simili) mentre un set di istruzioni RISC è semplice e veloce, e lo lascia al compilatore per implementare operazioni complesse. Anche presumibilmente i set di istruzioni CISC (come x86) sono tradotti in istruzioni interne in entrambi i chip Intel e AMD e implementati più come processori RISC. Per rispondere alle tue domande:

  1. I processori RISC accademici originali (e penso che forse le prime versioni commerciali) abbiano effettivamente eseguito un'istruzione per ciclo, incluso il recupero e la decodifica. Questo è stato possibile perché i datapath erano super puliti perché le operazioni di ogni fase erano semplici e ben definite. (il compromesso qui è che solo le istruzioni molto semplici possono essere implementate in questo modo). Una volta che ha colpito il mondo reale le cose si sono offuscate. Cose come pipeline e architettura superscalare rendono impossibile una semplice dicotomia RISC / CISC.

  2. I chip RISC originali hanno tentato di eseguire un'istruzione per ciclo e potevano farlo se i dati erano disponibili nel file di registro. Ovviamente se il processore dovesse andare in DRAM ci vorrebbe un (molto) più tempo. RISC riguarda il "tentativo" di eseguire un'istruzione per ciclo.

  3. Un ciclo di istruzioni è il tempo impiegato tra i recuperi.

  4. In dipende enormemente dall'istruzione e dall'architettura del set di istruzioni. Anche in un'architettura CISC alcune istruzioni potrebbero essere eseguite molto rapidamente (come ad esempio uno spostamento a sinistra oa destra). Alcuni eseguiti molto lentamente (10 o più cicli). L'architettura VAX (probabilmente l'apice della filosofia CISC) aveva istruzioni davvero complesse. Per inciso, un'architettura CISC è di solito più facile da programmare in assembly rispetto a un'architettura RISC perché è quasi come un linguaggio di alto livello!


5

La breve risposta

  1. Le fasi di decodifica ed esecuzione dell'istruzione vengono eseguite in parallelo con la fase successiva dell'istruzione precedente. Questa tecnica è nota come pipelining. Vedi su Processori RISC di seguito.

  2. Un'architettura RISC a problema singolo avrà in media una media di meno di un'istruzione per ciclo a causa degli stati di attesa e del tempo impiegato per le operazioni di caricamento / archiviazione che colpiscono la memoria anziché essere semplicemente registrati per la registrazione. Le slot di ritardo ti danno un gancio architettonico che potrebbe permetterti di recuperare un po 'di tempo. Vedere i processori RISC di seguito.

  3. Un ciclo di istruzioni è il periodo di tempo necessario per eseguire un'istruzione. Questo varierà con l'architettura e (in alcuni casi) le istruzioni. Ad esempio, la maggior parte delle istruzioni su qualcosa come un MIPS R2000 / 3000 richiede un ciclo. Le istruzioni relative all'accesso alla memoria (caricamento / memorizzazione, branch) richiedono più di un ciclo, sebbene gli slot di ritardo significino che potresti essere in grado di eseguire qualcos'altro (possibilmente solo un NOP) nello slot di ritardo. Le architetture senza pipeline possono avere cicli di istruzione di diversi cicli di clock, che spesso variano con la modalità di indirizzamento. Vedi su Processori RISC, architetture CISC tradizionali e architetture cablate di seguito.

    I progetti a più numeri possono offuscare un po 'questo concetto eseguendo più di un'istruzione in parallelo.

  4. I processori CISC possono avere istruzioni che richiedono periodi di tempo variabili. Il numero esatto di cicli di clock dipende dall'architettura e dalle istruzioni. Il numero variabile di cicli di clock eseguiti sugli ISA CISC è uno dei motivi per cui sono difficili da integrare in architetture fortemente pipeline. Vedi le architetture CISC tradizionali di seguito.

La risposta più lunga

Per un singolo problema MIPS, SPARC o altra CPU, tutte le istruzioni (per una prima approssimazione) vengono emesse in un ciclo, sebbene possano avere qualcosa noto come "slot di ritardo".

Su processori RISC

In questo contesto, una CPU a singolo problema è quella in cui la CPU non esegue alcuna analisi di dipendenza al volo e l'emissione parallela di istruzioni come fanno le moderne CPU, ovvero hanno solo un'unità di esecuzione che esegue le istruzioni in l'ordine in cui vengono letti dal memoty. Più su questo più tardi.

La maggior parte dei vecchi processori RISC sono progetti a singolo problema e questi tipi sono ancora ampiamente utilizzati nei sistemi embedded. Un core RISC intero a 32 bit a numero singolo può essere implementato in circa 25.000-30.000 gate, quindi i core della CPU di questo tipo hanno un consumo energetico molto basso e ingombri molto ridotti. Ciò li rende facili ed economici da integrare nei prodotti SOC (system-on-chip).

I progetti di CPU RISC sono pipeline: l'elaborazione dell'istruzione viene eseguita in più fasi, con ogni istruzione passata dalla pipeline alla fase successiva ogni ciclo di clock. Nella maggior parte dei casi, una CPU pipeline a problema singolo eseguirà qualcosa di simile a un'istruzione per ciclo di clock.

Alcune architetture hanno istruzioni come diramazione o caricamento / archiviazione dalla memoria in cui il ciclo aggiuntivo richiesto dall'accesso alla memoria è visibile al codice.

Ad esempio, in un progetto SPARC V7 / V8 l'istruzione successiva dopo che un ramo viene effettivamente eseguito prima che avvenga il ramo stesso. In genere si inserisce un NOP nello slot dopo la diramazione, ma è possibile inserire un'altra istruzione se si trova qualcosa di utile da fare.

L' architettura MIPS R2000 / R3000 aveva uno slot di ritardo simile nelle istruzioni di caricamento / archiviazione. Se hai caricato un valore dalla memoria, non verrebbe effettivamente visualizzato nel registro per un altro ciclo. Potresti mettere un NOP nello slot o fare qualcos'altro se trovassi qualcosa di utile da fare che non dipendesse dall'operazione di caricamento che hai appena emesso.

Se la memoria fosse più lenta della CPU, come spesso accadeva, potresti ottenere ulteriori stati di attesa sugli accessi alla memoria. Gli stati di attesa bloccano la CPU per uno o più cicli di clock fino al completamento dell'accesso alla memoria. In pratica, questi stati di attesa e tempi supplementari per gli accessi alla memoria significano che i progetti di CPU a problema singolo hanno in media leggermente meno di un'istruzione per ciclo di clock. Gli slot di ritardo offrono alcune possibili opportunità per ottimizzare il codice eseguendo alcune altre istruzioni mentre viene eseguita un'operazione di memoria.

Processori CISC tradizionali

I processori CISC erano progetti che potevano avere istruzioni che richiedevano periodi di tempo variabili. Spesso avevano istruzioni più complesse implementate direttamente nell'hardware che avrebbero dovuto essere eseguite nel software su una CPU RISC.

La maggior parte delle architetture di mainframe e praticamente tutti i progetti di PC fino a M68K e Intel 386 erano CPU CISC microcodificate tradizionali. Questi progetti si sono rivelati più lenti per clock e hanno utilizzato più porte rispetto alle CPU RISC.

microcodice

Un esempio di architettura microcodificata (MOS 6502) può essere visto in emulazione qui . Il microcodice è visibile nella parte superiore dell'immagine.

Il microcodice controlla i flussi di dati e le azioni attivate all'interno della CPU per eseguire le istruzioni. Effettuando il ciclo attraverso i passaggi nel microcodice è possibile attivare le parti di una CPU, spostare i dati attraverso ALU o eseguire altri passaggi. I componenti riutilizzabili nella CPU possono essere coordinati su più cicli di clock per eseguire un'istruzione. Nel caso del 6502 alcune azioni pipeline potrebbero anche essere eseguite dal microcodice.

I progetti microcodificati hanno utilizzato meno silicio rispetto ai chip cablati a scapito del potenziale completamento di diversi cicli di clock per completare un'istruzione. A seconda della progettazione, queste CPU impiegherebbero tempi variabili per istruzione.

Architetture cablate

I progetti cablati (non necessariamente reciprocamente esclusivi con microcodice) eseguono un'istruzione in modo sincrono o possono avere i propri coordinatori per fare qualcosa attraverso più cicli di clock. In genere sono più veloci a scapito di hardware più dedicato e sono quindi più costosi da implementare rispetto a un design microcodificato con funzionalità equivalenti.

Un famoso esempio di ciò è stata la CPU originale Amdahl 470/6 , che era un sostituto drop-in per la CPU su alcuni modelli IBM System / 370. La CPU Amdahl era una progettazione cablata in un momento in cui le 370 CPU IBM erano fortemente basate sul microcodice. La CPU Amdahl era circa 3 volte più veloce delle CPU IBM che hanno sostituito.

Inutile dire che IBM non si è divertita e questo ha portato a una battaglia giudiziaria che ha finito per costringere IBM ad aprire la sua architettura mainframe fino alla scadenza del decreto di consenso alcuni anni fa.

In genere, un design cablato di questo tipo non era ancora così veloce come una CPU RISC come i diversi tempi e formati delle istruzioni non consentivano tanto spazio per il pipelining quanto un design RISC.

Disegni a più numeri

Le CPU più moderne sono architetture a più problemi che possono elaborare più di un'istruzione alla volta in un singolo thread. Il chip può eseguire un'analisi dinamica delle dipendenze sul flusso di istruzioni in entrata ed emettere istruzioni in parallelo dove non vi è alcuna dipendenza dal risultato di un calcolo precedente.

Il throughput di questi chip dipende dalla quantità di parallelismo che può essere raggiunta nel codice, ma la maggior parte delle CPU moderne calcolerà la media di diverse istruzioni per ciclo sulla maggior parte del codice.

Le moderne CPU Intel e altre CPU ISA x86 / X64 hanno un livello che interpreta le istruzioni CISC della vecchia scuola impostate in micro istruzioni che possono essere alimentate attraverso un core multiprocesso in stile RISC pipeline. Questo aggiunge un sovraccarico che non è presente nelle CPU con ISA progettati per il pipelining (ovvero architetture RISC come ARM o PowerPC).

Disegni VLIW

I progetti VLIW, di cui Intel Itanium è forse il più noto, non sono mai decollati come architetture tradizionali, ma in IIRC ci sono diverse architetture DSP che utilizzano questo tipo di design. Un design VLIW rende esplicito il problema multiplo con una parola di istruzione contenente più di un'istruzione che viene emessa in parallelo.

Questi dipendevano da buoni compilatori ottimizzanti, che identificavano dipendenze e opportunità di parallelismo, facendo cadere le istruzioni negli slot multipli disponibili su ogni parola di istruzione.

Le architetture VLIW funzionano abbastanza bene per applicazioni numeriche poiché le operazioni matrice / matrice tendono a offrire opportunità per un ampio parallelismo. L'Itanium ha avuto un mercato di nicchia nelle applicazioni di supercomputer per un po ', e c'era almeno un'architettura di supercomputer - la Multiflow TRACE - è stata prodotta utilizzando un ISA di questo tipo.

Memoria e memorizzazione nella cache

Le CPU moderne sono molto, molto più veloci della memoria, quindi le letture dirette dalla memoria possono generare centinaia di stati di attesa che bloccano la CPU fino al completamento dell'accesso alla memoria. La memorizzazione nella cache, ora eseguita su più livelli, contiene le posizioni di memoria utilizzate più di recente nella cache. Dato che le CPU in genere impiegano la maggior parte del tempo per eseguire il codice in loop, ciò significa che si ottengono buone percentuali di hit di riutilizzo delle posizioni di memoria utilizzate di recente. Questa proprietà è denominata "località di riferimento".

Dove si trova la località di riferimento, la CPU può funzionare a una velocità quasi ottimale. La cache non passa al livello successivo comporta una serie di stati di attesa; la cache mancante nella memoria principale può incorrere in centinaia.

Pertanto, la velocità effettiva dei chip della CPU può dipendere fortemente dall'efficienza dei modelli di accesso alla memoria. Libri interi sono stati scritti sull'ottimizzazione del codice per questo, ed è un argomento complesso a sé stante.


3

È una semplificazione per gli studenti.

Ogni processore non banale è sottoposto a pipeline. C'è un'unità di precaricamento che spala le istruzioni a un'estremità, un numero di unità di esecuzione nel mezzo che svolgono il lavoro effettivo e un'unità di emissione responsabile della dichiarazione delle istruzioni completate dopo che la scrittura nel registro o la memoria è terminata. Se ci sono più unità di esecuzione (ad esempio un intero ALU, un ALU in virgola mobile e un'unità vettoriale), potrebbe essere possibile emettere (a volte chiamato "ritiro") più istruzioni per ciclo di clock. Come può una CPU fornire più di un'istruzione per ciclo? entra in molti più dettagli su questo.

Come dici tu, e se ci fosse un ritardo mancante nella cache? Intel Hyperthreading è una nuova soluzione a questo: due lotti di registri di stato della CPU, un sacco di logica di controllo e unità di emissione. Non appena una CPU virtuale si blocca, passare allo stato dell'altra. (questa è una grossa semplificazione stessa)

Il risultato di ciò è che i moderni manuali della CPU forniscono tempi di istruzione molto più vaghi, ed è molto più difficile scrivere un codice di temporizzazione accurato dal ciclo, se per esempio stai provando a trasmettere video in tempo reale da hardware che non dovrebbe essere in grado di farlo .

(La risposta specifica a "Quanto dura un'istruzione CISC in cicli di clock / istruzione?" È "guarda nel manuale di riferimento del produttore e avrà i tempi per istruzione")


0

Gli altri ragazzi hanno scritto molto buon materiale, quindi terrò la mia risposta breve: ai vecchi tempi (qui negli anni '80), i processori a 8 bit del giorno (6800, 6502, Z80, 6809 e altri) erano considerati CISC. Alcune istruzioni potrebbero essere eseguite in 2 stili di clock, ma si trattava di semplici istruzioni come impostare / cancellare bit di flag in un registro di stato del processore. Altre istruzioni potrebbero richiedere da 2 a 6 e persino fino a 9 cicli di clock per l'esecuzione. Questi processori avevano alcune istruzioni abbastanza potenti, lo Z80 aveva alcune istruzioni per cancellare i blocchi di memoria che avrebbero scritto lo stesso valore in una serie di byte in memoria, cancellando efficacemente un blocco di grandi dimensioni in una singola istruzione, basta impostare alcuni registri ed eseguire il Istruzione LDIR (carica, incrementa e ripeti).

Il processore 6502 (dalla memoria) aveva 56 istruzioni ma 13 modalità di indirizzamento creando un potente set di istruzioni.

Il RISC è arrivato a lungo e ha adottato un approccio diverso, ha una manciata di istruzioni che si eseguono tutte in un singolo ciclo di clock. I programmi tendono ad essere più lunghi e occupano più memoria perché le istruzioni sono semplici in quali operazioni eseguono, quindi ne hai bisogno di più.

Se ricordo bene il primo tentativo di un'architettura RISC è stato il processore Transputer o Acorn Risc?


Probabilmente la prima architettura di tipo RISC con pipeline fu il CDC 6600 progettato da Seymour Cray. Passarono un paio di decenni prima che il termine RISC diventasse molto diffuso. MIPS, ARM e alcuni altri design di microprocessori RISC risalgono al periodo 1980-1985 con il primo hardware commerciale che utilizzava questi chip in uscita verso la metà degli anni '80.
Preoccupato di TunbridgeWells

I singoli chip transputer erano piuttosto veloci, ma non erano lo stesso tipo di architettura di quelli normalmente associati a un chip RISC. en.wikipedia.org/wiki/Transputer#Architecture
ConcernedOfTunbridgeWells

Ho un paio di trasmettitori in una custodia antistatica, solo parte di una collezione storica di microprocessori. Non li ho mai usati, a quei tempi sarebbe stato molto divertente sperimentarli.
Decano del

@ConcernedOfTunbridgeWells Ho appena dato un'occhiata al set di istruzioni CDC 6600. Mentre il design sembra incarnare (e anticipare) alcuni dei principi di RISC, l'istruzione di divisione in virgola mobile richiede 29 cicli per essere eseguita! E l'inclusione stessa di un'istruzione di divisione è contro i principi RISC tipici, ma grazie per il commento molto interessante!
crgrace

I principali attributi RISC-ish erano l'istruzione pipeline di meccanismi di recupero / decodifica / esecuzione e architettura load-store (ovvero nessuna modalità di indirizzamento con accessi di memoria impliciti per calcolare l'indirizzo). In effetti, alcuni set di istruzioni RISC (ad es. IBM POWER) sono in realtà piuttosto grandi ma utilizzano ancora l'approccio load / store per garantire tempi di esecuzione coerenti.
Preoccupato di TunbridgeWells
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.