Cosa sono le "Istruzioni per ciclo"?


23

Ho imparato un po 'di più su come funzionano i processori, ma non sono stato in grado di trovare una risposta diretta sulle istruzioni per ciclo.

Ad esempio, avevo l'impressione che una CPU a quattro core potesse eseguire quattro istruzioni per ciclo, quindi una CPU a quattro core in esecuzione a 2 Ghz avrebbe eseguito 8 miliardi di operazioni al secondo. È questo il caso?

Sono sicuro che semplifica eccessivamente le cose, ma se c'è una guida o qualcos'altro che posso usare per mettermi in chiaro, sono decisamente aperto alle idee.


No, non è così. Le moderne CPU x86 possono supportare tre istruzioni per core per ciclo in condizioni ideali, mentre alcune istruzioni possono richiedere decine di cicli.
David Schwartz,

Risposte:


22

Le parole chiave che dovresti probabilmente cercare sono CISC , RISC e architettura superscalare .

CISC

In un'architettura CISC (x86, 68000, VAX) un'istruzione è potente, ma richiede più cicli per l'elaborazione. Nelle architetture precedenti il ​​numero di cicli era fisso, al giorno d'oggi il numero di cicli per istruzione di solito dipende da vari fattori (hit / miss della cache, previsione del ramo, ecc.). Ci sono tavoli per cercare quella roba. Spesso ci sono anche strumenti per misurare effettivamente quanti cicli richiede una determinata istruzione in determinate circostanze (vedere i contatori delle prestazioni ).

Se sei interessato ai dettagli per Intel, il Manuale di riferimento per l'ottimizzazione di Intel 64 e IA-32 è un'ottima lettura.

RISC

L'architettura RISC (ARM, PowerPC, SPARC) significa che di solito un'istruzione molto semplice richiede solo pochi (spesso solo un) ciclo.

superscalare

Ma indipendentemente da CISC o RISC c'è l'architettura superscalare. La CPU non sta elaborando un'istruzione dopo l'altra, ma sta lavorando su molte istruzioni contemporaneamente, proprio come una catena di montaggio.

La conseguenza è: se cerchi semplicemente i cicli per ogni istruzione del tuo programma e poi li aggiungi tutti, finirai con un numero molto alto. Supponiamo di avere una CPU RISC single core. Il tempo di elaborazione di una singola istruzione non può mai essere inferiore al tempo di un ciclo, ma il throughput complessivo può essere di diverse istruzioni per ciclo.


9
Per me, l'analogia della "catena di montaggio" suggerisce solo una semplice pipeline, non un'architettura superscalare. Superscalar comporta la replica di parti dell'hardware della CPU (ad esempio, una fase della pipeline che rappresenta un collo di bottiglia) per migliorare la produttività.
sblair,

2
Sto aggiungendo per brevità: RISC = set di istruzioni ridotto; CISC = set di istruzioni complesso. Buona spiegazione, Ludwig per aver sottolineato il rapporto hit / miss della cache e (in definitiva) per sottolineare TLB. Spiegare l'architettura a microprocessore non è facile, soprattutto per raggruppare tutto in un post (abbastanza compatto)! :)
osij2is

1
Da quello che sento, le CPU in questi giorni trascorrono molto del loro tempo in attesa di lavoro per mostrarsi dalla memoria principale. Almeno questa è stata la risposta che ho ricevuto quando ho chiesto perché non ci sono più core di esecuzione in una CPU.
surfasb,

32

Il modo in cui mi piace pensarci è con un'analogia della lavanderia. Le istruzioni della CPU sono come carichi di biancheria. È necessario utilizzare sia la lavatrice che l'asciugatrice per ogni carico. Diciamo che ciascuno impiega 30 minuti per funzionare. Questo è il ciclo dell'orologio. Le vecchie CPU eseguivano la lavatrice, quindi eseguivano l'asciugatrice, impiegando 60 minuti (2 cicli) per terminare ogni carico di biancheria, ogni volta.

Pipelining: una pipeline è quando si utilizzano entrambi contemporaneamente: si lava un carico, quindi mentre si sta asciugando, si lava il carico successivo. Il primo carico impiega 2 cicli per terminare, ma il secondo carico termina dopo 1 altro ciclo. Pertanto, la maggior parte dei carichi richiede solo 1 ciclo, ad eccezione del primo carico.

Superscalar: porta tutto il bucato nella lavanderia automatica. Prendi 2 rondelle e caricale entrambe. Quando hanno finito, trova 2 essiccatori e usali entrambi. Ora puoi lavare e asciugare 2 carichi in 60 minuti. Cioè 2 carichi in 2 cicli. Ogni carico richiede ancora 2 cicli, ma ora puoi eseguirne altri. Il tempo medio è ora di 1 carico per ciclo.

Superscalare con tubazioni: lavare i primi 2 carichi, quindi mentre questi si stanno asciugando, caricare le rondelle con i successivi 2 carichi. Ora, i primi 2 carichi richiedono ancora 2 cicli, quindi i successivi 2 sono terminati dopo 1 altro ciclo. Quindi, il più delle volte, finisci 2 carichi in ogni ciclo.

Nuclei multipli: dai la metà del bucato a tua madre, che ha anche 2 lavatrici e 2 asciugatrici. Lavorando entrambi insieme, puoi fare il doppio. Questo è simile al superscalare, ma leggermente diverso. Invece di dover spostare tutto il bucato da e verso ciascuna macchina, può farlo contemporaneamente a te.

È fantastico, possiamo fare il bucato otto volte più di prima nello stesso tempo, senza dover creare macchine più veloci. (Raddoppia la velocità dell'orologio: lavatrici che richiedono solo 15 minuti per funzionare.)

Ora parliamo di come le cose vanno male:

Bolla della pipeline: hai una macchia che non è emersa durante il lavaggio, quindi decidi di lavarla di nuovo. Ora l'asciugatrice è solo lì, in attesa di qualcosa da fare.

Miss cache: il camion che trasporta la biancheria sporca è bloccato nel traffico. Ora hai 2 lavatrici e 2 asciugatrici, ma non stai lavorando perché devi aspettare.

A seconda della frequenza con cui le cose vanno male, non saremo in grado di fare sempre 4 carichi ogni ciclo, quindi la quantità effettiva di lavoro può variare.

Branch Prediction: Beh, inizi a fare il bucato sui tuoi vestiti puliti nel caso in cui li macchi più tardi, quindi saranno già puliti ... okay, qui è dove l'analogia si rompe ...


Bella analogia. Lo ruberò.
dmckee,

6
E hyperthreading è come avere più persone che fanno il loro lavaggio nella stessa lavanderia automatica.
Ronald Pottol,

1
Branch Prediction: inizi a lavare i vestiti di cui pensi di aver bisogno nella prossima settimana
Akash

2
Hyperthreading: inizi ad accettare il bucato di altre persone e pubblicizzi il numero di lavatrici che possiedi (1). Presto ti rendi conto che la tua lavatrice ha spazio per più del paio di pantaloni che stai lavando, non solo un altro paio di pantaloni, ma qualcosa di più piccolo. Quindi infili anche in alcuni calzini. Ora pubblicizzi 2 lavatrici e speri che le persone lascino il bucato abbastanza vario da permetterti di "riempire i buchi" sempre con oggetti più piccoli. Proprio quando questo ragazzo che arriva con 10 jeans sporchi e 1 paio di calzini lascia cadere le sue cose, è più lento che mai.
Florenz Kley,

@Akash Lavi i vestiti che non hanno ancora macchie, per ogni evenienza?
Kevin Panko,

3

Non esattamente. Il ciclo a cui ti riferisci è il ciclo di clock e poiché la maggior parte della pipeline di processori moderni richiede diversi cicli di clock per l'esecuzione di 1 istruzione. (Questa è una buona cosa perché consente ad altre istruzioni di iniziare l'esecuzione anche prima che finisca la prima istruzione.) Supponendo la circostanza più ideale, sarebbe probabilmente circa 8 miliardi di IPC, ma succedono cose di ogni genere come dipendenze, bolle in cantiere , rami, ecc. quindi non sempre funziona.

Siamo spiacenti, è troppo complicato per una risposta diretta. Jon Stokes fa un buon lavoro nel spiegarlo con questo articolo .


2

I giorni in cui uno potrebbe cercare (o persino memorizzare) il tempo di ciclo per ogni istruzione e sapere quanti orologi ci vorrebbe per un certo bit di codice per finire sono molto passati per i chip di fascia alta (ma sono ancora con noi in alcuni microcontrollori). Un moderno core CPU per uso generale può avere più copie di più unità di esecuzione diverse in più pipeline, accedendo a una cache di memoria a più stadi con la propria logica, oltre alla previsione del ramo e alla capacità di esecuzione speculativa. Avere più core su un singolo die trascina nella logica di coerenza della cache e altre complessità.

Quindi la risposta breve è: più core significa più capacità di fare le cose, ma non in un modo piacevole e prevedibile .


1

Ludwig ha spiegato la differenza tra CISC e RISC, ma ha dimenticato di menzionare che mentre le istruzioni RISC sono semplici e veloci, fanno poco individualmente e quindi è necessario unire più insieme per fare la stessa cosa di una singola istruzione in un processore CISC. Di conseguenza, alcune istruzioni RISC saranno più veloci, altre no.


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.