7

In che modo i moderni compilatori di ottimizzazione determinano quando applicare determinate ottimizzazioni come lo srotolamento del loop e l'inlining del codice?In che modo i moderni compilatori di ottimizzazione determinano quando ottimizzare?

Poiché entrambi influiscono sul caching, ingenuamente le funzioni di inlining con meno di X lines, o qualsiasi altra semplice euristica, è probabile che generi codice con prestazioni peggiori. Quindi, come si comportano i compilatori moderni con questo?

Sto avendo difficoltà a trovare informazioni su questo (soprattutto informazioni che è ragionevolmente facile da capire ..), il meglio che ho trovato è il wikipedia article. Qualsiasi dettaglio, link a libri/articoli/documenti sono molto apprezzati!

EDIT: Poiché le risposte stanno parlando principalmente delle due ottimizzazioni che ho citato (inlining e loop srotolamento) volevo solo chiarire che sono interessato a tutte le ottimizzazioni del compilatore e non solo a quelle due. Sono anche più interessato alle ottimizzazioni che possono essere eseguite durante la compilazione in anticipo, sebbene l'ottimizzazione JIT sia di interesse (anche se in misura leggermente inferiore).

Grazie!

risposta

5

Di solito essendo comunque così ingenuo, spero che sia un miglioramento.

Ecco perché la compilazione just-in-time è una strategia vincente. Raccogli le statistiche quindi ottimizza per il caso comune.

Riferimenti:

+0

JIT non ha sempre il tempo per alcune massicce ottimizzazioni, e le codepath a volte variano in modo massiccio sui dati, quindi le ottimizzazioni guidate dal profilo non sono nemmeno sempre nella giusta direzione. –

1

È possibile visualizzare un progetto Spiral.

Oltre a ciò, l'ottimizzazione è una cosa difficile da fare genericamente. Questo è, in parte, il motivo per cui ci sono così tante opzioni per il compilatore gcc. Se sai qualcosa sulla cache e sulle pagine puoi fare alcune cose a mano e richiedere che altre facciano il compilatore, ma non ci sono due macchine uguali, quindi l'approccio deve essere ad hoc.

1

Buona domanda. Stai chiedendo le cosiddette ottimizzazioni speculative.

I compilatori dinamici utilizzano sia l'euristica statica che le informazioni del profilo. I compilatori statici utilizzano l'euristica e le informazioni del profilo (offline). L'ultimo è spesso indicato come PGO (Profile Guided Optimizations).

C'è un sacco di articoli sulle politiche di inlining. Il più completo è

An Empirical Study of Method Inlining for a Java Just-In-Time Compiler

Esso contiene anche riferimenti a lavori connessi e aspre critiche su alcuni degli articoli considerati (giustificato).

In generale, i compilatori di ultima generazione cercano di utilizzare l'analisi di impatto per stimare il potenziale effetto delle ottimizzazioni speculative prima di applicarle.

P.S. Lo srotolamento del loop è una roba classica e classica che aiuta solo alcuni loop stretti che eseguono solo operazioni di numero crunchng (nessuna chiamata e così via). L'inlining del metodo è molto più importante nei moderni compilatori.