2010-04-08 8 views
7

Questa è forse più una domanda di discussione, ma ho pensato che StackOverflow potrebbe essere il posto giusto per chiederlo. Sto studiando il concetto di pipeline di istruzioni. Mi è stato insegnato che il throughput delle istruzioni di una pipeline è aumentato quando il numero di stadi della pipeline è aumentato, ma in alcuni casi, il throughput potrebbe non cambiare. In quali condizioni, succede? Sto pensando che lo stallo e la ramificazione potrebbero essere la risposta alla domanda, ma mi chiedo se mi manca qualcosa di cruciale.Perché aumentare la profondità della condotta non significa sempre un aumento della produttività?

+0

Grazie per le risposte. Solo per vostra informazione, un'altra cosa che mi viene in mente è anche se aumentiamo le fasi della pipeline, sperando di rompere la logica dello stadio pipeline originale in sottoreti più piccole, un'istruzione potrebbe non propagarsi attraverso queste reti più piccole perché la sua forma più semplice di gerarchia della pipeline può essere spiegato in termini di logica dello stage originale, quindi questo non influenzerebbe il throughput. – user246392

risposta

4

Il tutto può essere bloccato da altre istruzioni in attesa di un risultato o in caso di mancata memorizzazione della cache. La pipeline non garantisce di per sé che le operazioni siano totalmente indipendenti. Ecco una grande presentazione circa la complessità del x86 Intel/AMD architettura: http://www.infoq.com/presentations/click-crash-course-modern-hardware

Si spiega cose come questa in grande dettaglio, e copre alcune soluzioni su come migliorare ulteriormente il throughput e nascondere la latenza. JustJeff ha menzionato l'esecuzione fuori ordine per uno, e tu hai i registri ombra non esposti dal modello del programmatore (più di 8 registri su x86), e hai anche la previsione delle diramazioni.

0

Vorrei anche pensare che aumentare il pipelining oltre il tempo necessario per l'esecuzione dell'istruzione più lunga di una serie non provocherebbe un aumento delle prestazioni. Penso però che lo stallo e la ramificazione siano i problemi fondamentali.

0

Blocca/blocca in modo definitivo le lunghe condotte causando un'enorme perdita di throughput. E, naturalmente, più lunga è la pipeline e più cicli di clock vengono sprecati.

Ho provato per molto tempo a pensare ad altri scenari in cui i gasdotti più lunghi potrebbero causare una perdita di prestazioni, ma tutto torna alle bancarelle. (E numero di unità di esecuzione e schemi di emissione, ma questi non hanno molto a che fare con la lunghezza della pipeline.)

2

Concordato. I maggiori problemi sono le bancarelle (in attesa dei risultati delle istruzioni precedenti) e la previsione dei rami errata. Se la tua pipeline è a 20 stadi di profondità e non riesci ad aspettare i risultati di una condizione o operazione, attendi più a lungo che se la tua pipeline fosse a soli 5 stadi. Se si prevede il ramo sbagliato, è necessario svuotare 20 istruzioni dalla pipeline, a differenza di 5.

Immagino presumibilmente che si possa avere una pipeline profonda in cui più stadi tentano di accedere allo stesso hardware (ALU, ecc.), il che causerebbe un successo nelle prestazioni, anche se si spera che si introducano abbastanza unità aggiuntive per supportare ogni fase.

+1

Non sono 20 istruzioni, ma 20 cicli di istruzioni. In una CPU pesantemente superscalare, potrebbe essere MOLTO di più. – slacker

1

Il parallelismo del livello di istruzione presenta rendimenti decrescenti. In particolare, le dipendenze dei dati tra le istruzioni determinano il possibile parallelismo.

Considerare il caso di Read after Write (noto come RAW nei libri di testo).

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

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

Il risultato della riga 10 deve essere noto al momento in cui inizia il calcolo della riga 10. L'inoltro dei dati attenua questo problema, ma ... solo fino al punto in cui i dati vengono rilevati.

Problemi correlati