Domanda

Beh, sembra una domanda troppo semplice da porre, ma l'ho fatta dopo aver esaminato alcune pagine su entrambi.

Entrambi i metodi aumentano la produttività delle istruzioni.E anche il superscaling fa quasi sempre uso del pipeline.Il superscaling ha più di un'unità di esecuzione e lo stesso vale per il pipeline o mi sbaglio qui?

È stato utile?

Soluzione

il design superscalare comporta il processore di essere in grado di emettere più istruzioni in un unico orologio, con strutture ridondanti di eseguire un'istruzione. Stiamo parlando all'interno di un singolo core, si badi bene -. Elaborazione multicore è diverso

pipelining divide un'istruzione in passi, e poiché ogni passo viene eseguito in una parte diversa del processore, più istruzioni può essere in diverse "fasi" ogni orologio.

Sono quasi sempre utilizzati insieme. Questa immagine da Wikipedia mostra due concetti in uso, in quanto questi concetti sono meglio spiegati graficamente:

superscalare / pipelining in uso

Qui, due istruzioni vengono eseguite in un momento in una pipeline a cinque stadi.


Per abbattere ulteriormente, dato il vostro recente modifica:

Nell'esempio precedente, un'istruzione passa attraverso 5 fasi per essere "eseguito". Questi sono IF (di ricupero), ID (istruzione decodifica), EX (esecuzione), MEM (memoria di aggiornamento), WB (writeback alla cache).

In un design molto semplice processore, ogni orologio una fase diversa sarebbe stata completata in modo che avrebbe avuto:

  1. Se
  2. ID
  3. EX
  4. MEM
  5. WB

Il che farebbe un'istruzione in cinque orologi. Se poi aggiungiamo un'unità di esecuzione ridondante e di introdurre il design superscalare, avremmo questo, per due istruzioni A e B:

  1. se (a) IF (B)
  2. ID (A) ID (B)
  3. EX (a) ex (B)
  4. MEM (A) MEM (B)
  5. WB (A) WB (B)

Due istruzioni in cinque orologi -. Un guadagno massimo teorico del 100%

Pipeline consente alle parti che devono essere eseguite contemporaneamente, in modo che sarebbe finire con qualcosa di simile (per dieci istruzioni da A a J):

  1. se (a) IF (B)
  2. ID (A) ID (B) IF (C) IF (D)
  3. EX (a) ex (B) ID (C) ID (D) IF (E) IF (F)
  4. MEM (A) MEM (B) EX (C) EX (D) ID (E) ID (F) IF (G) IF (H)
  5. WB (A) WB (B) MEM (C) MEM (D) EX (E) EX (F) ID (G) ID (H) IF (I) IF (J)
  6. WB (C) WB (D) MEM (E) MEM (F) EX (G) EX (H) ID (I) ID (J)
  7. WB (E) WB (F) MEM (G) MEM (H) EX (I) EX (J)
  8. WB (G) WB (H) MEM (I) MEM (J)
  9. WB (I) WB (J)

In nove orologi, abbiamo eseguito dieci istruzioni - si può vedere dove si sposta il pipelining realmente le cose. E questa è una spiegazione del grafico di esempio, non come in realtà è implementato nel campo (che è magia nera ).

Gli articoli di Wikipedia per superscalare e Istruzioni gasdotto sono piuttosto buone.

Altri suggerimenti

Tanto tempo fa, le CPU venivano eseguite solo un'istruzione macchina alla volta.Solo quando fu completamente terminato la CPU prelevò l'istruzione successiva dalla memoria (o, successivamente, dalla cache delle istruzioni).

Alla fine, qualcuno notò che questo significava che la maggior parte della CPU non faceva nulla per la maggior parte del tempo, poiché c'erano diverse sottounità di esecuzione (come il decodificatore delle istruzioni, l'unità aritmetica dei numeri interi e l'unità aritmetica FP, ecc.) e l'esecuzione di un'istruzione veniva mantenuta solo uno di loro è occupato alla volta.

Così, "semplice" conduttura sono nato:una volta terminata la decodifica di un'istruzione e proseguita verso la subunità di esecuzione successiva, perché non recuperare e decodificare già l'istruzione successiva?Se ne avessi 10 così "fasi", poi di fare in modo che ogni fase elabori un'istruzione diversa potresti teoricamente aumentare il throughput delle istruzioni di dieci volte senza aumentare affatto il clock della CPU!Naturalmente, questo funziona perfettamente solo quando non ci sono salti condizionali nel codice (questo ha comportato molti sforzi aggiuntivi per gestire appositamente i salti condizionali).

Successivamente, con la legge di Moore che continuava ad essere corretta più a lungo del previsto, i produttori di CPU si ritrovarono con sempre più transistor da utilizzare e pensarono "perché avere solo una per ciascuna subunità di esecuzione?".Così, superscalare CPU con più subunità di esecuzione in grado di eseguire il Stesso cosa in parallelo sono nati e i progetti delle CPU sono diventati molto, molto più complessi per distribuire le istruzioni su queste unità completamente parallele garantendo al tempo stesso che i risultati fossero gli stessi come se le istruzioni fossero state eseguite in sequenza.

un'analogia: Vestiti di lavaggio

Immaginate un negozio di lavaggio a secco con i seguenti servizi:. Un rack per appendere gli abiti sporchi o puliti, una lavatrice e un'asciugatrice (ognuno dei quali può lavare un capo alla volta), un tavolo pieghevole, e un asse da stiro

L'addetto che fa tutto il lavaggio e l'asciugatura attuale è piuttosto ottuso in modo che il proprietario del negozio, che prende gli ordini di lavaggio a secco, si prende cura speciale di scrivere ogni istruzione con molta attenzione e in modo esplicito.

In una giornata tipica queste istruzioni possono essere qualcosa sulla falsariga di:

  1. prendere la maglia dal rack
  2. lavare la camicia
  3. asciugare la maglia
  4. stirare la camicia
  5. piegare la maglia
  6. mettere la camicia di nuovo sulla griglia
  7. prendere i pantaloni dal rack
  8. lavare i pantaloni
  9. asciugare i pantaloni
  10. piegare i pantaloni
  11. mettere i pantaloni di nuovo sulla griglia
  12. prendere il cappotto dal rack
  13. lavare il cappotto
  14. asciugare il cappotto
  15. ferro il cappotto
  16. mettere il cappotto di nuovo sulla griglia

L'addetto segue queste istruzioni al tee, facendo molta attenzione a non fare mai nulla fuori uso. Come potete immaginare, ci vuole molto tempo per ottenere biancheria del giorno fatto perché ci vuole molto tempo per la pulizia completa, asciutto, e piegare ogni pezzo di biancheria, e deve essere fatto uno alla volta.

Tuttavia, un giorno l'addetto si chiude e un nuovo, più intelligente, addetto viene assunto che nota che la maggior parte delle apparecchiature è posa di inattività in qualsiasi momento durante il giorno. Mentre i pantaloni si asciugavano né l'asse da stiro, né la lavatrice erano in uso. Così ha deciso di fare un uso migliore del suo tempo. Così, invece di serie sopra di passi, che avrebbe fatto questo:

  1. prendere la maglia dal rack
  2. lavare la camicia, prendere i pantaloni dal rack
  3. asciugare la camicia, lavare i pantaloni
  4. stirare la camicia, asciugare i pantaloni
  5. piegare la camicia, (prendere il cappotto dal rack)
  6. mettere la camicia di nuovo sulla griglia, piegare i pantaloni , (lavare il cappotto)
  7. mettere i pantaloni indietro sulla griglia , (asciugare il cappotto)
  8. (stirare il cappotto)
  9. (mettere il cappotto di nuovo sul rack)

Questo è il pipelining. di sequenziamento attività non correlate tali che usano componenti diversi allo stesso tempo. Mantenendo la maggior quantità di diversi componenti attivi contemporaneamente a massimizzare l'efficienza e accelerare il tempo di esecuzione, in questo caso ridurre 16 "cicli" a 9, un aumento di velocità superiore al 40%.

Ora, il piccolo negozio di lavaggio a secco ha cominciato a fare più soldi, perché potrebbe lavorare in modo molto più veloce, in modo che il proprietario ha acquistato una rondella in più, asciugatrice, asse da stiro, stazione di piegatura, e persino assunto un altro addetto. Ora le cose sono ancora più veloce, invece di quanto sopra, si ha:

  1. prendere la maglia dal rack, prendere i pantaloni dal rack
  2. lavare la camicia, lavare i pantaloni , (prendere il cappotto dal rack)
  3. asciugare la camicia, asciugare i pantaloni , (lavare il cappotto)
  4. stirare la camicia, piegare i pantaloni , (asciugare il cappotto)
  5. piegare la camicia, mettere i pantaloni di nuovo sulla griglia , (stirare il cappotto)
  6. mettere la camicia di nuovo sulla griglia, (mettere il cappotto di nuovo sul rack)

Ciò è disegno superscalare. di più sotto-componenti in grado di fare la stessa operazione contemporaneamente, ma con il processore di decidere come farlo. In questo caso si è tradotto in un aumento di velocità quasi il 50% (in 18 "cicli" la nuova architettura potrebbe correre attraverso 3 iterazioni di questo "programma" mentre l'architettura precedente potrebbe funzionare solo tramite 2).

processori Vecchio, come il 386 o 486, sono semplici processori scalari, eseguono un'istruzione alla volta nella stessa sequenza in cui è stato ricevuto. Moderni processori consumo since il PowerPC / Pentium sono pipeline e superscalare. Una CPU Core2 è in grado di eseguire lo stesso codice che è stato compilato per 486 pur sfruttando livello istruzione parallelismo perché contiene una propria logica interna che analizza codice macchina e determina come riordinare ed eseguirlo (ciò che può essere eseguito in parallelo , ciò che non può, etc.) Questa è l'essenza del design superscalare e perché è così pratica.

In contrasto un processore parallelo vettore esegui operazioni sui diversi pezzi di dati contemporaneamente (un vettore). Così, invece di aggiungere xey un processore vettoriale aggiungerebbe, diciamo, x0, x1, x2 a y0, y1, y2 (con conseguente z0, z1, z2). Il problema con questo motivo è che è strettamente accoppiato allo specifico grado di parallelismo del processore. Se si esegue il codice scalare su un processore vettoriale (supponendo che potrebbe) si dovrebbe vedere alcun vantaggio della parallelizzazione vettore perché ha bisogno di essere utilizzato in modo esplicito, allo stesso modo se si voleva approfittare di un processore vettoriale più recente con le unità di elaborazione in parallelo di più (ad esempio, in grado di aggiungere vettori di 12 numeri invece di soli 3) si avrebbe bisogno di ricompilare il codice. disegni processore vettoriale erano popolari nella più antica generazione di super computer perché erano facili da progettare e ci sono grandi classi di problemi nel campo della scienza e dell'ingegneria con una grande quantità di parallelismo naturale.

processori superscalari possono anche avere la capacità di eseguire esecuzione speculativa. Anziché lasciare unità di elaborazione inattiva e in attesa di un percorso di codice per terminare l'esecuzione prima ramificazione un processore può fare una migliore ipotesi e inizia l'esecuzione del codice passato il ramo prima del codice prima termine dell'elaborazione. Quando l'esecuzione del codice precedente raggiunge al punto di diramazione il processore può quindi confrontare il ramo effettivo con la supposizione ramo e continuare il trattamento, se l'ipotesi era corretta (già ben prima di dove sarebbe stato da solo in attesa) oppure può invalidare i risultati dell'esecuzione speculativo ed eseguire il codice per il ramo corretto.

Il pipelining è ciò che una casa automobilistica fa nella produzione delle loro vetture. Si analizzano il processo di mettere insieme una macchina in fasi ed eseguire le diverse fasi in diversi punti lungo una linea di assemblaggio fatto da persone diverse. Il risultato netto è che l'auto è prodotta esattamente alla velocità della sola fase più lenta.

Nel CPU processo pipelining è esattamente lo stesso. Una "istruzione" è suddiviso in varie fasi di esecuzione, solitamente è 1. recuperare istruzione, 2. recuperare operandi (registri di memoria o valori che vengono letti), 2. eseguire calcoli, 3. Risultati scrittura (a memoria o registri) . Il più lento questo potrebbe essere la parte di calcolo, nel qual caso la velocità throughput complessivo delle istruzioni attraverso questo oleodotto è solo la velocità della parte di calcolo (come se le altre parti sono state "libero".)

Super-scalare microprocessori si riferisce alla possibilità di eseguire diverse istruzioni da un singolo flusso esecuzione contemporaneamente in parallelo. Quindi, se una casa automobilistica ha due linee di montaggio poi, ovviamente, si potrebbe produrre il doppio delle auto. Ma se il processo di mettere un numero di serie sulla vettura era all'ultimo stadio e doveva essere fatto da una sola persona, allora avrebbero dovuto alternare tra i due gasdotti e garantire che si potrebbe ottenere ogni fatto in metà del tempo di la fase più lenta al fine di evitare di diventare la fase più lenta se stessi.

Super-scalare in microprocessori è simile, ma di solito ha molte più restrizioni. Così il di ricupero fase in genere produrre più di un istruzione durante la sua fase - questo è ciò che rende super-scalari nei microprocessori possibili. Ci sarebbe quindi due fetch fasi, due fasi di esecuzione, e due fasi indietro scrittura. Questo generalizza, ovviamente, per più di due gasdotti.

Questo è tutto bene e dandy ma dal punto di vista dell'esecuzione suono entrambe le tecniche potrebbe portare a problemi se fatto alla cieca. Per una corretta esecuzione di un programma, si presume che le istruzioni vengono eseguite completamente uno dopo l'altro in ordine. Se due istruzioni sequenziali hanno calcoli inter-dipendenti o usano gli stessi registri allora non ci può essere un problema, L'istruzione in seguito ha bisogno di aspettare che la parte posteriore di scrittura del precedente istruzione di completare prima di poter eseguire l'operando recuperare palco. Quindi è necessario stallo la seconda istruzione di due fasi prima che sia eseguito, che sconfigge lo scopo di ciò che è stato guadagnato da queste tecniche, in primo luogo.

Ci sono molte tecniche utilizzare per ridurre il problema della necessità di stallo che sono un po 'complicato da descrivere, ma io li elenco: 1. l'inoltro registro, (negozio anche per caricare forwarding) 2. registro ridenominazione, 3. punteggio- imbarco, 4. esecuzione fuori ordine. 5. esecuzione speculativa con rollback (e pensione) Tutte le CPU moderne utilizzare praticamente tutte queste tecniche per realizzare super-scalari e pipelining. Tuttavia, queste tecniche tendono ad avere rendimenti decrescenti rispetto al numero di condotte in un processore prima stalle diventano inevitabili. In pratica nessun costruttore CPU rende più di 4 condotte in un singolo nucleo.

multi-core non ha nulla a che fare con una qualsiasi di queste tecniche. Questo è fondamentalmente speronamento due microprocessori insieme per attuare multiprocessing simmetrico su un singolo chip e condividere solo i componenti necessari sotto il condividere (tipicamente cache L3, e I / O). Tuttavia una tecnica che Intel chiama "hyperthreading" è un metodo per cercare di attuare praticamente la semantica di multi-core nell'ambito super-scalari di un singolo nucleo. Quindi un singolo micro-architettura contiene i registri di due (o più) core virtuali e recupera istruzioni da due (o più) diversi flussi di esecuzione, ma l'esecuzione da un sistema super-scalari comune. L'idea è che, poiché i registri non possono interferire con l'altro, ci saràtendono ad essere più il parallelismo che porta a un minor numero di bancarelle. Quindi, piuttosto che semplicemente eseguendo due flussi virtuali esecuzione core a metà della velocità, è meglio dovuto alla riduzione globale stalli. Ciò sembrerebbe suggerire che Intel potrebbe aumentare il numero delle condotte. Tuttavia questa tecnica è stato trovato per essere un po 'carente in implementazioni pratiche. Come è parte integrante di tecniche di super-scalari, però, ho già detto che in ogni caso.

pipelining è esecuzione simultanea di diverse fasi di istruzioni multiple nello stesso ciclo. Esso si basa sulla trasformazione di istruzioni suddivisione in stadi e avente unità specializzate per ogni fase e registri per memorizzare i risultati intermedi.

Superscaling sta inviando più istruzioni (o microistruzioni) a più unità esecuzione esistenti in CPU. Esso si basa quindi sulla unità ridondanti in CPU.

Naturalmente, questo approcci possono completarsi a vicenda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top