Newsgroup: it.comp.lang.c++
Titolo: Sul un mio problema di prestazioni

Io avevo un problema che uno stesso programma se compilato con gcc
sotto linux va a velocità X, mentre se compilato con il compilatore
microsoft su windows va X/2.
Dopo svariati test mi sono fatto l'idea che il problema sia che il GCC
non riesca ad ottimizzare "decentemente" del codice che fa
pesantemente uso dei template. Non ho la pistola fumante, ma svariati
indizi.
Qualche altra persona ha mai avuto simili sensazioni?
Personalmente penso di provare ad usare il compilatore Intel, anche se
il cambio aziendale del compilatore so già che sarebbe un bagno di
sangue.

 non riesca ad ottimizzare "decentemente"...
C'è qualcosa che non torna. se capisco bene hai scritto:
1 - GCC + linux => velocità X
2 - MSVC + windows => velocità X/2 (dimezzata)
3 - Sospetti un problema in GCC
I casi sono due: o non ho capito bene e intendevi dire che 2 è più 
veloce di 1, allora GCC ci può stare sul banco degli imputati,
oppure
ti sei sbagliato a scrivere e sospetti che il problema sia in MSVC
Il punto mi interessa non poco visto che sto impostando alcuni progetti 
con MSVC ultima versione (10) che usano pesantemente template.
Io ho notato una discreta lentezza del compilatore e una certa 
pesantezza dei files intermedi (obj...) ma credo che con i template sia 
quasi inevitabile. Sulla velocità degli exe per ora non ho sospetti... 
ma a dire la verità ho anche pochi termini di paragone.

 C' qualcosa che non torna. se capisco bene hai scritto:
Del tempo di compilazione me ne infischio, naturalmente.
No, il mio problema è (secondo me) proprio dell'ottimizzazione del
gcc.
Su una parte di codice scritta praticamente in C, anche se formalmente
è codice C++, non ho problemi.
La versione che gira sotto linux va veloce circa uguale a quella che
gira sotto windows.
Macchine simili, compilatori diversi, prestazioni confrontabili.
Se invece mi metto a "testare" una parte di codice (molto grossa per
di più) che è tutto un template stile boost, allora le prestazioni
sotto linux crollano. Le opzioni di compilazione sono le solite e le
stesse nei due casi. Sono molto mesi che sospetto che sia lì il
problema, in verità. Non sono quindi un tester del tutto imparziale.
Mi sempre altresì strano che io sia l'unica a lamentarsi delle
capacità ottimizzanti del gcc nel caso di template, quindi sospetto
che ci sia un errore nel mio teste  che mi che io sto prendendo
lucciole per lanterne. Boost è tutto un template ed è
multipiattaforma. Certo, uno  deve lavorare in ambienti
multipiattaforma e con applicazioni che fanno un uso molto intensivo
della CPU, altrimenti non si può accorgere del problema.
Poi ho un altra grana velocistica tra applicativi a 32 bit che girano
sotto windows 7 a 64 bit invece che su windows server 2008 rc2. Però è
un'altra storia.

 stesse nei due casi.
I template e il sistema operativo non interagiscono, e quindi non 
possono essere intrinsecamente correlati.
Dato che GCC esiste anche per altri sistemi operativi, per esempio per 
Windows, provalo (sotto forma di Mingw o di Cygwin).
Inoltre non vedo come le opzioni di compilazione possano essere le 
stesse nei due casi, dato che VC++ e GCC hanno opzioni molto diverse.
Prova alcune delle numerose opzioni di compilazione di GCC; per esempio, 
-ftemplate-depth=n e -funroll-loops.
-- 
Carlo Milanesi
http://carlomilanesi.wordpress.com/

 -ftemplate-depth=n e -funroll-loops.
Questo vuol dire andare a tentoni. Lo posso fare, ma ad andare a tentoni 
non è detto che si trovi un'uscita. Una prova, fatta seriamente, mi 
costa qualche giorno di lavoro di un paio di persone. Vorrei non andare 
a tentoni.

 Questo vuol dire andare a tentoni.
Non avendo una descrizione precisa del problema, non vedo come si possa 
dare indicazioni piu' precise. Per esempio, dato che hai citato Boost, 
indica una libreria di Boost che va piu' veloce con VC++ che con GCC.
Se conosci il linguaggio macchina del tuo computer, prova a leggere il 
codice generato nei colli di bottiglia (ma questo richiede un 
investimento significativo di tempo).


 indica una libreria di Boost che va piu' veloce con VC++ che con GCC.
Spirit.
Probabilmente la linea che passerà sarà usare Mingw sotto windows e 
l'omologa versione sotto Linux. Questo permetterebbe il confronto 
diretto tra i due compilatori. Quello che tutti si aspettano in azienda 
è che a livello di ottimizzazioni i due compilatori siano comparabili. 
Invece incomincio a farmi l'idea che la cosa non è così scontata. Non se 
si tratta di C++. I crudi numeri poi ci diranno da che parte pende la 
bilancia.
Poi comunque io caldeggerò anche l'entrata in campo del compilatore 
Intel, ma non credo che passerà la linea per questioni meramente pratiche.

 carrozzate o 10 a seconda se usa Windows o Linux .
Mentre facevamo dei test per capire qualcosa del nostro problema oggi ne 
abbiamo scoperta una bella. In windows server 2008 R2 devono avere 
cambiato lo scheduler, sospettiamo che venga privilegiato il basso 
consumo di corrente.
Nel PC di test multiprocessore, ho visto il processo di test migrare da 
una CPU all'altra. Essendo un processore in cui i core sono a loro volta 
a frequenza variabile, la migrazione porta a incredibili penalità. Non 
solo la cache vicina al processore viene continuamente invalidata, ma il 
processore su cui rimbalza sta sempre girando ad una frequenza minore, e 
ci mette un po' ad accelerare. Poi quando accelera, il processo è fatto 
migrare ad un altro processore.
Si parla di un tempo di elaborazione che sale da un minimo del 15 ad un 
massimo del 25 per cento solo per questo giochetto (in fase di test). 
Questo confronto è fatto tra windows server 2008 R2 a 64 bit, con le 
precedenti versioni server di windows a 64 bit.

 precedenti versioni server di windows a 64 bit.
Penso che si possa, a livello di cmos setup o di sistema operativo, 
disabilitare la variazione di frequenza del processore.
Inoltre, con il comando:
     start /B /AFFINITY 1 x
... si lancia il comando x forzando la sua esecuzione sul solo 
processore 1, se disponibile.


>> -ftemplate-depth=n e -funroll-loops.
Perchè non ti togli il dubbi e profili il programma!
Se è una routine che non viene ottimizzata correttamente vedrai 
schizzare su il tempo per la funzione.
In più quando profili si tiene conto del tempo programma e non del tempo 
reale (tipo con time su linux).
Buon lavoro

 Perchè non ti togli il dubbi e profili il programma!
Oggi abbiamo scoperto due cose importanti.
Uno è che alcuni test che facciamo sono bacati in partenza, e quindi la 
mia teoria che il gcc non ottimizzi bene i template potrebbe rivelarsi 
una gran cagata.
Due che su windows 2008 server r2 è cambiata l'impostazione di default 
del "power saving". Di default è settato per bilanciare il sistema 
(qualsiasi cosa voglia dire questa frasetta). Settando l'opzioni di 
massimizzare le prestazioni, almeno sotto windows, le prestazioni si 
sono allineante. Sotto windows 7 desktop, di default, sono privilegiate 
le prestazioni.
La domanda quindi che ci stiamo ponendo è se i test sui server linux 
erano veritieri, oppure era semplicemente configurato male il server.
Il trionfo dell'offtopic.
Ormai non c'è più nulla di C++ nei miei post.