Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-12-2007, 08:55   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
[C++] Strano problema di ottimizzazione

Ciao ragazzi, ho un problema apparentemente strano. Dunque, io ho una classe StandardBackprop, una ParNeuralNet ed un'altra Test.

La classe TrainingNet ha nel suo header un puntatore alla classe ParNeuralNet. Nella classe ParNeuralNet ho una funzione che è la causa del problema:

Codice:
inline double ParNeuralNet::randomValue(double symmetric_range){
 	
 	double zero_one_value=((double)rand()/((double)(RAND_MAX)+1.0));
 	
 	double result=zero_one_value*(2.0*symmetric_range)-(symmetric_range);
 	
 	return result;
 	
   }
Ora, io richiamo tale funzione dalla classe Test con questa sintassi :

Codice:
 TrainingNet->Par->randomValue(range_max)
TrainingNet è un oggetto StandardBackprop, Par, oggetto ParNeuralNet. La classe StandardBackprop è figlio della classe BackProp, ParNeuralNet invece è una classe singola.

Il problema è che se compilo senza ottimizzazioni, tutto funziona liscio. Se invece metto l'ottimizzazione -O1, -O2, -O3, mi dice "undefined reference " a tale funzione.

Se però la stessa funzione, invece di dichiararla inline, la definisco direttamente nell'header di ParNeuralNet, compila anche con ottimizzazioni !

In pratica, sembra che,a causa della doppia referenziazione per accedere alla funzione, non riesca a fare l'inline direttamente. Avete qualche spiegazione di ciò? Grazie.

Ultima modifica di Unrue : 20-12-2007 alle 11:46.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 09:55   #2
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
Le funzioni inline le devi definire nell'header, devono essere disponibili subito al compilatore per essere espanse (o no, lo decide il compilatore)

Quote:
Se però la stessa funzione, invece di dichiararla inline, la definisco direttamente nell'header di ParNeuralNet, compila anche con ottimizzazioni !
Se la definisci nella definizione della classe, viene comunque considerata inline anche se non lo spefichi

Ultima modifica di kk3z : 20-12-2007 alle 09:58.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10:07   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da kk3z Guarda i messaggi
Le funzioni inline le devi definire nell'header, devono essere disponibili subito al compilatore per essere espanse (o no, lo decide il compilatore)



Se la definisci nella definizione della classe, viene comunque considerata inline anche se non lo spefichi
Ok, ma ho altre funzioni inline nel codice, e non mi compare lo stesso errore. Solo sulla funzione sopra menzionata. Perchè questo ?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10:18   #4
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
EDIT: modifico e mi crea un'altro post..

Ultima modifica di kk3z : 20-12-2007 alle 10:20.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10:20   #5
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
Ma tutte queste funzioni inline le chiami nello stesso modo (cioè dal puntatore di una classe che chiama una funziona di un'altra classe dal suo puntatore )?
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10:22   #6
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da kk3z Guarda i messaggi
Ma tutte queste funzioni inline le chiami nello stesso modo (cioè dal puntatore di una classe che chiama una funziona di un'altra classe dal suo puntatore )?
No, solo quella. E' lì il problema ?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10:55   #7
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ok, ma ho altre funzioni inline nel codice, e non mi compare lo stesso errore. Solo sulla funzione sopra menzionata. Perchè questo ?
Devi dichiarare la funzione inline nell'header file. Compila senza ottimizzazioni perche' il compilatore ignora l'inline, mentre con ottimizzazioni cerca la definizione della funzione e non la trova. Che compilatore stai usando?

Ma soprattutto: perche' hai dichiarato quella funzione inline?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 11:43   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi
Che compilatore stai usando?
mpicxx, è un wrapper MPI per g++

Quote:
Originariamente inviato da fek Guarda i messaggi
Ma soprattutto: perche' hai dichiarato quella funzione inline?
Perchè è chiamata moltissime volte ed è corta, quindi è bene dichiararla inline
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:05   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue Guarda i messaggi
mpicxx, è un wrapper MPI per g++
Ok, perche' il comportamento del compilatore mi pare un po' strano.

Quote:
Perchè è chiamata moltissime volte ed è corta, quindi è bene dichiararla inline
Hai un qualche profiling che dimostri che dichiarare quella funzione inline e' un'ottimizzazione misurabile oppure e' solo una tua ipotesi?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:12   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da fek Guarda i messaggi
Ok, perche' il comportamento del compilatore mi pare un po' strano.
Unrue non è stato chiaro su dove ha messo l'implementazione, se è in un file sorgente allora il comportamento è corretto...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:17   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
Unrue non è stato chiaro su dove ha messo l'implementazione, se è in un file sorgente allora il comportamento è corretto...
Si', per questo non mi era chiaro dove voleva mettere il corpo della funzione.

Edit:
Contr'ordine, il comportamento del compilatore non e' conforme allo standard.

In questa situazione:

.hpp
Codice:
class A
{
public:
	inline void m();
};
.cpp
Codice:
inline void A::m()
{
}
Il compilatore deve dare un "undefined reference" sia con ottimizzazioni attivate sia con ottimizzazioni disattivate se m e' referenziato in un'unita' di compilazione diversa da dove e' definito. Non deve semplicemente assumere il non inline quando le ottimizzazioni sono disattivate.
Se una funzione e' dichiarata inline in un'unita' di compilazione, il corpo deve essere definito in quell'unita'. Il comportamento del compilatore in relazione alla semantica del codice non deve cambiare a seconda delle ottimizzazioni.

Ultima modifica di fek : 20-12-2007 alle 14:37.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:47   #12
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi
Si', per questo non mi era chiaro dove voleva mettere il corpo della funzione.

Edit:
Contr'ordine, il comportamento del compilatore non e' conforme allo standard.

In questa situazione:

.hpp
Codice:
class A
{
public:
	inline void m();
};
.cpp
Codice:
inline void A::m()
{
}
Il compilatore deve dare un "undefined reference" sia con ottimizzazioni attivate sia con ottimizzazioni disattivate se m e' referenziato in un'unita' di compilazione diversa da dove e' definito. Non deve semplicemente assumere il non inline quando le ottimizzazioni sono disattivate.
Se una funzione e' dichiarata inline in un'unita' di compilazione, il corpo deve essere definito in quell'unita'. Il comportamento del compilatore in relazione alla semantica del codice non deve cambiare a seconda delle ottimizzazioni.
Ecco a me è proprio questo che non torna. Ok, ho sbagliato a mettere il corpo della funzione inline non nell'header. Ma se non mettevo il flag -O2 non me ne sarei mai accorto!!

Anche icc della Intel ha lo stesso comportamento. Mi pare strano che due compilatori diversi hanno questo comportamento.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:49   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi
Hai un qualche profiling che dimostri che dichiarare quella funzione inline e' un'ottimizzazione misurabile oppure e' solo una tua ipotesi?
Non ho fatto questo controllo, ma una funzione chiamata qualche migliaio di volte, se non un milione di volte, e con un corpo di tre righe di codice.. beh se il compilatore non mette inline quella, allora credo che non ne metta mai nessuna
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:51   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ecco a me è proprio questo che non torna. Ok, ho sbagliato a mettere il corpo della funzione inline non nell'header. Ma se non mettevo il flag -O2 non me ne sarei mai accorto!!

Anche icc della Intel ha lo stesso comportamento. Mi pare strano che due compilatori diversi hanno questo comportamento.
Ho provato per curiosita' con VS2005 e VS2008 ed entrambi danno correttamente l'errore anche senza ottimizzazioni attivate.

Curioso.

Comunque, non dichiarare quella funzione inline, tanto se il compilatore e' decente, nel 99.99% dei casi non cambia nulla a livello prestazionale

Quote:
Originariamente inviato da Unrue Guarda i messaggi
Non ho fatto questo controllo, ma una funzione chiamata qualche migliaio di volte, se non un milione di volte, e con un corpo di tre righe di codice.. beh se il compilatore non mette inline quella, allora credo che non ne metta mai nessuna
Guarda, ti puo' stupire la cosa, ma un buon compilatore quando conviene te la mette inline anche se non la dichiari inline (Whole Program Optimization).
In generale non dichiarare mai una funzione inline se non hai veramente un buon motivo per farlo, e solo dopo che hai provato empiricamente che mettere quella funzione inline ti dia effettivamente un guadagno.
Ancora piu' in generale, non fare mai assunzioni sulle ottimizzazioni, perche' scoprirai che nella maggior parte dei casi la tua assunzione e' sbagliata, spesso e volentieri quelle che pensiamo essere ottimizzazioni sono pessimizzazioni!
Che succede, ad esempio, se mettere una funzione inline ti causa frequenti cache miss in un loop e il codice va in realta' piu' piano? Non puoi saperlo finche' non misuri.

Mentre dichiarare una funzione online porta sicuramente degli svantaggi a livello di gestione del progetto. Innanzitutto ci hai gia' perso del tempo
Poi dichiarare metodi inline significa che ti devi portare eventualmente dietro nell'header file la dichiarazione di ogni eventuale oggetto che quella funzione usa. Poi, se dichiari un metodo virtuale inline carichi di moltissimo lavoro il linker. Ho visto situazioni in progetti grossi nelle quali togliere la dichiarazione inline da un metodo ha fatto scendere il tempo di link di minuti!

Ultima modifica di fek : 20-12-2007 alle 14:57.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:53   #15
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Visto che più o meno sino in tema, vorrei proporre altri quesiti.

Vorrei forzare una funzione ad essere inline, però ha circa 20 righe di codice. Anche questa è richiamata spessissimo. Quale è il flag di g++ che fa questo ? Non lo trovo più.

Inoltre, a parte l'aumento di spazio dell'eseguibile, quali contro indicazioni ci sono a forzare un inlining?

Ed inoltre, quale era quel flag che faceva vedere se il g++ ha messo o no inline una funzione? Grazie
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 14:55   #16
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi
Ho provato per curiosita' con VS2005 e VS2008 ed entrambi danno correttamente l'errore anche senza ottimizzazioni attivate.

Curioso.

Comunque, non dichiarare quella funzione inline, tanto se il compilatore e' decente, nel 99.99% dei casi non cambia nulla a livello prestazionale
No aspetta, intendi dire che lo fa comunque l'inlining? Perchè altrimenti ho l'overhead della chiamata a funzione, e non sarebbe sicuramente la stessa cosa a livello di prestazioni.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:00   #17
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Vorrei forzare una funzione ad essere inline, però ha circa 20 righe di codice. Anche questa è richiamata spessissimo. Quale è il flag di g++ che fa questo ? Non lo trovo più.
Se una funzione e' lunga, e' altamente probabile che anche forzando l'inline il compilatore lo ignori. Non perdere tempo e non dichiarare nulla inline, il tuo codice ti ringraziera', e molto probabilmente scoprirai che l'eseguibile risulta anche piu' veloce. Male che ti vada non cambia nulla.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:02   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi

Che succede, ad esempio, se mettere una funzione inline ti causa frequenti cache miss in un loop e il codice va in realta' piu' piano? Non puoi saperlo finche' non misuri.
Mmm, ai cache miss non ci avevo pensato. Però penso basti fare un pò di prove no ?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:03   #19
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6183
Quote:
Originariamente inviato da fek Guarda i messaggi
Se una funzione e' lunga, e' altamente probabile che anche forzando l'inline il compilatore lo ignori. Non perdere tempo e non dichiarare nulla inline, il tuo codice ti ringraziera', e molto probabilmente scoprirai che l'eseguibile risulta anche piu' veloce. Male che ti vada non cambia nulla.
Non lo so, però dichiarando un pò di funzioni inline e con il flag -O2 il codice va 3 volte più veloce !

E poi, quando una funzione è da considerarsi "lunga" per l'inline ? Questa cosa non l'ho mai capita.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:04   #20
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Mmm, ai cache miss non ci avevo pensato. Però penso basti fare un pò di prove no ?
Si', e' quello che ti dicevo
Prima fai le prove, fai il profiling, poi se proprio scopri he una funzione serve inline, dichiarala inline. Almeno io faccio cosi', non dichiaro mai nulla inline, poi se il profiler mi dice che una data funzione molto piccola mi sta portando via del tempo perche' il compilatore per qualche motivo ha deciso di non metterla inline da solo, allora, la forzo io. Negli ultimi cinque anni ho dichiarato inline... hmmm... forse due funzioni.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Panasonic Lumix S9: disponibile in quatt...
Nikon presenta due obiettivi: NIKKOR Z D...
Horizon vs Light of Motiram, si entra ne...
Atari rilancia Intellivision Sprint e fa...
Leapmotor lancia in Italia il SUV elettr...
QNAP punta sempre più in alto con...
Scandalo ibride plug-in: consumano come ...
L'intelligenza artificiale fa sempre pi&...
Oracle dal punto di vista dell’Europa: l...
James Dyson Award 2025: dall'accessibili...
Xiaomi: gli smartphone con display poste...
Final Fantasy 7 Remake Part 3 offrir&agr...
Chery presenta Omoda 4, da benzina a ele...
TSMC alza i prezzi: Qualcomm e MediaTek ...
Una Offline Room per aiutare gli student...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v