Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android

Recomandare bicicleta e-bike 20&#...
 Bing-Content removal tool

Nu pot accesa monitorulsv.ro de l...

Cum sa elimini urmele de acnee?

Wc Geberit
 Routere detinute in trecut si in ...

Teii din fața casei

E-Mail in serie prin Excel si Out...

Modul alimentare rulou/jaluzea ex...
 Recuperare fișiere dupa form...

Aplicatii stress test RAM

Asigurare auto hibrid

Asus B550M - PC-ul nu porneste di...
 

Generator de sunete - optimizare consum resurse

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

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 233
  • Î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: 30,189
  • Înscris: 24.02.2007
Ai activat optimizarile compilatorului?

#3
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 233
  • Î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: 30,189
  • Înscris: 24.02.2007
Pe scurt

Attached File  Untitled.png   6.77K   9 downloads

Pe lung

Attached File  Untitled2.png   39.59K   11 downloads

#5
GabyF

GabyF

    Junior Member

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

#6
dani.user

dani.user

    Guru Member

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

 GabyF, 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: 233
  • Î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: 31,383
  • Î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: 233
  • Î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: 30,189
  • Î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: 233
  • Î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, 30 January 2023 - 10:00.


#12
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Î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, 30 January 2023 - 10:23.


#13
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 233
  • Î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, 30 January 2023 - 12:34.


#14
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Î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: 233
  • Î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, 30 January 2023 - 14:15.


#16
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Î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, 30 January 2023 - 20:24.


#17
GabyF

GabyF

    Junior Member

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

#18
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 233
  • Înscris: 27.09.2006

View Postdani.user, on 27 ianuarie 2023 - 21:02, said:


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)

Am facut un test, am adaugat mai multe operatii aritmetice cu constante si consumul CPU a crescut f mult. In concluzie, unde se pot adauga operatiile aritmetice in variabile trebuie neaparat facut asta.

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

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