# Istruzione predicativa

Lesecuzione predicativa è una tipologia di esecuzioni d'istruzioni utilizzata in informatica. Usualmente viene utilizzata all'interno dei microprocessori per migliorarne le prestazioni, migliorando l'utilizzo delle pipeline.

## Principio di funzionamento

I moderni microprocessori sono basati su architetture a pipeline, questi al loro interno sono composti da più pipeline che lavorano in parallelo per eseguire il codice. Uno dei principali problemi moderni è massimizzare il riempimento delle pipeline dato che dal punto di vista tecnologico è semplice realizzare microprocessori con molte pipeline ma risulta difficile far lavorare più di quattro pipeline in parallelo dato che non si riesce a parallelizzare li codice in modo efficiente. Uno dei vincoli che si incontra quando si cerca di parallelizzare il codice sono le istruzioni di salto condizionato. Le istruzioni di salto condizionato fermano l'esecuzione del codice, fino a quando il salto non è stato elaborato il processore non sa quali sono le istruzioni successive da elaborare e quindi non può eseguire operazioni in parallelo al salto. Per limitare il problema i processori possono adottare l'esecuzione predicativa.
L'esecuzione predicativa punta a fondere dentro le istruzioni del processore i salti condizionati. Questa tipologia di esecuzione prevede che le istruzioni siano dotate oltre che degli usuali campi dove sono inserite le operazioni di un nuovo campo che specifica se il salto va eseguito o no, questo campo è chiamato il predicato. Questo bit definisce se l'istruzione andrà tenuta o eliminata, in sostanza nel caso di salti condizionati che coinvolgono un numero limitato di istruzioni il processore esegue in parallelo le istruzioni dei due rami del salto condizionato e quando il salto condizionato è stato elaborato provvede a eliminare le istruzioni non valide. Questo comporta che il processore eseguirà anche delle istruzioni non necessarie ma consente di massimizzare il riempimento delle pipeline. Dato che nei moderni processori non ci sono problemi a integrare molte pipeline questa tecnica di esecuzione permette di incrementare le prestazioni complessive dei processori.

## Esempio

Nella prima colonna è indicato lo pseudocodice, nella seconda colonna è indicato il codice assembler in un processore con esecuzione classico e nella terza colonna è indicato il codice assembler di un processore che gestisce l'esecuzione predicativa.
Il codice assembler della seconda colonna comprende un salto condizionato (l'istruzione BNE) che dipende dall'istruzione di confronto (istruzione CMP) che viene eseguita prima del salto. Quindi fino a quando l'istruzione di confronto non è terminata il processore non può sapere se eseguire o no l'istruzione di salto e questo introduce uno stallo nelle pipeline. Nel codice predicativo la prima istruzione (l'istruzione CMPEX) esegue il confronto e pone il risultato nel predicato P1 e nel predicato P2 l'opposto. Le altre istruzioni sono indipendenti e possono essere eseguite in parallelo, il processore quando avrà terminato di eseguire l'istruzione di confronto conoscerà il valore dei predicati P1 e P2 ed eliminerà le istruzioni che avranno il predicato a 0. In teoria se il processore fosse dotato di cinque pipeline potrebbe eseguire tutte le istruzioni in parallelo e poi eliminare le due non necessarie. Un processore senza esecuzione predicativa potrebbe o attendere il calcolo del salto prima di eseguire le istruzioni o cercare di prevedere quale dei due rami (IF o ELSE) seguire. Nel primo caso avremmo una sicura riduzione delle prestazioni nel secondo caso il processore potrebbe individuare il ramo giusto da eseguire ma potrebbe anche individuare il ramo sbagliato, dovendo quindi eliminare le istruzioni eseguire e recuperare l'altro ramo per eseguire le sue istruzioni. Comunque mediamente fornirebbe prestazioni inferiori al processore con esecuzione predicativa.