Domanda

Ho altamente pezzo di C ++ ottimizzato e fare anche piccoli cambiamenti in luoghi lontani da punti caldi possono colpire le prestazioni fino al 20%. Dopo un'indagine più approfondita si è rivelato essere (probabilmente) leggermente diversi registri utilizzati in zone calde. Posso controllare inlineing con l'attributo always_inline, ma posso controllare l'allocazione dei registri?

È stato utile?

Soluzione

Se davvero si vuole pasticciare con l'alloation registro, allora è possibile forzare GCC per allocare le variabili locali e globali in alcuni registri.

A tale scopo, con una speciale dichiarazione di variabile in questo modo:

 register int test_integer asm ("EBX");

Opere per altre architetture pure, basta sostituire EBX con uno specifico nome del registro di destinazione.

Per ulteriori informazioni vi consiglio di dare un'occhiata alla documentazione di gcc:

http: //gcc.gnu .org / onlinedocs / gcc-4.3.3 / gcc / Local-Reg-Vars.html

Il mio suggerimento, tuttavia, non è quello di pasticciare con l'assegnazione registro se non si ha ottimi motivi per esso. Se si alloca alcuni registri te l'allocatore ha meno registri con cui lavorare e si può finire con un codice che è peggio che il codice di partenza.

Se la funzione è che le prestazioni fondamentale che si ottiene il 20% differenze di prestazioni tra compila può essere una buona idea di scrivere che cosa in inline-assembler.


EDIT: Come Strager ha sottolineato il compilatore non è costretto ad utilizzare il registro per la variabile. E 'solo costretto a utilizzare il registro se la variabile è utilizzato a tutti. Per esempio. se la variabile non sopravvive un'ottimizzazione passarlo non verrà utilizzato. Anche il registro può essere utilizzato per altre variabili come bene.

Altri suggerimenti

In generale la parola registro viene semplicemente ignorato da tutti i compilatori moderni. L'unica eccezione è il (relativamente) recente aggiunta di un errore se si tenta di prendere l'indirizzo di una variabile hai segnato con la parola chiave registro.

Ho sperimentato questo tipo di dolore così, e alla fine ho trovato l'unico vero modo intorno ad esso è stato quello di esaminare il montaggio uscita per cercare di determinare che cosa sta causando gcc di andare fuori dal Deepend. Ci sono altre cose che si possono fare ma dipende esattamente ciò che il codice sta cercando di fare. Ho lavorato in una grande funzione con una grande quantità di caos goto calcolato in cui minori (apparentemente innocui) modifiche potrebbero causare risultati prestazionali catastrofiche. Se stai facendo simili ci sono alcune cose che puoi fare per cercare di mitigare il problema, ma i dettagli sono un po 'icky quindi mi rinunciare a discutere qui meno che non sia effettivamente rilevanti.

Dipende dal processore che si sta utilizzando. O dovrei dire, sì, si può con la parola chiave registro, ma questo è visto di buon occhio a meno che non si sta utilizzando un semplice elaboratore senza pipe-rivestimento e un singolo core. In questi giorni GCC possono fare un modo migliore lavoro che si può con allocazione dei registri. Fidati di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top