Quale tipo di previsione del ramo è più importante?


11

Ho osservato che ci sono due diversi tipi di stati nella previsione del ramo.

  1. Nell'esecuzione superscalare, dove la predizione del ramo è molto importante, ed è principalmente nel ritardo dell'esecuzione piuttosto che nel ritardo del recupero.

  2. Nella pipeline di istruzioni, in cui il recupero è più un problema poiché le istruzioni non vengono effettivamente eseguite fino a dopo.

Quale di questi è molto importante (come in quali di questi conta davvero nella CPU oggi)? Se entrambi sono ugualmente importanti o nel caso in cui il secondo sia più importante, allora perché non abbiamo due pipeline di istruzioni (probabilmente della metà della lunghezza) e quindi a seconda dei rami, basta sceglierne uno e ricominciare la popolazione dal inizio?


1
Forse entrambi sono importanti, a seconda delle circostanze?
Raffaello

Risposte:


6

Non so quale caso sia prevalente, ma vorrei offrire alcune riflessioni sulla tua proposta di doppie condotte.

Prima di tutto, dovresti raddoppiare il filo che consumerebbe il doppio dell'energia e produrrebbe il doppio del calore mentre era attivo. Mentre non necessario, d'altra parte, sarebbe completamente inutile. Quindi si potrebbe sostenere che non è un buon uso delle risorse rare sui moderni processori.

Più fondamentalmente, a meno che tu non preferisca un ramo basato sulla probabilità, come fai a sapere quale versione scrivere? In caso contrario, potresti non salvare nulla perché altri processori potrebbero dover attendere la tua decisione, comunque. Se rimani con uno di questi, hai essenzialmente la stessa probabilità di rollback e il costo che hai ora.

Facciamo un calcolo approssimativo. Per semplicità, supponiamo che la gestione di due pipeline anziché una non comporti un ulteriore sovraccarico di gestione. Il costo previsto (ad es. Energia, calore) è con una pipeline ( il costo dell'esecuzione di entrambe le alternative, la probabilità di rollback e il costo per il rollback senza il costo per l'esecuzione dell'altra alternativa) ma o anche - entrambi sono molto più grandi di se e sono relativamente piccoli ec p c r 2 c 2 c + p c r C p c r p t + p ( t r + t ) t t + p t r pC=c+p(cr+c)cpcr2c2c+pcrCpcrpcertamente (per quanto ne so, le previsioni delle filiali moderne hanno una precisione superiore al 90%). E non otteniamo molto per questo costo! I tempi di esecuzione previsti sono con una pipeline e resp. con due; poiché è piccolo, i risparmi di tempo sono trascurabili.t+p(tr+t)tt+ptrp


Per quanto ne so, Intel ha provato le "istruzioni di lettura per entrambi i lati del ramo" e persino "esegue le istruzioni per entrambi i lati del ramo", e ha smesso di farlo. O perché non ha ottenuto nulla, o perché il costo e la complessità erano così elevati che potevano ottenere più guadagni in modi diversi a parità di costo.
gnasher729,

@ gnasher729 E probabilmente è stato prima che venissimo a sapere dei difetti di sicurezza legati a funzioni come questa?
Raffaello

2

In un certo senso, l'effetto della previsione del ramo è più critico nel recupero delle istruzioni poiché non è possibile eseguire un'istruzione che non viene recuperata.

Per quanto riguarda l'esecuzione di entrambi i percorsi di un ramo, questo si chiama esecuzione desiderosa ed è stato studiato in qualche modo sostanzialmente. "Disjoint Eager Execution: An Optimal Execution" (1995) di Augustus K. Uht e Vijay Sindagi potrebbe essere degno di nota.

L'esecuzione desiderosa ha diversi problemi. Per una speculazione approfondita, il numero di percorsi che devono essere monitorati può aumentare in modo esponenziale (ogni percorso di ramo biforcato può incontrare un ramo). Anche la previsione dei rami è spesso molto accurata (> 90% corretta), quindi eseguire sempre entrambi i percorsi sarebbe dispendioso. L'esecuzione desiderosa può anche "contaminare" le cache con contenuti inutili. (Il documento sopra citato ha proposto un'esecuzione desiderosa intelligentemente limitata per evitare alcune di queste problematiche.) Un'impazienza limitata nel recuperare il percorso alternativo ha meno problemi e può essere in qualche modo interessante nel ridurre i ritardi nel recupero delle accuse in condotte più brevi.

Un altro approccio che è stato proposto è la previsione dinamica dei rami "amaca" (rami corti in avanti che si ricollegano al percorso principale del flusso di istruzioni). "La predicazione dinamica dell'amaca per le architetture di set di istruzioni non predicate" (1998) di Artur Klauser e altri potrebbe valere la pena di essere letta per questa idea. ("Wish Branches: Combinare la ramificazione condizionale e la previsione per l'esecuzione predittiva adattiva" di Hyesoon Kim et al.) Propone di aggiungere a un ramo ISA che facilita la predicazione delle amache e estende questo metodo di predicazione ai rami del ciclo difficili da prevedere.)


Questa è davvero una bella risposta! Grazie. :-)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.