Perché non è possibile avere sia istruzioni elevate per ciclo che velocità di clock elevate?


37

Il Mito Megahertz è diventato una tattica promozionale a causa delle differenze tra il processore INTEL 8086 del PC e il processore Rockwell 6502 di Apple. L'8086 funzionava a 4.77MHz mentre il 6502 funzionava a 1MHz. Tuttavia, le istruzioni sul 6502 richiedevano meno cicli; così tante in meno, infatti, ha funzionato più velocemente dell'8086. Perché alcune istruzioni richiedono meno cicli? E perché le istruzioni del 6502, che richiedono meno cicli, non possono essere combinate con un processore a ciclo rapido dell'8086?

L'articolo di Wikipedia per istruzioni per ciclo (IPC) dice

Fattori che regolano l'IPC
Un determinato livello di istruzioni al secondo può essere raggiunto con un IPC elevato e una bassa velocità di clock ... o da un IPC basso e una velocità di clock elevata.

Perché non è possibile avere sia istruzioni elevate per ciclo che velocità di clock elevate?

Forse questo ha a che fare con un ciclo di clock? Wikipedia menziona la sincronizzazione dei circuiti? Non sono sicuro di cosa significhi.

O forse questo ha a che fare con il funzionamento di una pipeline? Non sono sicuro del perché le istruzioni in una pipeline corta siano diverse dalle istruzioni in una pipeline lunga.

Qualsiasi intuizione sarebbe fantastica! Sto solo cercando di capire l'architettura dietro il mito. Grazie!

Riferimenti:

Istruzioni per ciclo rispetto al conteggio dei cicli aumentato

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle


1
> Perché alcune istruzioni richiedono meno cicli? RISC / CISC (beh, sorta di ). E perché le istruzioni del 6502, che richiedono meno cicli, non possono essere combinate con un processore a ciclo rapido dell'8086? Possono e hanno. Il problema è che una volta che hai già stabilito una base, è difficile abbandonare tutto e avviare il modello successivo da zero.
Synetech,

@Synetech, intel kinda sorta ha fatto presentando un'istruzione CISC impostata ai programmatori, quindi convertendola in istruzioni RISCier sul chip
soandos

Bene, quando ho detto che i due sono stati combinati, intendevo produttori di chip completamente diversi. Non ho un elenco a portata di mano, ma ce ne sono stati altri (non Intel / AMD) che hanno fatto cose del genere. (Molte persone dimenticano che ci sono molti produttori di chip perché Intel e AMD ora dominano il mercato desktop.)
Synetech,

Risposte:


21

tl; dr

Tubazioni più brevi significano velocità di clock più elevate, ma possono ridurre la produttività. Inoltre, vedi le risposte n. 2 e 3 in fondo (sono brevi, lo prometto).

Versione più lunga:

Ci sono alcune cose da considerare qui:

  1. Non tutte le istruzioni richiedono lo stesso tempo
  2. Non tutte le istruzioni dipendono da ciò che è stato fatto immediatamente (o addirittura da dieci o venti) istruzioni

Una pipeline molto semplificata (ciò che accade nei moderni chip Intel è oltre il complesso) ha diverse fasi:

Recupera -> Decodifica -> Accesso memoria -> Esegui -> Scrittura -> Aggiornamento contatore programma

Ad ogni -> è previsto un costo temporale. Inoltre, ad ogni tick (ciclo di clock), tutto si sposta da uno stadio all'altro, quindi il tuo stadio più lento diventa la velocità per TUTTI gli stadi (paga davvero che siano il più simili possibile in lunghezza).

Supponiamo che tu abbia 5 istruzioni e desideri eseguirle (foto tratta da Wikipedia, qui l'aggiornamento del PC non viene eseguito). Sarebbe così:

inserisci qui la descrizione dell'immagine

Anche se ogni istruzione richiede 5 cicli di clock per essere completata, un'istruzione finita esce dalla pipeline ogni ciclo. Se il tempo necessario per ogni stadio è 40 ns e 15 ns per i bit intermedi (usando la mia pipeline a sei stadi sopra), ci vorranno 40 * 6 + 5 * 15 = 315 ns per ottenere la prima istruzione.

Al contrario, se dovessi eliminare completamente la pipeline (ma mantenere tutto il resto uguale), ci vorrebbero solo 240 ns per ottenere la prima istruzione. (Questa differenza di velocità per ottenere la "prima" istruzione è chiamata latenza. In genere è meno importante della velocità effettiva, che è il numero di istruzioni al secondo).

Il vero diverso è che nell'esempio pipeline, ricevo una nuova istruzione (dopo la prima) ogni 60 ns. In quello senza pipeline, ne occorrono 240 ogni volta. Ciò dimostra che le pipeline sono brave a migliorare la produttività.

Facendo un ulteriore passo, sembrerebbe che nella fase di accesso alla memoria avrò bisogno di un'unità aggiuntiva (per fare i calcoli degli indirizzi). Ciò significa che se esiste un'istruzione che non utilizza lo stadio mem in quel ciclo, allora posso fare un'altra aggiunta. Posso quindi eseguire due fasi di esecuzione (con una in fase di accesso alla memoria) su un processore in un singolo tick (la pianificazione è un incubo, ma non andiamo lì. Inoltre, la fase di aggiornamento del PC avrà bisogno anche di un'unità aggiuntiva in il caso di un salto, quindi posso fare tre stati di esecuzione addizione in un segno di spunta). Avendo una pipeline, può essere progettato in modo tale che due (o più) istruzioni possano utilizzare fasi diverse (o fasi di salto di qualità, ecc.), Risparmiando tempo prezioso.

Si noti che per fare questo, i processori fanno molta "magia" ( esecuzione fuori ordine , previsione delle diramazioni e molto altro), ma ciò consente a più istruzioni di uscire più velocemente che senza una pipeline (si noti che anche le pipeline sono troppo a lungo sono molto difficili da gestire e comportano un costo maggiore solo aspettando tra le fasi). Il rovescio della medaglia è che se si allunga la pipeline troppo a lungo, è possibile ottenere una folle velocità di clock, ma perdere gran parte dei vantaggi originali (di avere lo stesso tipo di logica che può esistere in più punti ed essere utilizzato allo stesso tempo ).

Risposta n. 2:

I processori SIMD (single istruzione multiple data) (come la maggior parte delle GPU) svolgono molto lavoro su molte informazioni, ma impiegano più tempo. La lettura di tutti i valori richiede più tempo (significa un clock più lento, sebbene questo offset abbia un bus molto più ampio in una certa misura) ma è possibile eseguire molte più istruzioni alla volta (istruzioni più efficaci per ciclo).

Risposta n. 3:

Perché puoi "ingannare" allungando artificialmente il conteggio dei cicli in modo da poter fare due istruzioni per ogni ciclo (dimezzando la velocità del clock). È anche possibile fare solo qualcosa ogni due tick rispetto a uno (dando una velocità di clock 2x, ma non cambiando le istruzioni al secondo).


3
Tubazioni corte significano velocità più basse! Il Pentium 4 aveva clock elevati a causa delle lunghe condutture, ecco WP: "NetBurst differiva dal P6 (Pentium III, II, ecc.) Presentando una pipeline di istruzioni molto profonde per raggiungere velocità di clock molto elevate". Il punto è che fai poco per fase per raggiungere alte velocità. Ciò non si è rivelato fattibile, e Intel ha perso un grande slancio a causa di AMD. Sono tornati all'architettura Pentium 3 e hanno ideato "Core".
stolsvik,

@stolsvik, puoi spiegarlo? Non ha senso per me (avere meno fasi interstiziali significa che tutto il resto è uguale, i cicli di clock saranno più brevi, dando una velocità di clock più elevata)
soandos,

4
Viene eseguita una fase della pipeline per ciclo di clock ; L'intera pipeline avanza di un passo per clock, recuperando nuove istruzioni in basso, "emettendo" le istruzioni finite in alto. Pertanto, l'idea con Pentium4 era quella di fare piccoli passi che erano veloci da eseguire, dando clock alti, ma richiedendo quindi una lunga pipeline. L'indizio con una pipeline (tutti i processori ne impiegano una) è che hai diverse istruzioni in corso in fase di elaborazione in qualsiasi momento. Una lunga pipeline significa che sono in corso molte istruzioni e, se una previsione del ramo fallisce, dovrai svuotare l'intero tubo.
stolsvik,

Per la tua risposta n. 2, la CPU accede ai dati solo attraverso la cache (l'accesso alla memoria è generalmente trasparente dal punto di vista dell'istruzione). Il rallentamento della frequenza di clock non influirà sulla durata dei dati provenienti dalla RAM (se non sono nella cache). Inoltre, la larghezza del bus influisce solo sulla velocità delle operazioni SIMD in relazione alla dimensione dei tuoi operandi (ovvero posso caricare 8 operandi a 8 bit su un bus a 64 bit alla volta, ma devo comunque caricare manualmente 8 valori a 64 bit se ho operandi a 64 bit).
Breakthrough

2
Anche per la risposta n. 1, quando dici "se c'è un'istruzione che non utilizza lo stadio mem in quel ciclo, allora posso fare un'altra aggiunta", questo è falso. L'esecuzione fuori servizio viene applicata a livello di istruzione, non a livello di micro-operazione. Se un'istruzione richiedesse due esecuzioni nella pipeline, ciò causerebbe una bolla nella pipeline . Infine, l'architettura x86 ha un ALU separato per calcolare gli indirizzi di memoria al volo durante le letture / scritture di memoria (consente l' [EBX+ECX*4+100]indirizzamento dello stile).
Breakthrough

8

Lo sto semplificando molto, ma il punto importante da ricordare è che questi termini stanno confrontando le mele con le arance. Un "ciclo" non è una singola unità di misura unificata che è la stessa in tutti i processori, come un "secondo" è una misura unificata del tempo. Invece, un ciclo rappresenta una certa unità di lavoro, che è definita in qualche modo arbitrariamente ma delimitata dalla complessità del progetto della pipeline e, naturalmente, dalla fisica.

In molti casi, fare un sacco di lavoro in un ciclo potrebbe consentire di svuotare l'intera pipeline. Se ha esito positivo, ciò significa che il ciclo successivo non sarà ottimizzato perché è necessario riempire nuovamente la pipeline, il che può richiedere del tempo.

Potrei progettare un processore molto semplicistico che elabora uno stadio di un'istruzione RISC ogni ciclo, e se questa fosse la base della mia CPU, potrei probabilmente ottenere cicli molto, molto alti al secondo a causa della ridotta complessità di ciò che costituisce "un ciclo".

I dettagli entrano in un sacco di fisica e ingegneria elettrica che non capisco davvero, ma ricorda che la frequenza di clock non viene raggiunta semplicemente aggiungendo ingenuamente la tensione di ingresso al processore e sperando nel meglio. Per lo meno, il profilo termico è un'altra preoccupazione necessaria.


Questo in realtà non risponde alla sua domanda (che non ha nulla a che fare con il motivo per cui le cose non possono essere semplicemente accelerate). Chiede come più cicli! = Più lavori in ogni momento
soandos,

Questa risposta risolve tuttavia un problema che non ho riscontrato nelle altre risposte, ovvero parla dell'inclusione di particolari set di istruzioni che completano le operazioni con meno cicli di clock e della capacità di misurare i cicli di clock in base ai set di istruzioni più lenti che possono non essere così efficiente. (Potrei sbagliarmi però ... Trovo che l'architettura sia affascinante ma non mi considero un esperto in alcun modo)
Stephen R

5

Ecco una spiegazione molto semplice (forse grossolanamente semplificata): supponi di avere un lavoro particolare da fare, diciamo di aggiungere due numeri a 32 bit. Puoi prendere due approcci. Puoi dividerlo in un numero molto grande di passaggi molto piccoli oppure puoi dividerlo in un numero limitato di passaggi molto grandi.

Ad esempio, potresti semplicemente dire "aggiungi i due numeri". Ora hai solo un passo. Ma questo passaggio ha più parti e richiederà più tempo. Quindi hai istruzioni elevate per ciclo - una in questo caso. Ma la tua velocità di clock non può essere elevata perché hai molto da fare in quel ciclo.

In alternativa, potresti dire "Recupera il primo numero in un registro. Quindi recupera il secondo numero. Quindi aggiungi i bit meno significativi. Quindi aggiungi il secondo bit meno significativo con il carry da prima. Quindi aggiungi il terzo ... Quindi aggiungi i bit più significativi. Se c'era un carry, imposta il flag di overflow. Quindi scrivi il risultato in memoria. " Ora hai un numero enorme di passaggi. Ma ogni passaggio può essere assurdamente veloce. Quindi hai basse istruzioni per ciclo (1/36 o giù di lì in questo caso). Ma la tua velocità di clock può essere molto alta poiché ogni ciclo ha solo un piccolo bit da fare.

Per avere sia istruzioni elevate per ciclo sia un'alta velocità di clock, dovresti dividere un'istruzione complessa in un numero molto piccolo di passaggi molto semplici. Ma ciò non può essere fatto perché l'istruzione è complessa.

Gli effettivi compromessi specifici e i numeri dei cicli sono molto diversi perché le CPU moderne sono pipeline e istruzioni di sovrapposizione. Ma l'idea di base è corretta.


2

È possibile avere entrambe le alte istruzioni per ciclo e una velocità di clock elevata. Il punto in cui si incontrano i limiti è quando il ritardo di propagazione del circuito digitale supera l'ampiezza dell'impulso di un singolo ciclo di clock. Questo può essere superato aumentando la tensione della CPU, ma va notato che ciò aumenterà il consumo di energia (e quindi, il calore dissipato).

Quindi, se si desidera una velocità di clock più elevata, è necessario aumentare la tensione (aumentando la velocità di deriva dell'elettrone ) per ridurre il ritardo di propagazione. Se questo ritardo supera un ciclo di clock, molto probabilmente la CPU non si comporterà come previsto e il software in esecuzione su di esso si arresterà in modo anomalo o genererà un'eccezione. Esiste ovviamente un limite alla tensione che puoi attraversare un processore, e questo è dettato dal design della CPU stessa, principalmente dalla capacità di trasportare corrente dei percorsi elettrici interni.


Il pipelining consente velocità di clock più elevate in alcuni casi, poiché ogni istruzione è suddivisa in diverse "micro-operazioni" più piccole. Queste micro-operazioni sono operazioni molto semplici, che utilizzano circuiti molto più piccoli interconnessi in una catena (in senso fisico, poiché minore è la distanza che gli elettroni devono percorrere, minore è il ritardo di propagazione attraverso una particolare sottounità).

Il vantaggio aggiunto di una CPU pipeline è che è possibile aumentare notevolmente il numero di istruzioni eseguite per unità di tempo, a scapito di una progettazione più complessa.

Per quanto riguarda il motivo per cui alcune istruzioni richiedono più o meno cicli, dipende dall'istruzione che si sta eseguendo. Ad esempio, nel set di istruzioni x86, esiste MOVSun'istruzione che può spostare un'intera stringa in memoria da una posizione all'altra. Chiaramente, non puoi copiare istantaneamente una stringa lunga, ma puoi copiarla parola per parola, eseguendo più cicli di clock. Pertanto, l' MOVSistruzione richiede un tempo variabile (a seconda della quantità di caratteri da copiare).

L'effetto delle operazioni a più cicli è meno evidente su un progetto RISC (ovvero ARM) rispetto a un progetto CISC (ovvero x86). Questo perché i progetti basati su RISC avranno solo le operazioni elementari più comunemente utilizzate e sono molto più facili da eseguire in modo da ottenere un throughput di un'istruzione per ciclo.


1

Il tempo impiegato dal computer per completare una determinata attività non dipende dalla velocità di clock del computer ... dipende da come le unità di calcolo sono progettate e progettate.

La velocità di clock è in realtà una (più o meno) decisione arbitraria presa dal progettista della CPU, a volte per buoni motivi (efficienza), a volte per quelli poveri (pubblicità).

Supponiamo che una determinata CPU abbia una combinazione di istruzioni che richiedono tra 1 e 100 nanosecondi (ns) per terminare. È possibile impostare la frequenza di clock in modo che 1 "tick" sia 100 ns (10 MHz), il che significa che ogni istruzione termina esattamente con 1 tick. Tuttavia, se i tempi di esecuzione delle istruzioni sono distribuiti uniformemente, ciò significa che le unità di calcolo sarebbero inattive il 50% delle volte (la velocità media di esecuzione sarebbe di 50 ns, lasciando gli altri 50 n di tick inattivi). Se, invece, imposti il ​​segno di spunta su 10 ns, le istruzioni vanno da 1 a 10 tick, ma l'unità non sarebbe mai inattiva più di 9 n prima dell'inizio dell'istruzione successiva e il minimo medio sarebbe di 5 n.

Durante lo sviluppo, una CPU verrà progettata per funzionare a una determinata velocità, in base alla quantità di lavoro effettivamente eseguibile dalla CPU. Se aumenti o diminuisci la velocità di clock, in realtà non stai modificando la quantità di lavoro che la CPU può svolgere, stai solo scherzando con il suo rapporto di efficienza.

(E prima di piangere per l'overclocking delle CPU: questo ti dà due vantaggi che si traducono in guadagni di velocità nel mondo reale: le istruzioni di esecuzione rapida (che richiedono meno di 1 ciclo) finiscono con tempi di esecuzione più rapidi e tutte le istruzioni hanno un tempo di inattività inferiore. di questi può infatti aumentare la quantità di lavoro che il tuo computer può eseguire, ma scoprirai che l'overclocking di una CPU dell'X% non equivale sempre all'aumento dell'X% del lavoro svolto quando lo confronti.

TL; DR

Una CPU può eseguire il lavoro X in un secondo. Se usi la velocità di clock H e I IPC, abbiamo I = X / H. Cambiare H non cambia X, ma influenza inversamente I.


1
La velocità di clock è tutt'altro che una decisione arbitraria. Deve essere scelto con cura in funzione della tensione di alimentazione della CPU e della lunghezza della traccia IC (per evitare ritardi di propagazione eccessivi).
Breakthrough

Penso che ti sia perso il fatto che una CPU è un circuito digitale sincrono . Le istruzioni non richiedono X nanosecondi (supponendo che il tuo ciclo di clock sia inferiore al ritardo di propagazione), tutto accade su un fronte di clock crescente o decrescente - o entrambi. Le istruzioni richiedono X cicli, non X unità di tempo. Sì, puoi modificare quanto dura un ciclo, ma la distinzione è cosa succede quando. E infine, la quantità di lavoro che una CPU può fare in un secondo è una funzione della velocità di clock, quindi la tua formula non verifica davvero qui.
cp2141,

Una CPU è una fusione sincrona di più unità asincrone. I tick di clock sono usati per allineare bene le cose, ma non determinano il tempo di esecuzione ... Ad esempio, un'aggiunta di numeri interi richiederà un certo tempo in base alla distanza percorsa dalla corrente attraverso la CPU e alla velocità con cui i transistor cambierà stato. Il risultato è READ al prossimo tick di clock, ma il calcolo effettivo viene eseguito in modo asincrono durante il tick.
Benjamin Chambers,

0

Non si possono avere sia istruzioni elevate per ciclo che velocità di clock elevate perché i requisiti sono contraddittori.

Si può dimostrare che, in una prima approssimazione, l'IPC dipende dalla complessità (A) del progetto come

IPC = a sqrt (A)

mentre la frequenza massima (F) ottenibile dalle scale di progettazione come [1]

F = 1 / {b + c sqrt (A)}

con i parametri a, bec.

Quindi aumentare la complessità del muarch aumenta l'IPC a scapito della riduzione della frequenza di lavoro, mentre la riduzione della complessità aumenta la frequenza a scapito dell'IPC. Ciò corrisponde ai due casi estremi citati nell'articolo di Wikipedia, ma la Wikipedia non menziona i nomi: Brainiac e Speed-Demon.

  • Design cerebrale: IPC elevato e bassa frequenza
  • Progettazione di demoni di velocità: alta frequenza e basso IPC.

[1] Alcuni autori sostengono che l'espressione per la frequenza è invece "1 / {b + c A}", ma in entrambi i casi l'aumento della complessità riduce la frequenza massima raggiungibile.

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.