2009-11-04 16 views
7

ha numeri chiunque visto alcun mondo reale per i diversi programmi che utilizzano l'ottimizzazione feedback che i compilatori C/C++ offrono per sostenere il branch prediction, le funzioni di cache precaricamento eccC/C++ di feedback del compilatore di ottimizzazione

ho cercato per esso e sorprendentemente nemmeno i popolari gruppi di sviluppo di interpreti sembrano aver controllato l'effetto. E aumentare le prestazioni di ruby, python, php, ecc. Del 10% circa dovrebbe essere considerato utile.

Non c'è davvero alcun vantaggio o l'intera comunità di sviluppatori è semplicemente pigro ad usarlo?

+1

Credo che la parola che stai cercando sia "ottimizzazione guidata del profilo". Non conosco progetti importanti che pubblicano le misurazioni prima e dopo, ma so che Firefox supporta PGO nel suo sistema di compilazione. Vedere https://developer.mozilla.org/en/Building_with_Profile-Guided_Optimization – int3

+0

Informalmente, ho visto + 10% su basi di codice incorporate ma non ho mai visto studi formali di PGO. –

risposta

6

Il 10% è una buona figura del campo da baseball. Detto questo, ...

Devi VERAMENTE preoccuparti delle prestazioni per andare su questa rotta. Il prodotto su cui lavoro (DB2) utilizza PGO e altre ottimizzazioni invasive e aggressive. Tra i costi vi sono tempi di costruzione significativi (triple su alcune piattaforme) e incubi di sviluppo e supporto.

Quando qualcosa va storto, può essere non banale mappare la posizione del guasto nel codice ottimizzato fino all'origine. Gli sviluppatori di solito non si aspettano che le funzioni nei diversi moduli possano finire unite e inline e questo può avere effetti "interessanti".

I problemi con l'alias del puntatore, che sono pericolosi da rintracciare, di solito si manifestano anche con questi tipi di ottimizzazioni. Hai il divertimento in più di avere build non deterministici (un problema di aliasing può comparire nella build di lunedì, svanire di nuovo fino a giovedì, ...).

Anche la linea tra il comportamento del compilatore corretto o errato in questi tipi di ottimizzazioni aggressive diventa piuttosto confusa. Anche con il lusso di avere i nostri compilatori in house (letteralmente) i problemi di ottimizzazione (sia nella nostra fonte che nel compilatore) non sono ancora facili da capire e risolvere.

+1

Questo. Il PGO è il nemico mortale della rapida iterazione e non puoi lasciarlo fuori per testare perché ogni tanto viene introdotto un bug. Non è che non ci sia alcun beneficio, ma i guadagni perf sono marginali rispetto ai costi di sviluppo e supporto per la maggior parte delle applicazioni. –

+1

Ben messo David. E se usi i principali limiti di rilascio per preparare gli aggiornamenti del compilatore a fare in modo che queste ottimizzazioni non funzionino per mesi (probabilmente le cose funzioneranno di nuovo proprio vicino alle date di GA;). E sii preparato a creare un rilascio di servizi stabile e ben educato a un improvviso inizio di comportamento anomalo. E, ... Perché questo non è comune, probabilmente si riduce al denaro. C'è una grande spesa di personale per l'uso di PGO in un prodotto. –

+2

Si noti che la PGO di solito non introduce _insetti_di bug, ma piuttosto _esposte_, _finds_ o _trips over_ bugs. – MSalters

1

I metodi tradizionali per migliorare l'efficienza del compilatore tramite la profilatura vengono eseguiti dagli strumenti di analisi delle prestazioni. Tuttavia, il modo in cui i dati degli strumenti possono essere utilizzati nell'ottimizzazione dipende ancora dal compilatore che si utilizza. Ad esempio, GCC è un framework su cui si sta lavorando per produrre compilatori per domini diversi. Fornire meccanismi di profilazione in tale framework di compilazione sarà estremamente difficile.

Possiamo fare affidamento su dati statistici per fare una certa ottimizzazione. Ad esempio, GCC srotola un ciclo se il numero di cicli è inferiore a una costante (ad esempio 7). La correzione della costante si baserà sul risultato statistico delle dimensioni del codice generate per diverse architetture di destinazione.

Le ottimizzazioni guidate del profilo tracciano le aree speciali della sorgente. I dettagli riguardanti i risultati delle corse precedenti devono essere memorizzati, che è un sovraccarico. L'input dall'altra parte richiede una rappresentazione statistica dell'applicazione di destinazione che possa utilizzare il compilatore. Quindi il livello di complessità aumenta con il numero di diversi input e output. In breve, decidere l'ottimizzazione guidata del profilo richiede un'estrema raccolta dei dati. L'automazione o l'incorporamento di tale profiling nella fonte richiede un attento monitoraggio. Altrimenti, l'intero risultato sarà terribile e nel nostro sforzo di nuotare in realtà annegheremo.

Tuttavia, la sperimentazione su questo punto è in corso. Basta dare un'occhiata a POGO.

3

Da unladen-swallow (un progetto di ottimizzazione della CPython VM):

Per noi, l'ultimo chiodo nella bara di PyBench è stato quando la sperimentazione di strumenti di ottimizzazione di feedback diretto di gcc, siamo stati in grado di produrre un universale il 15% aumento delle prestazioni attraverso i nostri macrobenchmarks; utilizzando lo stesso carico di lavoro di addestramento, PyBench ha ottenuto il 10% più lentamente.

Quindi alcune persone stanno almeno guardando. Detto questo, PGO imposta alcuni requisiti piuttosto complessi sull'ambiente di costruzione che sono difficili da soddisfare per i progetti open-source creati da un gruppo eterogeneo di persone distribuito. Anche l'ottimizzazione pesante crea errori di heisenbug difficili da debugare. È meno lavoro dare al compilatore suggerimenti espliciti per le parti critiche per le prestazioni.

Detto questo, mi aspetto che aumenti significativi delle prestazioni dall'ottimizzazione guidata del profilo di runtime. JIT'ing consente all'ottimizzatore di gestire il profilo dei dati che cambiano durante l'esecuzione di un programma e di eseguire molte ottimizzazioni specifiche dei dati di runtime che esploderebbero le dimensioni del codice per la compilazione statica. Linguaggi particolarmente dinamici hanno bisogno di una buona ottimizzazione basata sui dati di runtime per funzionare bene. Con le prestazioni dinamiche del linguaggio che ricevono ultimamente un'attenzione significativa (VM JavaScript, MS DLR, JSR-292, PyPy e così via) c'è molto lavoro da fare in quest'area.

Problemi correlati