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