5

Mi piacerebbe sapere come scrivere tabelle di salto efficienti per processori x64, in C, C++ o assembly. L'input è noto in anticipo, ma impossibile da prevedere algoritmicamente. Supponendo che io possa guardare avanti quanto voglio nel flusso di input, c'è un modo in cui posso dire dinamicamente alla CPU quale indirizzo il prossimo ramo sta per andare?Come posso suggerire dinamicamente una diramazione su una CPU x64?

In sostanza, mi piacerebbe aggiornare a livello di codice il buffer di destinazione Branch. Ma mi accontenterei di qualsiasi cosa che mi permetta di evitare di sciacquare la pipeline nei casi in cui il programmatore sa in anticipo dove sta andando il prossimo ramo, osservando i dati ma il processore non può determinare questo dai pattern del passato.

Realizzando questa è una domanda molto specifica e che sono suscettibili di essere riusciti a trasmettere in modo corretto, qui ci sono un paio di fraseggi alterni:

C'è un 64 equivalente a hbr Suggerimento per la filiale sul processore Cell ?

Ha mai aiutato a spostare un assieme cmp prima del suo ramo condizionale come ha fatto con Itanium?

L'obiettivo previsto di un salto indiretto si basa sempre su un valore di registro anziché sull'ultimo indirizzo utilizzato?

Grazie!

risposta

1

Se non si riesce a trovare una risposta esatta, è possibile utilizzare il predittore dell'indirizzo di ritorno anziché il buffer di destinazione della diramazione. La tecnica generale si chiama context threading e una descrizione può essere trovata nel documento Context Threading: A Flexible and Efficient Dispatch Technique for Virtual Machine Interpreters.

L'idea per te sarebbe: se riesci a guardare abbastanza lontano nel futuro, per ogni input che determina un cambiamento del flusso di controllo, puoi JIT-compilare/emettere un'unica istruzione diretta call in qualche memoria eseguibile. Ad esempio, se avessi dieci unità di input, emetteresti 10 chiamate.

Eseguito, questo codice si comporterebbe bene poiché gli indirizzi di ritorno di ogni funzione chiamata non cambiano e tutte le chiamate sarebbero dirette.

Una nota a margine, non sono una persona dell'architettura CPU, quindi forse sto semplificando le cose, ma in linea di principio penso che dovrebbe funzionare.

Problemi correlati