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 |
Generator de sunete - optimizare consum resurse
Last Updated: Mar 18 2023 11:51, Started by
GabyF
, Jan 24 2023 12:00
·
0
#1
Posted 24 January 2023 - 12:00
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? |
#3
Posted 25 January 2023 - 17:44
Mai exact, la ce optimizari te referi? Folosesc Visual C++
|
#4
Posted 25 January 2023 - 21:39
#6
Posted 26 January 2023 - 11:52
#7
Posted 27 January 2023 - 13:59
Cum sa nu, e o inmultire in plus care poate fi evitata
|
#8
Posted 27 January 2023 - 14:06
tu eviti o inmultire aici, iar compilatorul face altele sa-si alineze datele.
|
#9
Posted 27 January 2023 - 14:32
oricum o face, este acelasi numar de variabile dar o inmultire in minus
|
#10
Posted 27 January 2023 - 21:02
GabyF, 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
Posted 30 January 2023 - 09:59
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
Posted 30 January 2023 - 10:23
GabyF, on 30 ianuarie 2023 - 09:59, said:
Nu vad in exemplul dat de tine unde apare ca genereaza alta constanta... Se vede acum? Edited by tavitu, 30 January 2023 - 10:23. |
#13
Posted 30 January 2023 - 12:31
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
Posted 30 January 2023 - 12:36
#15
Posted 30 January 2023 - 14:10
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
Posted 30 January 2023 - 20:29
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. |
#18
Posted 11 March 2023 - 17:42
dani.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
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users