Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-12-2007, 09:55   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
[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 12:46.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 10: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 10:58.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 11:07   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 11: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 11:20.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 11: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, 11:22   #6
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 11: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, 12:43   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 15: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, 15: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, 15: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 15:37.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:47   #12
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 15:49   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 15: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 15:57.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2007, 15:53   #15
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 15:55   #16
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 16: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, 16:02   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 16:03   #19
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6624
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, 16: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


Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Ford: l'elettrico genera una perdita di ...
Ayaneo Next 2: la console portatile Wind...
Il WiFi può vederti senza telecam...
Linux sotto assedio: SSHStalker riporta ...
Stellantis: dopo il crollo di venerd&igr...
Combat Liquid 360 HUD: raffreddamento AI...
Tornano le EVO Sessions della Formula E:...
Moltbook, il social network per AI: i po...
Cina: eseguito il test della navicella M...
Mistral, il rivale europeo di OpenAI, in...
Libri piratati, allarme rosso: 722 milio...
Ayaneo svela quasi tutte le specifiche d...
Sony chiude definitivamente con i regist...
Renault Twingo E-Tech Electric sotto i 2...
Auto elettriche, il freddo non fa pi&ugr...
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: 19:28.


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