View Full Version : [C] AIUTO, forte calo prestazioni con Vista
ironman80
15-05-2009, 11:15
Salve, uso Ubuntu per imparare a programmare col C, in particolare programmi di number-crunching... Ho provato a compilare un programma per la trasmissione termica che usa il metodo delle differenze finite: il mio problema e' che compilando lo stesso programma con MinGW, la sua esecuzione sotto Vista e' lentissima, in Ubuntu (compilato con gcc) completa il lavoro in 16 secondi, mentre in Vista in 30... :muro: Anche con l'utilizzo di wine per lanciare l'eseguibile win32 sotto linux il calcolo viene completato in 16 secondi. Ho un portatile con cpu Intel Core2 Duo T9400 a 2.53GHz, ho gia controllato che non sia impostata la modalita' di risparmio energetico ecc... Lo stesso programma su un vecchio athlon a 2GHz con WinXp completa il lavoro piu' velocemente (in 25sec) ! Ho inoltre provato anche la versione gratuita di Visual C++ Express ottenendo lo stesso risultato scoraggiante (e anche peggio). Com'e' possibile? Sara' dovuto all'utilizzo di qualche libreria dinamica? Il sorgente in se' non si appoggia ad alcuna libreria, tranne quelle standard del C naturalmente. Magari con gcc le librerie vengono incluse staticamente e con MinGW dinamicamente? Ringrazio chiunque sappia darmi qualche risposta/consiglio.
Ps. ho appena provato ad eseguire sotto Ubuntu (con Wine) il programma compilato con VS, e' anche piu' veloce della versione compilata con GCC, completa il lavoro in meta' tempo rispetto all'esecuzione sotto Vista!
!k-0t1c!
15-05-2009, 11:26
Per avere una comparazione adeguata dovresti usare un compilatore altrettanto efficiente sui due sistemi. Inoltre a seconda dell'implementazione della standard library (e dell'uso che ne fai) i risultati potrebbero variare. Infine i vari anti* presenti su windows potrebbero rallentare l'allocazione/deallocazione di memoria, quindi se fai abbondante uso di malloc e free, questa potrebbe essere una causa.
ironman80
15-05-2009, 11:54
Grazie, in effetti faccio ampio uso di malloc e free. Tuttavia mi sembra strano che lo stesso eseguibile sotto Xp e Linux sia il doppio piu' veloce che sotto Vista. Ho fatto un'ulteriore prova, sul desktop con Xp ho preparato una virtual machine con Vista, e in questo caso le prestazioni restano paragonabili a quelle del host con Xp (solo il 10% piu' lento)! Credo di aver fatto una comparazione adeguata lanciando lo stesso eseguibile sotto Vista, Xp e Ubuntu, e casomai tra i tre dovrebbe essere svantaggiato Ubuntu. Quindi Vista gestisce diversamente l'allocazione della memoria? E provando Vista in una VM con host Xp, la gestione forse viene passata direttamente a quest'ultimo e per questo non si riscontra un tale calo nelle prestazioni?
!k-0t1c!
15-05-2009, 12:22
Mi è appena venuta in mente una cosa molto buffa che avevo riscontrato tempo fa occupandomi di alcune applicazioni per cui le performance erano importantissime: un'elaborazione che normalmente richiedeva 16ms su Vista richiedeva oltre 2s. Anche in quella circostanza c'erano molte malloc/free etc, e avevo osservato che eseguendo come amministratore le performance tornavano ai livelli previsti. Bizzarro, non ho mai capito il perché e non ho perso tempo a indagare, ma magari può esserti d'aiuto.
ironman80
15-05-2009, 12:48
Avviare come amministratore è stata una delle prime cose che ho provato, ma purtroppo nel mio caso non c'è stato alcun miglioramento.
!k-0t1c!
15-05-2009, 13:10
Prova ad eseguire qualche benchmark sintetico su Vista (tipo Sandra o Passmark) e vedi come sta andando la CPU. Verifica che i risultati non si discostino molto da quelli di riferimento per il tuo setup. E magari verifica anche la RAM
ironman80
15-05-2009, 13:22
Ho fatto anche questa verifica, col superpi, 1M in 18 secondi, e tempo fa ho provato con Sandra e 3DMark ed era tutto ok. Ho testato la ram con memtest e non da errori, e durante l'esecuzione dei programmi ho verificato con cpuz che la frequenza della cpu sia effettivamente quella massima.
Nedmalloc (http://www.nedprod.com/programs/portable/nedmalloc/)
Questo è 120x più veloce del memory allocator di Windows :D
Potresti provare ad usarlo (tanto è facilissimo, basta sostituire il nome delle funzioni) in maniera di fare un confronto alla pari tra Vista e Ubuntu.
Ora cambia completamente il codice del malloc, ed è ovvio che i risultati siano strani...
PS: hai provato in Release? Malloc di windows soffre molto il debug.
ironman80
15-05-2009, 17:17
Si, ho fatto tutto in release. Sto tentando di provare nedmalloc, ho messo tutti i file nella directory del mio sorgente, ho inserito un #include "nedmalloc.c", come nel file di esempio, ho sostituito tutti i malloc con nedmalloc e i free con nedfree, ma compilando in VS mi dice "nedmalloc: identificatore non trovato". Scusate, sono novellino, dove sbaglio?
Uhmno... devi includere nei tuoi file nedmalloc.h, e quindi aggiungere al progetto nedmalloc.c.
Se lo compili come C++ poi devi usare il namespace nedalloc...
ironman80
15-05-2009, 20:30
Provato co MSVC, funziona! Il tempo di calcolo si è ridotto del 50%, da 29 a 14 secondi! Prima ho provato anche con Hoard, ottenendo gli stessi risultati. Tuttavia non riesco a farlo funzionare da MinGW (uso NetBeans come IDE), ma solo dal MSVC. In particolare mi da errore su tutti i namespace del nedmalloc.h.
ironman80
15-05-2009, 20:45
Risolto il problema dei namespace modificando l'estensione del file in .cpp. Tuttavia non compila ancora, mi da "undefined reference to `_InterlockedExchange' " che compare nel malloc.c.h, Qualche suggerimento su come risolvere?
Ps. Grazie a tutti per il prezioso aiuto!
Non ti so dire come farlo funzionare... io mi son limitato ad inserirlo ed ha funzionato.
Magari, prova a lasciarlo .c e includerlo dentro "extern "C""
Cmq buono che migliora così tanto la situazione... chissà perchè nessuno sostituisce mai l'allocator di windows dato che si hanno miglioramenti "for free"...
Ps: il fatto che un allocator più performante ti dà tale vantaggio potrebbe voler dire che il tuo codice spreca malloc e frees... hai provato ad utilizzare del pooling, per riutilizzare la memoria?
ironman80
17-05-2009, 13:16
Innanzitutto vi ringrazio per l'aiuto! Ho provato ad utilizzare nedmalloc in gcc e funzionava a patto di compilare con l'opzione -pthread. In MinGW pthread non c'è, per questo non funzionava; ho provato poi con dlmalloc, funziona senza problemi in MinGW ed è il più semplice da implementare, è sufficiente includere nel progetto malloc.c e malloc.h. Dlmalloc funziona anche in VS, tuttavia alla terminazione del programma dà l'errore "this application has requested the runtime...", probabilmente va in conflitto col malloc della libreria msvcrt... Alla fine la soluzione più rapida e trasparente per VS si è rivelata Hoard, mentre per MinGW dlmalloc.
Che versione usi di MinGW? La versione stabile usa ancora gcc 3.4.5... quella in DEV mi pare sia la 4.3.x...
In ogni caso tenete a mente che è un porting, e per cui dubito sia molto ottimizzato per Win.
Usa il compilatore della Microsoft ;)
ironman80
17-05-2009, 14:14
Uso la stable. Si, tra un po' migrerò a VS perché comincierò a smanettare con CUDA, che sotto Windows è supportato esclusivamente da VS. Cmq contemporaneamente cercerò di farlo funzionare sotto Jaunty con l'accoppiata gcc+Netbeans, non appena alla Nvidia forniranno dei driver decenti non-beta che mi danno non pochi problemi sul mio portatile...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.