Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 72 odgovora
  • 19.261 pregleda

Najnovija ↓

Re: Nasledjivanje samo izmedju interfejsa 18.07.2012. u 12:07 · pre 174 meseca #61
Da, C#.

Inace, ne znam gde si to video sem u debug modu (a to se ne racuna jer je optimizacija iskljucena zbog line-by-line debuga)

U release bildu posle JITovanja kod je skoro potpuno identican, razlika moze da bude samo u redosledu dodela. U primeru koji sam upravo uradio cek je i kompletan metod inline-ovan u pozivaoca pa je jos lakse uporediti. Bottom line, da li ce biti conditional move ili je/jne branching zavisi od sr/dest kombinacije ali ako ?: operator JITuje u conditional move onda postoji i ekvivalentan if/then/else konstrukt koji ce uraditi to isto.

Code:


    public class Class1
    {
        public int x;
        public int y = 123;

        public void IfWay()
        {
            if (x == 0) x = 10; else x = y;
        }

        public void CondWay()
        {
            x = x == 0 ? 10 : y;
        }

    }

            Class1 c = new Class1();
00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  mov         ecx,5B25E0h 
00000008  call        FFD2FBE0 
0000000d  mov         edx,eax 
0000000f  mov         dword ptr [edx+8],7Bh 
            c.x = 0;
00000016  xor         ecx,ecx 
00000018  mov         dword ptr [edx+4],ecx 
            c.IfWay();
0000001d  cmp         dword ptr [edx+8],0Fh 
00000021  jne         0000002A 
00000023  xor         ecx,ecx 
00000025  mov         dword ptr [edx+4],ecx 
00000028  jmp         00000030 
0000002a  mov         eax,dword ptr [edx+8] 
0000002d  mov         dword ptr [edx+4],eax 
            c.CondWay();
00000030  cmp         dword ptr [edx+8],0Fh 
00000034  je          0000003B 
00000036  mov         eax,dword ptr [edx+8] 
00000039  jmp         0000003D 
0000003b  xor         eax,eax 
0000003d  mov         dword ptr [edx+4],eax 
00000040  pop         ebp 

Potpis
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ć
Re: Nasledjivanje samo izmedju interfejsa 19.07.2012. u 03:15 · pre 174 meseca #62
Citat:
Mihajlo Cvetanović:
Par desetina nanosekundi viška ja ne bih nazvao dosta lošije. Pustite kompajler da radi svoj posao, i skoncentrišite se na ono što je u kodu bitno, a to je da radi bez grešaka, i da se lako razume i menja.

Kod sa branch instrukcijama bih svakako nazvao dosta losijim od branch free koda.

@mmix
Video sam to na vise platformi/kompajlera. Ovaj C# jit kod je katastrofa - nigde nema conditional move instrukcija, obe verzije su podjedanako lose ;)
Re: Nasledjivanje samo izmedju interfejsa 19.07.2012. u 12:06 · pre 174 meseca #63
Ne bih se slozio satvojom konstatacijom, CMOV je blok operacija koja nije predictable, a velika vecina jxx brancheva jeste predictable i izvrsava se dosta brze na modernim procesorima narocito u multithreaded scenarijima. Jedino sto realno dobijas sa cmovxx je manje bajtova u kodu sto je danas zanemarljiva kategorija za veliku vecinu primena.

I sam intel potvrdjuje tu pricu:

Citat:
Use the setcc and cmov instructions to eliminate unpredictable conditional branches where possible. Do not do this for predictable branches. Do not use these instructions to eliminate all unpredictable conditional branches, because using these instructions will incur execution overhead due to executing both paths of a conditional branch. In addition, converting conditional branches to cmov or setcc trades control-flow dependence for data dependence and restricts the capability of the out-of-order engine. When tuning, note that all Intel® processors have very high branch-prediction rates. Consistently mispredicted branches are rare. Use these instructions only if the increase in computation time is less than the expected cost of a mispredicted branch


i cak je i Linus rekao po koju na tu temu: http://yarchive.net/comp/linux/cmov.html

Ako jos uzmes u obzira da je od Core2 na ovamo mispredicted branching drasticno "pojeftinio" i tih 5% koliko obicno promasi je sada jos manje od overheada cmova. Mnogo stosta moze da se kaze za .NET ali JIT mu je (bar MSov, ne racunamo pokusaj zvano Mono) definitivno na nivou zadatka.
Potpis
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ć
Re: Nasledjivanje samo izmedju interfejsa 19.07.2012. u 20:44 · pre 174 meseca #64
Pretpostavljam da tosa nije mislio na Intel procesore iz poslednjih nekoliko generacija, vec mozda neke embedded arhitekture, koliko se secam tosa je (bar bio) u konzolnom (gaming) biznisu ako ne gresim?

Mada... covek je tu, glupo je da pricam za njega..
Potpis
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
Re: Nasledjivanje samo izmedju interfejsa 19.07.2012. u 21:33 · pre 174 meseca #65
Pravo da ti kažem, ja mogu svašta da očekujem od nekoga ko je us tanju da napiše nešto ovako:
Citat:
tosa: ko voli da pise kilometre boilerplate koda da bi na kraju dosao i do same implementacije svog problema - taj nek uziva u Javi. Ima dosta firmi koje placaju za to besmisleno trosenje vremena...
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 03:05 · pre 174 meseca #66
Citat:
Ivan Dimkovic:
Pretpostavljam da tosa nije mislio na Intel procesore iz poslednjih nekoliko generacija, vec mozda neke embedded arhitekture, koliko se secam tosa je (bar bio) u konzolnom (gaming) biznisu ako ne gresim?

Ne gresis, procesora ima raznih a branch instrukcije su svuda lose, negde (dosta) vise negde manje :)
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 07:51 · pre 174 meseca #67
Gut feeling ili je to necim potkovano?
Potpis
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ć
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 09:09 · pre 174 meseca #68
Citat:
mmix:
Gut feeling ili je to necim potkovano?

Dovoljan hint bi trebalo da ti bude priroda AVX, VMX, SSE i slicnih instrukcija gde veliki broj njih omogucava izbegavanje 'branchy' koda - pored toga sto rade na vise podataka paralelno.
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 10:57 · pre 174 meseca #69
Hmm ali ako vec hoces da iskoristis pun potencijal koji nude SSE/AVX instrukcije (tipa VBLENDVPS) i ovako i onako ces morati da zasuces rukave i spustis se na ASM nivo... a za trivijalne if() statemente posten kompajler ne bi trebao da ima problem da uoci da moze da iskoristi odgovarajucu kondicionalnu instrukciju.
Potpis
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
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 11:35 · pre 174 meseca #70
Citat:
Ivan Dimkovic:
Hmm ali ako vec hoces da iskoristis pun potencijal koji nude SSE/AVX instrukcije (tipa VBLENDVPS) i ovako i onako ces morati da zasuces rukave i spustis se na ASM nivo... a za trivijalne if() statemente posten kompajler ne bi trebao da ima problem da uoci da moze da iskoristi odgovarajucu kondicionalnu instrukciju.

Jos kad bi MSVC dozvoljavao ASM za x64... Poenta je bila da se problem branchy koda reflektovao u dizajnu tih instrukcija zbog cega sam i rekao da bi to bio dobar hint.
Ovo je vec prilicno odlutalo od originalne teme, ali ?: operator mi je skroz ok ;)
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 11:47 · pre 174 meseca #71
Citat:
tosa
Jos kad bi MSVC dozvoljavao ASM za x64...


Off-topic, pa dobro, _mm256_blendv_ps() ce raditi posao takodje ;-)
Potpis
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
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 12:10 · pre 174 meseca #72
Pa i jesmo, ja sam odgovorio na tvoju tvrdnju da je .NET JIT sh*t jer je izabrao branching umesto cmov i ja sam ti dao rezon i objasnjenje zasto je bolje i brze i potkrepio tamo nekim linkovima a kao odgovor dobio "ja znam bolje, vidi AVX". Fine, whateva.
Potpis
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ć
Re: Nasledjivanje samo izmedju interfejsa 20.07.2012. u 16:33 · pre 174 meseca #73
Citat:
Ivan Dimkovic:Off-topic, pa dobro, _mm256_blendv_ps() ce raditi posao takodje ;-)

Off topic: Hoce ;) Nego mi je skroz bezveze sto ne mogu da pisem inline asm za x64 nego moram da se cimam sa ekternim fajlovima (MSVC).

@mmix
Nisu svi procesori out of order, vecina game konzola, mobilnih telefona, tableta i tako dalje ima in order procesore. Niza potrosnja je u pitanju tako da izbegavanje branchy koda i te kako ima smisla.
Jedan branch verovatno nece napraviti veliku razliku (ako bude merljiva) ali ako imas rutinu koja je u loop-u i ima par if-ova tu je cesto kraj sa dobrim performansama.

Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme