La breve risposta
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.
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.
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.
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.