Apri il menu principale

L'Esecuzione speculativa è una tecnica di ottimizzazione che consiste nel fare eseguire al computer operazioni che potrebbero essere necessarie solo in un secondo tempo. Elaborando i dati prima di sapere se è davvero necessario farlo può ridurre i ritardi che si avrebbero facendo il lavoro solo dopo aver saputo se è davvero necessario o no. Se ad un certo momento del flusso di esecuzione il lavoro svolto anticipatamente si dimostra inutile, allora i risultati ottenuti verranno semplicemente ignorati.

L'obiettivo dell'esecuzione speculativa è quello di creare maggiore concorrenza quando sono disponibili risorse supplementari, per esempio più CPU che funzionano in parallelo. Nel mondo reale questo approccio è attuato in varie situazioni, per esempio nella predizione delle diramazioni di esecuzione del flusso di esecuzione su processori con pipeline, nell'analisi predittiva per l'exploit di località,[1] nel precaricare memoria e file, e nel controllo di concorrenza ottimistica in sistemi database.[2][3][4]

IntroduzioneModifica

I moderni microprocessori con pipeline utilizzano l'esecuzione speculativa per ridurre il costo di istruzioni condizionali, utilizzando algoritmi che scelgono in anticipo la strada di esecuzione di un programma basandosi sullo storico di istruzioni eseguite in precedenza.[3] Per poter aumentare le prestazioni e l'utilizzazione delle risorse, le istruzioni possono essere schedulate in un momento in cui non è ancora chiaro se le istruzioni necessitano di essere eseguite, tramite un processo di predizione.[5]

VariantiModifica

La computazione speculativa è un vecchio concetto correlato.[6]

Esecuzione EagerModifica

 Lo stesso argomento in dettaglio: Valutazione eager.

L'esecuzione Eager è una forma di esecuzione speculativa dove entrambi i casi di un'istruzione condizionale sono eseguiti; tuttavia, i risultati sono restituiti solo se il predicato è vero. Con risorse illimitate, l'esecuzione eager (conosciuta anche come esecuzione oracle) offrirebbe, in teoria, le stesse prestazioni di una perfetta predizione. Con risorse limitate, l'esecuzione eager dovrebbe essere utilizzata con cautela, in quanto il numero di risorse necessarie cresce esponenzialmente per ogni livello di istruzioni da eseguire in anticipo.[7]

Esecuzione predittivaModifica

 Lo stesso argomento in dettaglio: Pipeline dati.

L'esecuzione predittiva è una forma di esecuzione speculativa dove alcuni risultati sono decisi in anticipo e l'esecuzione procede con la strada scelta finché il risultato reale non diventa conosciuto. Se la predizione è stata effettuata correttamente, l'esecuzione preventivamente eseguita viene accettata e restituita; tuttavia se una predizione risulti essere errata, l'esecuzione verrà annullata ed eseguita nuovamente. Formi comuni di esecuzione predittiva includono predittori. Una forma generalizzata può talvolta essere riferita come analisi predittiva.[1][8]

Esecuzione LazyModifica

 Lo stesso argomento in dettaglio: Valutazione lazy.

L'esecuzione Lazy non coinvolge speculazione. L'incorporamento di esecuzione speculative in implementazioni del linguaggio Haskell è ad oggi argomento di ricerca. La versione Eager di Haskell è progettata sull'idea di esecuzione speculativa. Dal 2009, in GHC si è aggiunto il supporto per un tipo di speculazione, chiamata esecuzione ottimistica[9], basata su un meccanismo di aborto e ripristino in caso di scelta predittiva sbagliata. In passato questa valutazione era considerata troppo complessa.[10]

Vulnerabilità di sicurezzaModifica

 Lo stesso argomento in dettaglio: Meltdown (vulnerabilità di sicurezza).
 Lo stesso argomento in dettaglio: Spectre_(vulnerabilità_di_sicurezza).
 Lo stesso argomento in dettaglio: Vulnerabilità.

Voci correlateModifica

NoteModifica

  1. ^ a b "A Survey of Value Prediction Techniques for Leveraging Value Locality", S. Mittal, Concurrency and Computation, 2017
  2. ^ Lazy and Speculative Execution Butler Lampson Microsoft Research OPODIS, Bordeaux, France 12 December 2006
  3. ^ a b International Business Machines Corporation. Research Division, Prabhakar Raghavan, Hadas Schachnai e Mira Yaniv, Dynamic schemes for speculative execution of code, IBM, 1998. URL consultato il 18 gennaio 2011.
  4. ^ H. T. Kung e John T. Robinson, On optimistic methods for concurrency control, in ACM Trans. Database Syst., vol. 6, nº 2, giugno 1981.
  5. ^ Bernd Krieg-Brückner, ESOP '92: 4th European Symposium on Programming, Rennes, France, February 26-28, 1992: proceedings, Springer, 1992, pp. 56–57, ISBN 978-3-540-55253-6. URL consultato il 18 gennaio 2011.
  6. ^ Randy B. Osborne, Speculative Computation in Multilisp (PS), Digital Equipment Corporation Research Lab, 21 marzo 1990, DOI:10.1007/BFb0024152. URL consultato il 26 gennaio 2018.
  7. ^ Jurij Šilc, Borut Robič e Theo Ungerer, Processor architecture: from dataflow to superscalar and beyond, Springer, 1999, pp. 148–150, ISBN 978-3-540-64798-0. URL consultato il 21 gennaio 2011.
  8. ^ Hill Mark D., Jouppi Norman P. e Sohi Gourindar S., Readings in Computer Architecture, Morgan Kaufman, 2000. URL consultato il 5 gennaio 2018.
  9. ^ Optimistic Evaluation: a fast evaluation strategy for non-strict programs
  10. ^ https://mail.haskell.org/pipermail/haskell/2006-August/018424.html