Perché una maggiore profondità gasdotto non sempre significa migliorare il throughput?

StackOverflow https://stackoverflow.com/questions/2597189

  •  25-09-2019
  •  | 
  •  

Domanda

Questa è forse più di una domanda discussione, ma ho pensato StackOverflow potrebbe essere il posto giusto per chiederlo. Sto studiando il concetto di pipeline dati. Mi è stato insegnato che l'istruzione di una pipeline di throughput è aumentato una volta che il numero di stadi della pipeline è aumentata, ma in alcuni casi, il throughput non potrebbe cambiare. In quali condizioni, succede questo? Sto pensando di stallo e la ramificazione potrebbe essere la risposta alla domanda, ma mi chiedo se mi manca qualcosa di fondamentale.

È stato utile?

Soluzione

Il tutto può essere in fase di stallo da altre istruzioni quando in attesa di un risultato, o cache miss. Pipelining non garantisce di per sé che le operazioni sono totalmente indipendenti. Qui è una grande presentazione circa la complessità dell'architettura x86 Intel / AMD: http://www.infoq.com/presentations/click-crash-course-modern-hardware

Spiega cose come questa in grande dettaglio, e copre alcune soluzioni su come migliorare ulteriormente il throughput e nascondere la latenza. JustJeff menzionato esecuzione fuori ordine per uno, e si dispone registri ombra non esposte dal modello programmatore (più di 8 registri a 86), e si ha anche ramo predizione.

Altri suggerimenti

D'accordo. I problemi maggiori sono bancarelle (in attesa di risultati da istruzioni precedenti), e branch prediction errato. Se il gasdotto è di 20 tappe in profondità, e si stallo in attesa dei risultati di una condizione o il funzionamento, si sta andando ad aspettare più di se il gasdotto era solo 5 tappe. Se a prevedere il ramo sbagliato, è necessario irrigare 20 istruzioni fuori del gasdotto, al contrario di 5.

Credo che presumibilmente si potrebbe avere una pipeline profonda in cui più stadi stanno tentando di accedere lo stesso hardware (ALU, ecc), che causerebbe un calo di prestazioni, anche se si spera si butta in numero sufficiente di unità aggiuntive per sostenere ogni fase.

livello di istruzione parallelismo ha rendimenti decrescenti. In particolare, le dipendenze di dati tra le istruzioni determinano la possibile parallelismo.

Si consideri il caso di lettura dopo scrittura (noto come RAW nei libri di testo).

Nella sintassi in cui il primo operando ottiene il risultato, si consideri questo esempio.

10: add r1, r2, r3
20: add r1, r1, r1

Il risultato della linea 10 deve essere noto al momento in cui il calcolo della linea 10 inizia. inoltro dei dati mitiga questo problema, ma ... solo fino al punto in cui i dati vengono noto.

vorrei anche pensare che l'aumento pipelining al di là della quantità di volta che l'istruzione più lungo di una serie avrebbe preso di eseguire non causerebbe un aumento delle prestazioni. Credo che lo stallo e la ramificazione sono le questioni fondamentali però.

bancarelle Sicuramente / bolle in lunghe tubazioni causare una perdita enorme throughput. E, naturalmente, più a lungo la pipeline più cicli di clock sono sprecati.

ho cercato per molto tempo per pensare ad altri scenari in cui le tubazioni più lunghe potrebbe causare una perdita in termini di prestazioni, ma tutto torna alla platea. (E il numero di unità di esecuzione e schemi di emissione, ma quelli non hanno molto a che fare con la lunghezza tubazione.)

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