Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-07-2009, 22:21   #1
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
[C/C++] Consigli ottimizzazione velocità

Come da oggetto vorrei dei consigli per ottimizzare la velocità del mio programma, principalmente il "collo di bottiglia" del mio programma è la valutazione del seno e del coseno di una certa quantità, (quantità che varia volta per volta ovviamente),funzioni che occupano oltre l'80% del tempo processore. (Ovviamente le funzioni seno e coseno sono richiamate moooooooolte volte )

Il programma è già multithreaded, quindi sfrutta più core contemporaneamente.

Inoltre se possibile sono graditi dei consigli sull'allocazione e deallocazione rapida di vettori di dimensioni non particolarmente elevate qualche decina di elementi per intenderci, ma ciò apporterebbe solo marginali incrementi prestazionali.

Non so se è possibile utilizzare qualche libreria in maniera facile adatta allo scopo, per effettuare le operazioni trigonometriche.

SO Windows 7 RC Build 7100
IDE Visual Studio Team System 2010 Beta 1 (mi da un incremento di prestazioni rispetto a Visual Studio 2008 di circa il 20%)

Ultima modifica di Rossi88 : 19-07-2009 alle 22:31.
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 22:31   #2
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Sicuro che non puoi usare qualcosaltro?

Per esempio il coseno dell'angolo tra 2 vettori si trova col prodotto scalare, che è decisamente più veloce di qualsiasi funzione trigonometrica.
Altro non saprei proprio, senza sapere codice e algoritmo ci vorrebbe la palla di vetro
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 22:36   #3
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Sicuro che non puoi usare qualcosaltro?

Per esempio il coseno dell'angolo tra 2 vettori si trova col prodotto scalare, che è decisamente più veloce di qualsiasi funzione trigonometrica.
Altro non saprei proprio, senza sapere codice e algoritmo ci vorrebbe la palla di vetro
Innanzitutto grazie della risposta, comunque praticamente devo scindere un'esponente con argomento complesso nella parte reale ed immaginaria, quindi valuto il seno e coseno. Ad ogni modo posto la parte di codice di interesse che così è tutto più chiaro e non serve la palla di cristallo

Codice:
void derivsU(double x ,double y[],double dydx[],double lam)
{
	/* La parte iniziale del vettore contiene i dati legati alla parte
	 * reale dell'ampiezza, mentre la seconda parte contiene la parte
	 * immaginaria.
	 */
	 int i,j;
	 int n=N;

	double q1,q2,esp;
	double K;double Kmod=(1+cos(2*pi/lam*x));
	for(i=1;i<=n;i++){
		dydx[i]=0;
		dydx[i+n]=0;
		for(j=1;j<=n;j++){
			K=Kmod*intePerParam[i][j];

			esp=x*beta[i][j];
			q1=K*sin(esp);
			q2=K*cos(esp);
			   
			dydx[i]-=q1*y[j]+q2*y[j+n];
			dydx[i+n]+=q2*y[j]-q1*y[j+n];

		}    
	}

}
Vorrei sottolineare come abbia provato anche altre soluzioni, ad esempio q1*=sin(esp) e q2*=cos(esp) ma i risultati sono analoghi, quindi il problema è proprio della valutazione del seno e del coseno e non del prodotto (che dovrebbe tra le funzioni più veloci per un processore dopo somma e sottrazione)

La funzione che ho riportato è richiamata anche oltre 3.000.000 di volte (è un dato indicativo), mentre N può assumere valore che spaziano fra qualche decina a 100-200

Ciò che mi lascia perplesso inoltre è che le funzioni che occupano la maggior parte del tempo processore sono sin(esp) e cos(esp) mentre cos(2*pi/lam*x) no, risulta trascurabile (almeno stando all'analizzatore di performance di Visual Studio)

Ultima modifica di Rossi88 : 19-07-2009 alle 22:46.
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:10   #4
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Dunque, mi sembra già ottimizzato a bestia
poi vista la complicatezza dei calcoli che svolgi, scommetto che non puoi scambiare imprecisione per velocità no?
Tipo che so, sostituire seno e coseno con una table di valori, calcolare meno valori e poi sfocarli ecc ecc.

L'unica cosa da fare sarebbe riorganizzare l'algoritmo in modo di svolgere meno volte la parte critica, comunque non capisco nemmeno che stai facendo (dannati numeri complessi ) quindi non saprei come...

Comunque stai facendo un filtro su un'immagine praticamente, quindi ti consiglierei CUDA, se ben usato queste robe se le mangia (a precisione singola però).
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:27   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6287
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Ciò che mi lascia perplesso inoltre è che le funzioni che occupano la maggior parte del tempo processore sono sin(esp) e cos(esp) mentre cos(2*pi/lam*x) no, risulta trascurabile (almeno stando all'analizzatore di performance di Visual Studio)
Ciao,
io ti consiglio di introdurre nel tuo codice le liberie ACML, utilizzando la funzione vettoriale vrda_sincos. In pratica, raggruppi in un vettore tutti gli elementi su cui vuoi fare seni e coseni e con UNA SOLA chiamata li calcoli tutti di un botto, sfruttando anche le proprietà trigonometriche.

Nel tuo caso dei raggruppare i vari esp

Link utili:
http://developer.amd.com/cpu/Librari...s/default.aspx
http://developer.amd.com/cpu/Librari...rda_005fsincos

PS: Perchè nei cicli for parti da 1 e non da 0 ?

Ultima modifica di Unrue : 19-07-2009 alle 23:31.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:32   #6
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Dunque, mi sembra già ottimizzato a bestia
poi vista la complicatezza dei calcoli che svolgi, scommetto che non puoi scambiare imprecisione per velocità no?
Tipo che so, sostituire seno e coseno con una table di valori, calcolare meno valori e poi sfocarli ecc ecc.

L'unica cosa da fare sarebbe riorganizzare l'algoritmo in modo di svolgere meno volte la parte critica, comunque non capisco nemmeno che stai facendo (dannati numeri complessi ) quindi non saprei come...

Comunque stai facendo un filtro su un'immagine praticamente, quindi ti consiglierei CUDA, se ben usato queste robe se le mangia (a precisione singola però).
Si diciamo che l'ho ottimizzato per benino, quando ho avuto il programma ci impiegava 16 volte di più per fare le stesse cose, poi ho fatto qualche ottimizzazione...

Comunque non si tratta di un filtro su un'immagine, è l'applicazione di una teoria dei campi elettromagnetici.

La possibilità di utilizzare una look-up table non credo faccia al caso mio, comunque grazie per il suggerimento
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:33   #7
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ciao,
io ti consiglio di introdurre nel tuo codice le liberie ACML, utilizzando la funzione vettoriale vrda_sincos. In pratica, raggruppi in un vettore tutti gli elementi su cui vuoi fare seni e coseni e con UNA SOLA chiamata li calcoli tutti di un botto, sfruttando anche le proprietà trigonometriche.

Nel tuo caso dei raggruppare i vari esp

Link utili:
http://developer.amd.com/cpu/Librari...s/default.aspx
http://developer.amd.com/cpu/Librari...rda_005fsincos

PS: Perchè nei cicli for parti da 1 e non da 0 ?
Ma il mio processore è Intel, non so se vadano bene ugualmente le librerie della AMD.

La domanda dell'indice di partenza è una bella domanda, praticamente il programma mi è stato dato e poi io l'ho ottimizzato (pesantemente, ma togliendo il collo di bottiglia del seno e coseno potrei aumentare la velocità di altre 4-5 volte immagino) e nel programma di partenza tutti gli array sono utilizzati con indice di partenza 1 (sprecando quindi la memoria per il primo elemento)

Ultima modifica di Rossi88 : 19-07-2009 alle 23:35.
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:33   #8
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6287
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Ma il mio processore è Intel, non so se vadano bene ugualmente le librerie della AMD
Si, vanno benissimo Anche se perdi un pò di performance rispetto a processori AMD, guadagni comunque molto rispetto al codice originale. RIguardo l'indice, va bene anche se parti da 1,alla fine sprechi un elemento, va bè. Solo che è molto facile confondersi poi..

Ultima modifica di Unrue : 19-07-2009 alle 23:38.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:41   #9
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Si, vanno benissimo Anche se perdi un pò di performance rispetto a processori AMD, guadagni comunque molto rispetto al codice originale. RIguardo l'indice, va bene anche se parti da 1,alla fine sprechi un elemento, va bè. Solo che è molto facile confondersi poi..
Tu per caso le hai già sfruttate in qualche ambito? che miglioramenti hai ottenuto?

(Grazie comunque del suggerimento vedrò di utilizzare la libreria )
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:44   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6287
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Tu per caso le hai già sfruttate in qualche ambito? che miglioramenti hai ottenuto?

(Grazie comunque del suggerimento vedrò di utilizzare la libreria )
Le sto utilizzando proprio in questo periodo ed i miglioramenti sono di un buon 25%. Ma tutto dipende dal numero di seni e coseni che devi calcolare. Nel tuo caso ad esempio, se n è molto piccolo, non avrai un grande vantaggio.

Ultima modifica di Unrue : 19-07-2009 alle 23:47.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2009, 23:53   #11
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Le sto utilizzando proprio in questo periodo ed i miglioramenti sono di un buon 25%. Ma tutto dipende dal numero di seni e coseni che devi calcolare. Nel tuo caso ad esempio, se n è molto piccolo, non avrai un grande vantaggio.
Un 25% non si butta di certo via
Comunque N varia da qualche decina a 100-200, per molto piccolo su che ordine di grandezza siamo?
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2009, 23:45   #12
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6287
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Un 25% non si butta di certo via
Comunque N varia da qualche decina a 100-200, per molto piccolo su che ordine di grandezza siamo?
Si va bene direi. Per i piccolo intendo intorno a 10. Comunque nel tuo caso, siccome dici che la funzione derivsU la chiami molte volte, devi fare N*M, dove M è il numero di volte che chiami tale funzione.

Un altro mio consiglio è di fare un unrolling del loop più interno con passo 2. Proprio in questi giorni ho a che fare con una funzione chiamata moltissime volte. Un unrolling con passo 2 mi ha fatto raddoppiare la velocità di esecuzione.

Esempio:

Codice:
      for (i = 0; i < 100; i++)
        a += vect[i];

//Unroll passo 2:

      for (i = 0; i < 100; i += 2)
      {
        a += vect[i];
        a += vect[i+1];
      }
Ovviamente devi gestire il resto nel caso che il numero di cicli non sia divisibile per 2.
Fatto con il passo2, prova con 4, ed 8.

Ultimo consiglio, dichiara double dydx[] come restrict ( double* restrict dydx) e metti -restrict nei flags di compilazione.

Ultima modifica di Unrue : 20-07-2009 alle 23:59.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2009, 01:04   #13
Torav
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 558
anche io ultimamente mi sono sbattuto parecchio per l'ottimizzazione di qualche programmino numerico in ambito scientifico e ho notato che la miglior ottimizzazione si ottiene solamente utilizzando l'algoritmo migliore, ma immagino che tu sia già arrivato a questo punto
prima di tutto immagino che esp possa avere qualsiasi valore giusto? perchè se (come nel mio caso ad esempio) sai che può avere solo valori molto bassi puoi tranquillamente utilizzare gli sviluppi in serie di sin e cos. Se, come credo, questo non è il tuo caso puoi provare a calcolare solo il sin (o il cos) e poi usare sqrt(1- sin^2), io, prima di rendermi conto che effettivamente lo sviluppo era la cosa migliore da fare, avevo ottenuto un discreto miglioramento (con un test "sintetico" veniva fuori un 30% se non sbaglio).
Torav è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2009, 01:37   #14
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Hai provato a cercare qualche libreria che calcola seno e coseno in tempi più rapidi? Immagino usi la math.h...

Altrimenti l'unica soluzione è rivedere le chiamate perchè chiamare 3000000 di volte una funzione è veramente pesante (e nelle ottimizzazioni si parte sempre dal numero maggiore, dannate derivate parziali)... che so magari con qualche stratagemma riesci a dimezzare, in fin dei conti i calcoli nel campo complesso derivano dalla circonferenza goniometrica che è simmetrica rispetto l'origine quindi in sostanza cambiano i segni ma le "forme" nei 4 pezzetti di piano sono sempre le stesse...
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 21-07-2009, 12:35   #15
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Se beta viene aggiornato meno spesso di quanto tu calcoli derivsU, puoi salvarti il seno e coseno di beta dentro un'altro array (caching), avendo quindi un costo costante per ogni chiamata di derivsU.

Inoltre mi pare ci siano istruzioni vettoriali (SIMD) che calcolano 4 seni e coseni in una sola volta, potrebbero interessarti.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 22-07-2009, 13:32   #16
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Ringrazio tutti delle risposte.

Ho provato ad effettuare l'unroll del ciclo più esterno (un unroll completo, ho fatto giusto una prova su un caso particolare, un unroll di 64) ma le prestazioni non miglioravano (anzi peggioravano leggermente, anche se ciò non ha molto senso)

per l'opzione restrict, in visual studio la parola chiave è __restrict ma se la uso da errore, inoltre su MSDN per utilizzare restrict è indicata la modifica da fare al compilatore ma tale opzione non è presente nel mio.... (eppure ho consultato la sezione della versione che utilizzo di Visual studio )

per quanto riguarda la possibilità di utilizzare cos(x)=sqrt(1-sin(x)^2) in questo caso perderei l'informazione legata al segno, oppure dovrei fare degli if, ma a quanto ho letto gli if rallentano l'esecuzione del codice.

Per quanto riguarda le librerie, in realtà avevo provato ad utilizzare Intel Compiler, che aveva Math kernel Library, avevo utilizzato su macchina virtuale. Il problema è che non è gratuito il compilatore dell'Intel nè le librerie, sarebbe un po' scocciante ogni tot giorni formattare e reinstallare oppure ricopiare un'immagine della partizione. Si potrebbe pensare di compilare su macchina virtuale ed eseguire sull'host ma il problema è che su macchina virtuale non posso fare l'analisi delle performance (non sono emulate delle cose che non ricordo esattamente).

Per quanto riguarda le librerie dell'AMD, le ho scaricate installate, l'istruzione che è riportata sulla guida

Codice:
cl driver.c -Ic:/acml4.3.0/win64_mp/include
c:/acml4.3.0/win64_mp/lib/libacml_mp_dll.lib
non mi funziona da il seguente errore

Codice:
driver.c
c1:  fatal error C1083: Cannot open source file: 'driver.c': No such file or directory
Ho provato a inserire gli header manualmente e le librerie ma purtroppo non sono molto pratico, e la compilazione termina (se uso una delle funzioni del file di intestazione) con un classico unresolved external symbol



Ho provato a seguire qualche guida per utilizzare le librerie ma niente da fare

Se qualcuno può indicarmi come utilizzare le librerie ACML, o indicarmi qualche link o guida

Ultima modifica di Rossi88 : 22-07-2009 alle 14:47.
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 22-07-2009, 20:39   #17
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
È chiaro che comunque c'è una discrepanza computazionale, la richiesta di 3000000 di chiamate a funzione non è eseguibile a bassa latenza su un normale computer.

O prevedi il fatto che quando si eseguono i calcoli vi è un tempo di attesa oppure non rimane che adottare tecnologie hardware più potenti o addirittura cluster di computer, se le finanze lo permettono.

Una domanda: i calcoli devono essere svolti per forza sequenzialmente?
Non è possibile dividere quei 3000000 di chiamate su più thread (core)?
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 22-07-2009, 21:57   #18
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6287
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Ringrazio tutti delle risposte.

Ho provato ad effettuare l'unroll del ciclo più esterno (un unroll completo, ho fatto giusto una prova su un caso particolare, un unroll di 64) ma le prestazioni non miglioravano (anzi peggioravano leggermente, anche se ciò non ha molto senso)
Ti avevo suggerito quello più interno Quando fai l'unroll le prestazioni possono peggiorare, tutto dipende dalla cache. Però in generale, siccome togli un sacco di if alla fine di ogni ciclo, si migliora. Inoltre un unroll di 64 è esagerato,( gestire i resti da 1 a 63 è pazzesco !) infatti ti avevo suggerito di partire con 2,4,8 ecc...


Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
l'opzione restrict, in visual studio la parola chiave è __restrict ma se la uso da errore, inoltre su MSDN per utilizzare restrict è indicata la modifica da fare al compilatore ma tale opzione non è presente nel mio.... (eppure ho consultato la sezione della versione che utilizzo di Visual studio )
Purtroppo non conosco Visual Studio,ma comunque restrict è presente nello standard C99, prova a guardare se è già configurato per tale standard.


Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Per quanto riguarda le librerie, in realtà avevo provato ad utilizzare Intel Compiler, che aveva Math kernel Library, avevo utilizzato su macchina virtuale. Il problema è che non è gratuito il compilatore dell'Intel nè le librerie, sarebbe un po' scocciante ogni tot giorni formattare e reinstallare oppure ricopiare un'immagine della partizione. Si potrebbe pensare di compilare su macchina virtuale ed eseguire sull'host ma il problema è che su macchina virtuale non posso fare l'analisi delle performance (non sono emulate delle cose che non ricordo esattamente).
Si, infatti Tra ACML e MKL ti ho consigliato le prime proprio perché gratuite.

Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Per quanto riguarda le librerie dell'AMD, le ho scaricate installate, l'istruzione che è riportata sulla guida

Codice:
cl driver.c -Ic:/acml4.3.0/win64_mp/include
c:/acml4.3.0/win64_mp/lib/libacml_mp_dll.lib
non mi funziona da il seguente errore

Codice:
driver.c
c1:  fatal error C1083: Cannot open source file: 'driver.c': No such file or directory
Ho provato a inserire gli header manualmente e le librerie ma purtroppo non sono molto pratico, e la compilazione termina (se uso una delle funzioni del file di intestazione) con un classico unresolved external symbol
L'errore è chiaro, avrai qualche path sbagliato. Ma anche su questo non posso aiutarti non essendo pratico di Visual Studio.

Ultima modifica di Unrue : 22-07-2009 alle 22:02.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 23-07-2009, 09:41   #19
Rossi88
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 484
Quote:
Originariamente inviato da _Claudio Guarda i messaggi
È chiaro che comunque c'è una discrepanza computazionale, la richiesta di 3000000 di chiamate a funzione non è eseguibile a bassa latenza su un normale computer.

O prevedi il fatto che quando si eseguono i calcoli vi è un tempo di attesa oppure non rimane che adottare tecnologie hardware più potenti o addirittura cluster di computer, se le finanze lo permettono.

Una domanda: i calcoli devono essere svolti per forza sequenzialmente?
Non è possibile dividere quei 3000000 di chiamate su più thread (core)?
Il problema non è tanto la latenza fra una chiamata e l'altra quanto l'esecuzione del seno e del coseno, stando all'analizzatore di Perforance di Visual Studio oltre l'80% del tempo processore è occupato nell'esecuzione di queste due funzioni. Ho già previsto il programma della possibilità di sfruttare multithreading, che ovviamente dimezza esattamente il tempo di esecuzione (il mio processore è Dual Core) ma basta cambiare un parametro e può lanciare anche 3,4,5 .... thread tutti in parallelo e sincronizzati. Il mio obiettivo è quindi cercare di utilizzare dei metodi per ridurre il costo computazionale del calcolo del seno e del coseno, utilizzando magari qualche libreria.

Ultima modifica di Rossi88 : 23-07-2009 alle 12:07.
Rossi88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-07-2009, 18:41   #20
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da Rossi88 Guarda i messaggi
Il problema non è tanto la latenza fra una chiamata e l'altra quanto l'esecuzione del seno e del coseno, stando all'analizzatore di Perforance di Visual Studio oltre l'80% del tempo processore è occupato nell'esecuzione di queste due funzioni. Ho già previsto il programma della possibilità di sfruttare multithreading, che ovviamente dimezza esattamente il tempo di esecuzione (il mio processore è Dual Core) ma basta cambiare un parametro e può lanciare anche 3,4,5 .... thread tutti in parallelo e sincronizzati. Il mio obiettivo è quindi cercare di utilizzare dei metodi per ridurre il costo computazionale del calcolo del seno e del coseno, utilizzando magari qualche libreria.
Visto che è il calcolo del seno e del coseno "pesante"... hai provato a vedere se puoi costruirtela da te la libreria?
Se usi angoli entro una certa approssimazione puoi ad esempio tabularti... a costo di usare un buon 5-6MB di memoria però hai un accesso a costo costante senza calcoli, meglio di così non saprei proprio.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
Noctua NH-D15 Chromax.black è rea...
NVIDIA aggiorna DGX Spark: nuovo kernel,...
Con Work IQ, Copilot per Microsoft 365 i...
Azure Cobalt 200: svelata la nuova CPU A...
Intel a tutto tondo: tra processi in ram...
AMD FSR Redstone arriverà ufficia...
L'Olanda 'cede' alla Cina: retromarcia t...
Stagione 1 al via: tutte le novità...
TikTok rafforza trasparenza e benessere ...
Zigbee 4.0 è qui: più sic...
La trasformazione agentica di Windows pa...
Crollo del 29% nelle vendite dirette: Ub...
Black Friday anticipato su Amazon: NARWA...
Disastro WhatsApp: esposti 3,5 miliardi ...
Hatsune Miku per tutti: ASUS ROG present...
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: 16:26.


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