Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Isključivanje optimizacije

[es] :: C/C++ programiranje :: Isključivanje optimizacije

Strane: 1 2

[ Pregleda: 5142 | Odgovora: 35 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Isključivanje optimizacije21.10.2011. u 10:50 - pre 151 meseci
Imam jedan problem. Uspeo sam neki kritičan deo koda (u višenitnom okruženju) da rešim efikasno bez potrebe za bilo kakvim semaforima, kritičnim sekcijama itd. tako da ipak bude imun na konflikte između niti. Međutim, postoji opasnost da mi kompajler upropasti algoritam optimizacijom. U jednom trenutku se promenljivoj a dodeljuje vrednost promenljive b, a kasnije se transformisana vrednost od a vraća u b. E, sad, Promenljiva a se može eliminisati, ali onda otpada imunost na konflikte niti. Ako je kompajler eliminiše, sve je propalo. Kako da mu zabranim da u tom delu koda eliminiše promenljivu a? Koristim VC++ iz VS 2010 paketa.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:11 - pre 151 meseci
Sudeći po ovome:
http://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
...pominje se jedino "Specifies optimizations to be performed on a function-by-function basis.", korišćenjem "pragma" direktive.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:11 - pre 151 meseci
A kako si to uopste resio? Thread scheduler moze da ti razbaca niti kako njemu odgovara, sta kostisis za sinhronizaciju?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:28 - pre 151 meseci
Algoritam je takav da je imun. Svejedno je da li će jedna nit da prekine drugu u bilo kojoj tački u funkciji. Ništa dodatno nije potrebno za sinhronizaciju. E, sad, rešenje je proprietary i specifično je za problem. Naravno da se kritične sekcije i ostali rekviziti za sinhronizaciju ne mogu izbaciti jer se u 99,9% problema mogu eliminisati, ali ima slučajeva kada mogu.

No, moje je pitanje kako da isključim optimizaciju u toj jednoj funkciji (ako function by function znači to, to mi odgovara). Da li mi

Code:
void f()
{
#pragma optimize("g", off)
    ...
}


obavlja posao?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:29 - pre 151 meseci
Citat:
Nedeljko: Imam jedan problem. Uspeo sam neki kritičan deo koda (u višenitnom okruženju) da rešim efikasno bez potrebe za bilo kakvim semaforima, kritičnim sekcijama itd. tako da ipak bude imun na konflikte između niti. Međutim, postoji opasnost da mi kompajler upropasti algoritam optimizacijom. U jednom trenutku se promenljivoj a dodeljuje vrednost promenljive b, a kasnije se transformisana vrednost od a vraća u b. E, sad, Promenljiva a se može eliminisati, ali onda otpada imunost na konflikte niti. Ako je kompajler eliminiše, sve je propalo. Kako da mu zabranim da u tom delu koda eliminiše promenljivu a? Koristim VC++ iz VS 2010 paketa.


1. Koristi volatile keyword ispred tvojih promenljivih

2. Iskljucivanje optimizacija ti nece resiti problem ako operacije nisu atomske i nisu zasticene nekim sinhronizacionim objektom - oslanjanje na aranziranje koda je naivno zato sto scheduler, kao sto mmix rece, moze da odluci da ti pokvari racun u bilo kom momentu. Najiskreniji savet koji mogu da ti dam tu je da se ne oslanjas na to.

Ako zelis da izbegnes koriscenje sinhronizacionih primitiva zato sto se nesto izvrsava jako puno puta i traje jako kratko onda vidi da li ti rade posao atomske operacije (Intel x86 instrukcije sa lock prefiksom, imas dodavanja, poredjenja, logicke operacije...) - kako koristis VC++/Windows, za to mozes koristiti InterlockedXXX() API-je koji ce se kompajlirati u native asemblerske instrukcije u vecini slucajeva.

http://msdn.microsoft.com/en-u...desktop/ms684122(v=vs.85).aspx

Ja imam slicne situacije u kodu koji piskaram, ali to resavam obicno na drugi nacin posto je algoritam pogodan - recimo procesiram 256 operacija sa lokalnim varijablama koje su inherentno thread-safe - a onda na kraju sa InterlockedXYZ apdejtujem "globalne" varijable (kao sto rekoh, algoritam je podesan) koje drze kompletne vrednosti za ceo proces tj. "frejm" vremena. Time izbegavam contention situacije da niti cekaju predugo vremena na atomskim operacijama.

Sve u svemu - recept je uvek isti: boris se protiv prevelikog zagusenja ali moras obezbediti bezbednost niti... Ti najbolje znas kako mozes urediti svoj algoritam da zadovolji oba uslova.

@edit - ovo ti radi posao za gasenje optimizacija:

Code:

  #pragma optimize("", off)
  void funkcija() { }
  #pragma optimize("", on)


"" ce jednostavno ugasiti sve optimizacije, a posle f-je ce vratiti prethodno stanje koje je vezano za nivo optimizacija koji je nalozen sa -Ox flegom.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:38 - pre 151 meseci
Bingo! volatile je 100% portabilno rešenje!

Citat:
Ivan Dimkovic: 2. Iskljucivanje optimizacija ti nece resiti problem ako operacije nisu atomske i nisu zasticene nekim sinhronizacionim objektom - oslanjanje na aranziranje koda je naivno zato sto scheduler, kao sto mmix rece, moze da odluci da ti pokvari racun u bilo kom momentu.


Može on da odluči šta hoće, ali ne može da mi pokvari račun. Znam ja šta ti hoćeš da kažeš. Kod se izvršio donekle, onda je uletela neka druga nit, izvršila taj isti deo koda, namesila deljene promenljive "po svojem", a onda prva nit nastavila da radi sa tim vrednostima deljenih promenljivih. E, ja sam moj algoritam rešio tako da mu to ne smeta.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:44 - pre 151 meseci
E pa ako si ga resio tako da garantovano nema potencijalnih problema sa vise niti, onda volatile i to bi trebalo da ti resi problem pristupanja promenljivoj od strane kompajlera (time mu zabranjujes da pokusa da optimizuje kod time sto ce podrazumevati da se promenljiva ne menja sama od sebe)

Obrati paznju da volatile varijabla ne znaci da su operacije nad tom varijablom atomske. Ali, ako je kako kazes - da je algoritam thread-safe, to onda ne predstavlja problem.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:53 - pre 151 meseci
Meni su bitne dve stvari za moj algoritam:

1. Da je dodela jedne 64-bitne promenljive drugoj atomična.
2. Da se jedna promenljiva ne eliminiše iz računa, već koristi tačno onako kako sam napisao.

Što se 1 tiče, kod se kompajlira u 64-bitni bild za intelovu arhitekturu (i radiće na 64-bitnoj mašini jer mu treba veći adresni prostor od 4GB). Što se 2 tiče, to mi rešava volatile.

Hvala svima, a posebno Ivanu.

BTW, da li je i na 32-bitnoj intelovoj arhitekturi (i eplovoj) int64 dodela atomična? Ja milsim da jeste, alin nisam siguran. Čuo sam da kod Jave nije, tako da moj algoritam tamo nije primenljiv.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 11:54 - pre 151 meseci
Ključna reč volatile nije izmišljena za potrebe sinhronizacije, nego ti samo garantuje da kompajler neće interno keširati vrednost promenljive. Volatile nije rešenje.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 12:01 - pre 151 meseci
Za šta god da je izmišljena, obavlja ono što meni treba, a to je tačka 2.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 12:14 - pre 151 meseci
@Nedeljko, e pa u ovom slucaju ti kod nije siguran - obicna dodela (=) >nije< atomicna, i volatile ti nece resiti problem. Da ne ulazimo sad u razloge zasto je to tako.

Treba ti InterlockedExchange64():

http://msdn.microsoft.com/en-u...desktop/ms683593(v=vs.85).aspx

Kompajler ce to prevesti u asembler (lock xchg itd...) - naravno, ako nisi iskljucio optimizacije :-)

Obrati paznju da sa tim otvaras novu pandorinu kutiju - atomske operacije nisu besplatne, i to ce te kostati nesto CPU ciklusa. Ako ti je kod takav da ce se to atomsko dodeljivanje izvrsavati mnogo puta u kratkom vremenu, razmisli o rearanziranju koda da se to izbegne.


DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 12:26 - pre 151 meseci
Ako te zanima vise:

http://www.niallryan.com/node/137
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 13:24 - pre 151 meseci
nedeljko,
64bit read/write operacije su atomicne na 64bit platformi. interlocked postoji kad treba da se spoje u jednu kroz neki exchange algoritam. Iz istog razloga volatile nema efekta na atomicnost x64 koda, samo orderuje instrukcije pristupa ali cak i tada thread moze biti prekinut izmedju read i write operacije UNUTAR jedne C++ instrukcije i da dobije novu vrednost u drugom threadu, ne postoji nacin da to sprecis bez sinhornizacije. jedini nacin da tva threadu budu threadsafe izvrsavajuci isti kod je da svaki ima svoj local storage potpuno izolovan.




Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 13:24 - pre 151 meseci
Ako usput želiš portabilno rešenje, koristi std::atomic templejt. To će biti dovoljno za bilo koji integralni tip ili prostu strukturu.

http://www.stdthread.co.uk/doc/headers/atomic/atomic.html
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 13:30 - pre 151 meseci
Evo šta meni konkretno treba:

Može 64-bitna dodela da bude i neatomična pod uslovom da se ne desi sledeće:

u dodeli a=b se najpre dodeli npr. viših 32 bita od b, a onda se prekine, uleti neka druga nit, promeni b i nakon toga se u prvoj niti dodeli viših 32 bita od nove vrednosti b.

To ne sme da mi se desi. Suština je da dodeljena vrednost promenljivoj a bude ili cela vrednost od b od pre prekida od strane druge niti ili da bude cela vrednost od b koju je druga nit podesila. Ne sme da se desi da pola vrednosti od a odgovara jednoj, a pola drugoj vrednosti od b.

Na kraju, imam i drugo rešenje koje ne zahteva nikakve posebne pretpostavke - ako za b kažem da je deo konteksta niti (__declspec(thread)), onda mi sve radi, jer u tom slučaju niti neće deliti ništa. No, to rešenje ima neku sasvim prihvatljivu pretpostavku o korišćenju te funkcije (da neće nijedna niti biti živa duže od mesec dana a da između dva uzastopna poziva od strane iste niti prođe više od mesec dana, što je debelo ispunjeno, ali pretpostavka je majka svih zabluda jbg), pa bih je izbegao ako nije obavezna.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 13:41 - pre 151 meseci
Code:

atomic<int> x = 0;

x += 5; // atomično
x *= 7; // atomično
x = x * 7; // naravno, nije atomično, ali pojedinačno, množenje i dodela jesu
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2789 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 13:50 - pre 151 meseci
A kako radi "ispod haube" atomic<int>? Ima li dodela neko zaključavanje?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 14:00 - pre 151 meseci
Sto se tica a i b, zlatno pravilo je da ako nesto ne mora da bude deljeno izmedju threadova onda i ne treba da bude deljeno izmedju threadova. Ako tebi b moze da bude na nivou thread-a onda treba da bude local storage. Ne mora obavezno da bude u thread storage-u samo da je izolovano od drugih threadova, u osnovi lokalna varijabla u thread funkciji moze da odradi posao uz malo paznje.

A koliko znam std::atomic koristi ralicite mehanizme u zavisnosti od zeljene semantike. Ima i relaxed i full-on pristup sa acquire/release. Sad od toga proberes sta najvise odgovara tvojim potrebama, sto veca izolacija to skuplja operacija.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 14:33 - pre 151 meseci
@Nedeljko
Ispod haube će na Windowsu biti korišćen InterlockedExchange64... a desiće se fallback na standardni locking ako si na sistemu ispod Viste ili ako nemaš hardversku podršku.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.dip.t-dialin.net.



+7169 Profil

icon Re: Isključivanje optimizacije21.10.2011. u 14:47 - pre 151 meseci
@mmix,

Koliko mi je poznato, 64-bitna dodela je na AMD64 arhitekturi atomicna ako i samo ako je memorijska adresa uravnata na 64-bita - sto nije uvek slucaj (npr... u slucaju struktura itd...). IMHO, ja se licno ne bih oslanjao na to nego bih koristio lokalne varijable ako je ikako moguce - ili 100% garantovane atomske operacije kao sto su sve ove do sada navedene u postovima.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

[es] :: C/C++ programiranje :: Isključivanje optimizacije

Strane: 1 2

[ Pregleda: 5142 | Odgovora: 35 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.