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
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
La computazione speculativa è un vecchio concetto correlato.[6]
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]
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]
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]
^ab 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.
^H. T. Kung e John T. Robinson, On optimistic methods for concurrency control, in ACM Trans. Database Syst., vol. 6, n. 2, giugno 1981.