Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Problema creare folder si sterger...

Impozit venituri inchiriere locui...

Infectie masea cu un perete ramas

Finisare placi OSB interior - ex...
 Ecran spart- cum transfer totul a...

Sfat privind achiztia unei masini...

Nu pot seta frecventa RAM la 3200...

Inlocuire țeava principala a...
 Vopsea membrana difuzoare

sarea la sac

Volkswagen Jetta (Sfat / Pareri)

Recomandare caști pentru inot
 imprimante Altex

Cazier judiciar online

Banane

Robot pornire auto
 

Generator de sunete - optimizare consum resurse

- - - - -
  • Please log in to reply
16 replies to this topic

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Salut,

Vreau sa fac un generator de sunete. Problema e ca, consuma prea mult, sunt generatoare de gen care consuma mai putin de jumate decat ce am reusit eu.

Cum pot imbunatatii codul acesta?

#define CHS 2
#define VOICES 7
#define PI 3.141592653589793238

void OSC(double &tone, double &spl_val, double spl_add, float vol) {
tone+=vol*sin(spl_val);
spl_val+=spl_add;
if ((spl_val>=2*PI)) spl_val-=2*PI;
}
for (int s=0; s < sblock; ++s) {
for (int c=0; c < CHS; c++) {
out=0;
for (int i=0; i<VOICES; i++) {
	 OSC(out, spl[c][i], add[c][i], vol[i]);
}
outputs[c][s]=out;
}
}


Singura idee este sa adaug o variabila cu valoarea (2*PI)
Este bine ca am definit PI ca macro sau e mai bine sa definesc o variabila double. E vreo problema ca inmultesc o variabile float cu una double?

#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007
Ai activat optimizarile compilatorului?

#3
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Mai exact, la ce optimizari te referi? Folosesc Visual C++

#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007
Pe scurt

Attached File  Untitled.png   6.77K   5 downloads

Pe lung

Attached File  Untitled2.png   39.59K   6 downloads

#5
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
asa era

#6
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007
Cat consuma in total de nu e suficient? Pune codul complet.

View PostGabyF, on 24 ianuarie 2023 - 12:00, said:

Singura idee este sa adaug o variabila cu valoarea (2*PI)
Este bine ca am definit PI ca macro sau e mai bine sa definesc o variabila double.

N-are treaba. Compilatorul e mai destept decat pare.

#7
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Cum sa nu, e o inmultire in plus care poate fi evitata

#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 28,768
  • Înscris: 10.08.2005
tu eviti o inmultire aici, iar compilatorul face altele sa-si alineze datele.

#9
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
oricum o face, este acelasi numar de variabile dar o inmultire in minus

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007

View PostGabyF, on 27 ianuarie 2023 - 14:32, said:

dar o inmultire in minus

Compilatorul isi da seama ca inmultirea a 2 constante produce tot o constanta, asa ca genereaza alta constanta.

https://godbolt.org/z/K9aMer476

Nici o inmultire in assembly'ul rezultat, doar scadere cu o constanta (PI) sau alta (2PI)

#11
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Nu vad in exemplul dat de tine unde apare ca genereaza alta constanta... Ideea este s-o si foloseasca la urmatoarea inmultire si sa sara peste inmultire.

Nu cred c-ar face asta pentru ca sunt multe cazuri in care inmultirea nu este repetitiva.

Se stie ca optimizarea se face in felul asta, reducem cat se poate operatiile aritmetice, mai ales in loop-uri - acolo sunt trei loop-uri, e f important sa reducem operatiile aritmetice.

Edited by GabyF, Yesterday, 10:00.


#12
tavitu

tavitu

    Fii și tu un super-erou: Vaccinează-te!

  • Grup: Senior Members
  • Posts: 5,232
  • Înscris: 16.02.2009

View PostGabyF, on 30 ianuarie 2023 - 09:59, said:

Nu vad in exemplul dat de tine unde apare ca genereaza alta constanta...
[ https://i.imgur.com/xIklztW.jpg - Pentru incarcare in pagina (embed) Click aici ]

Se vede acum?

Edited by tavitu, Yesterday, 10:23.


#13
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Da.
E bine de stiu ce operatii sunt de evitat. Stiu doar ca la double cu multe zecimale compilatorul intarzie mult, pow() trebuie inlocuit cand se poate. Aici sin() trebuie inlocuit cu un echivalent.

Interesant tool-ul de pe godbolt.org , exista ceva, vreun tool in care se pot compara timpii de executie? Stiu ca e in functie de cpu dar se pot face comparatii.

Edited by GabyF, Yesterday, 12:34.


#14
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007

View Postdani.user, on 26 ianuarie 2023 - 11:52, said:

Cat consuma in total de nu e suficient? Pune codul complet.


#15
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Daca pun tot codul devine offtopic. Acel cod consuma, fara el, consumul e ok. Specific ca este intr-o functie de procesare audio void Process(double** inputs, double** outputs, int sblock) care e apelata cam de 40/sec cate 1024 sblock.

Am aflat ceva interesant:
int jobs=50, iii=2*jobs; /// definit in afara functiei
void Process(double** inputs, double** outputs, int sblock) {
int jjj=2*jobs;
for (int s=0; s < samplesblock; ++s) {
for (int i=1; i<jobs; ++i) {
for (int j=1; j<jobs; ++j) {
	 //iii+=(int)float(jjj)/(i+j); /// load 13% cpu
	 jjj+=(int)float(iii)/(i+j); /// load 0.01% cpu
	 }
}
}
memcpy(&inputs, &outputs, sizeof(inputs));
}


Nu-mi pot explica decat prin faptul ca face niste cache-uri. Consumul e infim chiar si la jobs=100000

Edited by GabyF, Yesterday, 14:15.


#16
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 29,370
  • Înscris: 24.02.2007
Functia modifica jjj care-i o variabila locala si cu care nu mai faci nimic apoi.

Compilatorul destept isi da seama ca e munca in zadar, asa ca iti elimina tot codul din functie: https://godbolt.org/z/1bW591Tdq

PS: Acel memcpy nu face ce crezi tu ca ar face.

N-am cerut degeaba sa pui tot codul.

Edited by dani.user, Yesterday, 20:24.


#17
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 206
  • Înscris: 27.09.2006
Ahaaa

Anunturi

Bun venit pe Forumul Softpedia!

1 user(s) are reading this topic

1 members, 0 guests, 0 anonymous users

GabyF

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate