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à?
risposta
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.
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.
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.)
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.
Non sono 20 istruzioni, ma 20 cicli di istruzioni. In una CPU pesantemente superscalare, potrebbe essere MOLTO di più. – slacker
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.
- 1. Dependency Injection e lo sviluppo della produttività
- 2. Dissolvenza di un colore in bianco (aumento della luminosità)
- 3. Limitazioni della profondità dell'albero di espressione
- 4. Aumento invece della configurazione Maven sovrascrivibile
- 5. aumento della precisione dei numeri in virgola mobile
- 6. Come aumentare la dimensione della finestra DOXBox?
- 7. Aumentare la lunghezza della cronologia IPython
- 8. Aumentare la spaziatura della griglia in Android
- 9. Django auth: aumento della lunghezza massima del nome utente
- 10. Pratiche di stile industriale per aumentare la produttività in un piccolo ambiente scientifico
- 11. Perché la disabilitazione della scrittura nel buffer di profondità non consente di disegnare quasi nulla?
- 12. Coda piena, profondità della Coda bloccante, chiarimento necessario
- 13. Suggerimenti e consigli per aumentare la produttività/efficienza con Team Foundation Server
- 14. IndexOutOfRangeException profondità nelle viscere della NHibernate
- 15. Perché l'uso della funzione REPLACE su CLOB causa un aumento di CACHE_LOBS ...?
- 16. QuickSort stima della profondità di ricorsione
- 17. Come aumentare la frequenza della CPU del nuovo processo generato
- 18. stato della batteria non è sempre carica
- 19. La profondità massima della ricorsione ha superato py2App
- 20. Joomla tempo aumento della sessione frontend fuori limite
- 21. Come posso aumentare la velocità della mia istruzione select Postgres?
- 22. On Ricerca della profondità massima di un elenco annidato arbitrariamente
- 23. Perché non posso aumentare session.timeout.ms?
- 24. Come aumentare la larghezza della colonna Griglia Kendo automatica
- 25. Aumentare la dimensione della quota WebSQL in una WebView
- 26. Come aumentare il timeout della sessione della griglia di selenio?
- 27. ExpressionEngine aumento textarea limite
- 28. Come aumentare la dimensione dell'heap della memoria su IntelliJ IDEA?
- 29. Come aumentare l'altezza della cella e l'altezza della subview allo stesso tempo con l'animazione?
- 30. Come aumentare dinamicamente l'altezza della banda di dettaglio
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