2013-03-25 10 views
18

che sto leggendo: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlg ++ flag di ottimizzazione: -fuse-linker-plugin vs -fwhole programma

Essa suggerisce primo: In combinazione con -flto di utilizzare questa opzione (-fwhole-programma) non dovrebbe essere usato. Invece basarsi su un plugin linker dovrebbe fornire informazioni più sicure e più precise.

E poi, suggerisce: Se il programma non richiede alcun simbolo da esportare, è possibile combinare -flto e -fwhole programma per consentire gli ottimizzatori interprocedurali di utilizzare ipotesi più aggressivi che può portare a migliori opportunità di ottimizzazione. L'utilizzo di -fwhole-program non è necessario quando il plug-in del linker è attivo (vedere -fuse-linker-plugin).

Vuol dire che in teoria, utilizzando -fuse-linker-plugin con -flto ottiene sempre un eseguibile meglio ottimizzato che usare -fwhole programma con -flto?

ho cercato di usare ld di collegamento con -fuse-linker-plugin e -fwhole programma a parte, e le dimensioni gli eseguibili almeno sono diversi.

Grazie in anticipo.

P.S. Sto usando gcc 4.6.2 e ld 2.21.53.0.1 su CentOS 6.

+1

fwiw, seguendo la tua citazione - "L'uso di -fwhole-program non è necessario quando il plugin linker è attivo (vedi -fuse-linker-plugin)." - vedremo più avanti nella documentazione - ** "Questa opzione [' -fuse-linker-plugin'] è abilitata di default quando il supporto LTO in GCC è abilitato e GCC è stato configurato per l'uso con un linker che supporta i plugin (GNU ld 2.21 o più recente o oro). "** - quindi suppongo che copra le installazioni moderne più ragionevoli di gcc. nel senso che hanno un'opzione predefinita che rende '-fwhole-program' non necessario. ma questa è solo la mia interpretazione di tutto questo! –

risposta

1

Queste differenze sono sottili. In primo luogo, capire cosa fa effettivamente -flto. In sostanza crea un output che può essere ottimizzato in seguito (in "link-time").

Nei -fwhole programma fa è assume "che l'unità di compilazione corrente rappresenta l'intero programma sia compilato" se questo è effettivamente il caso. Pertanto, GCC supporrà che conosca tutti i luoghi che chiamano una funzione particolare. Come dice, potrebbe usare ottimizzatori inter-procedurali più aggressivi. Te lo spiegherò tra un po '.

Infine, ciò che -fuse-linker-plug-in fa in realtà esegue le ottimizzazioni al tempo di collegamento che normalmente verrebbero eseguite quando ciascuna unità di compilazione viene eseguita. Quindi, questo è stato progettato per l'abbinamento con -flto perché -flto significa che si risparmiano informazioni sufficienti per eseguire ottimizzazioni in un secondo momento e -fuse-linker-plugin significa in realtà eseguire tali ottimizzazioni.

Quindi, dove si differenziano? Bene, come suggerisce il GCC, non vi è alcun vantaggio, in linea di principio, nell'uso di -fondo-programma poiché tale opzione presuppone che è necessario assicurarsi che ciò sia vero. Per romperlo, basta definire una funzione in un file .cpp e usarla in un altro. Otterrai un errore del linker.

C'è qualche vantaggio per -fwhole-program? Bene, se hai una sola unità di compilazione, puoi usarla, ma onestamente, non sarà migliore. Sono stato in grado di ottenere eseguibili di dimensioni diverse utilizzando programmi equivalenti, ma quando si verificava il codice macchina generato, erano identici. In effetti, le uniche differenze che ho visto erano che i numeri di riga con informazioni di debug erano diversi.

Problemi correlati