Ottimizzazione di tutto il programma

2

Ho appena chiesto del modello poliedrico e ho esaminato altre ottimizzazioni del compilatore ( Loop srotolare , Piegatura e propagazione costanti , Eliminazione del codice morto ecc.).

Ma non ho visto nulla su l'intero programma di trasformazione / ottimizzazione . Chiedendosi se c'è qualcosa su quell'argomento, materiali o tecniche. Un esempio sarebbe prendere tutto il tuo programma e riordinare le chiamate di funzione e gli usi variabili alla scala dell'intero programma per renderlo più ottimizzato (a differenza della scala dei singoli loop o dei blocchi di base).

Mi sto chiedendo in particolare in che modo questo ottimizzatore potrebbe sapere di sostituire una funzione di alto livello (facendo riferimento a più funzioni / funzioni di alto livello) potrebbe essere sostituita da un'altra funzione. Lo stesso con un insieme di queste funzioni. L'ottimizzatore dovrebbe in qualche modo conoscere l'intento del programmatore a quanto pare, ma chissà che forse hanno capito un modo.

    
posta Lance Pollard 01.05.2018 - 07:22
fonte

1 risposta

3

L'ottimizzazione di tutto il programma include (praticamente, almeno per C o C ++ e lingue simili) inlining across translation units , quindi a volte è (impropriamente) chiamato ottimizzazione del link-time (LTO), ma viene comunque eseguita dal compilatore anch'esso in esecuzione durante la fase di collegamento. BTW, LTO esisteva almeno dagli anni '90 (e probabilmente anche nel periodo mainframe, negli anni '70).

In pratica, compilatori recenti come GCC o Clang sono in grado di farlo, ad es con il -flto flag di ottimizzazione (da passare, con qualche altro flag come -O2 , entrambi alla compilazione e al momento del collegamento a gcc , clang , g++ , clang++ ecc ...). Ciò funziona essenzialmente quasi duplicando lo sforzo di ottimizzazione: per ogni unità di traduzione, la rappresentazione interna del codice sorgente (ad esempio una sorta di GIMPLE per GCC ) viene generato anche in oggetto file s. Al momento del "link" tutte queste rappresentazioni sono ottimizzate di nuovo insieme. Quindi il tempo di compilazione complessivo (inclusa "ottimizzazione del link-time" che avviene nel compilatore ...) è quasi raddoppiato nella pratica.

Tuttavia, l'ottimizzazione link-time di solito non vale lo sforzo, dal momento che in pratica raddoppia il tempo di costruzione per ottenere solo poche percentuali di prestazioni in fase di esecuzione del programma compilato (ovviamente, ci sono eccezioni a questa regola di -thumb osservazione).

Compilatori per le lingue che hanno una nozione esplicita di moduli (e reificano la loro rappresentazione in una sorta di dati), o per omoiconico lingue, può anche ottimizzare l'intero programma in un modo diverso (avendo ancora una rappresentazione del codice dell'intero programma) . Esamina Stalin o PolyML (o anche Ocaml o Go o SBCL a volte) o CAIA o SELF per esempi.

(Non capisco perché i ricercatori abbiano chiamato il loro software prototipo "Stalin" .Questo nome è così disgustoso per me che non sono psicologicamente in grado di provare quel compilatore. Per i futuri accademici: per favore dai un nome al software!)

    
risposta data 01.05.2018 - 08:51
fonte

Leggi altre domande sui tag