Esecuzione speculativa

L'esecuzione speculativa (in inglese: speculative execution) è 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]

Introduzione modifica

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]

Varianti modifica

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

Esecuzione eager modifica

  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 predittiva modifica

  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 lazy modifica

  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 sicurezza modifica

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

Note modifica

  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), su hpl.hp.com, Digital Equipment Corporation Research Lab, 21 marzo 1990, DOI:10.1007/BFb0024152. URL consultato il 26 gennaio 2018 (archiviato dall'url originale il 7 febbraio 2017).
  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

Voci correlate modifica

Collegamenti esterni modifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica