.[ ČeskéHry.cz ].
C# - rychlost
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 20:45:58    Předmět: C# - rychlost Odpovědět s citátem

Zdravím všechny. Udělal jsem si takový malý test v C#. Dvourozměrné pole se strukturou (float,float,float). Procházím všechny prvky a nad každou strukturou provedu 3 FPU operace (např. 3 vynásobení dvou čísel). Při "rozlišení" 800x600 se dostanu na 5 průchodů celým polem za vteřinu (5fps). Z toho mi (ať počítám jak počítám) vychází: 800*600*3*5 = 7 200 000 (?FLOPS?). Samozřejmě jsou mezitím nějaké režijní operace (nějaký ten mov, add, inc a bůh ví co tam .NET ještě nabastlí). - Toto na i7 pouze na jednom jádru. Někde na netu sem našel že i7 extreme na 3.2GHz má 70 GFLOPS. Proto se mi to zdá trochu málo. A nebo je to ok?

Ještě přiložím kód.

kód:

            Col[,] array = new Col[width, height];

...

                Col* arrayPtr = null;

                for (int i = 0; i != width; i++)
                {
                    fixed (Col* ptr = &array[i, 0])
                    {
                        arrayPtr = ptr;
                        for (int j = 0; j != height; j++)
                        {                           
                            arrayPtr->a = (arrayPtr->b) * (arrayPtr->c);
                            arrayPtr->b = (arrayPtr->a) * (arrayPtr->c);
                            arrayPtr->c = (arrayPtr->a) * (arrayPtr->b);
                            arrayPtr++;
                        }
                    }
                }

...

    struct Col
    {
        public float a;
        public float b;
        public float c;

        public Col(float a, float b, float c)
        {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }


Naposledy upravil Matasx dne 16. prosinec 2009, 21:34:27, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 16. prosinec 2009, 21:22:17    Předmět: Odpovědět s citátem

Ja myslim ze se to takhle neda rict, tech 70 GFLOPS bude urcite teoretickej vypocetni vykon. Tady ti muze system napr. pozastavit vlakno nebo dalsich 1000 veci. Spis bych to porovnaval se stejnym kodem v C/C++ nebo jinym nativnim jazykem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 16. prosinec 2009, 21:40:31    Předmět: Odpovědět s citátem

Yep, zkus to samý napsat v C/C++.

Do teoretického výkonu se může počítat využití všech jader a všech dostupných instrukčních sad (zejména poslední verze SSE).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 21:51:06    Předmět: Odpovědět s citátem

No takže výsledky (1 440 000 operací):
C# - 192 až 200 ms
C - 190 až 197 ms

Takže rozdíl žádný. A není těch 7 200 000 operací opravdu nějak málo? Embarassed
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 16. prosinec 2009, 22:30:18    Předmět: Odpovědět s citátem

Matasx napsal:
No takže výsledky (1 440 000 operací):
C# - 192 až 200 ms
C - 190 až 197 ms

Takže rozdíl žádný. A není těch 7 200 000 operací opravdu nějak málo? Embarassed


Tak to ukaz ten C kod, takovy pruchod polem by mel byt podstatne rychlejsi. Samozrejme optimalizace jsou zaklad, misto dvourozmerneho pole pointeru pouzij jednorozmerne pole a indexuj do nej, misto floatu double atd.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 22:37:35    Předmět: Odpovědět s citátem

C#: http://nopaste.ceske-hry.cz/222806
C: http://nopaste.ceske-hry.cz/222807
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mantharis



Založen: 28. 07. 2007
Příspěvky: 39

PříspěvekZaslal: 16. prosinec 2009, 22:48:10    Předmět: Odpovědět s citátem

Jedno nebo vice rozmerny pole pointru je imho irelevantni co se vlivu na vykon tyka...prekladac ty pole optimalizuje ze to vyjde ve vysledku na stejno a naopak tim ze se pouzije "pruhlednejsi" zdrojak tam tim spis nad tim prekladac vymysli nejakou "hezkou" optimalizaci
_________________
If the God gave us the source code we could bug the world.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 22:59:51    Předmět: Odpovědět s citátem

Jednorozměrný / dvourozměrný, float / double - to je bezpředmětný. To na výkon vliv nemá. A přepisem do čistýho ASM bude výsledek IMHO taky stejnej.

No proč to vlastně řeším. - Stále sem nepustil z hlavy ten raytraincing (jestli si někdo třeba ještě matně vzpomíná). Tak TEORETICKY, když přídám ještě 3 jádra, dostanu 20fps. A stále to znamená že barvu pixelu musím získat nanejvýš pomocí tří Exclamation FPU operací. A to se tu vůbec nebavím o nějakém vykreslování toho pole na obrazovku. Takže buďto je celá tahle úvaha uplně špatně (čili mám tam něco uplně špatně) - což asi jo a nebo nejde napsat realtime raytracer (800x600) pro i7 Very Happy A nebo ten počet operací pro získání barvy pixelu stačí (a to pochybuju).

EDIT: taková drobnost, kterou jsem přehlídl ... mam na i7 zaplý HT (tedy virtuálně 8 jader), zatížení 13% odpovídá vytížení půljádra tím pádem. (nejspíš).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 16. prosinec 2009, 23:10:04    Předmět: Odpovědět s citátem

Matasx napsal:
C#: http://nopaste.ceske-hry.cz/222806
C: http://nopaste.ceske-hry.cz/222807


u me jeden pruchod te while() smycky trva <1msec (okolo 4 msec bez zapnutych optimalizaci)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 23:12:09    Předmět: Odpovědět s citátem

Co znamenají optimalizace?
A C nebo C# ?
Všiml jsem si že když dám pryč ten cyklus tak poprvé se to provede za 4ms a pak už kolem těch 200ms ... nechápu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 16. prosinec 2009, 23:15:30    Předmět: Odpovědět s citátem

Mantharis napsal:
Jedno nebo vice rozmerny pole pointru je imho irelevantni co se vlivu na vykon tyka...prekladac ty pole optimalizuje ze to vyjde ve vysledku na stejno a naopak tim ze se pouzije "pruhlednejsi" zdrojak tam tim spis nad tim prekladac vymysli nejakou "hezkou" optimalizaci

Jak chces aby ti kompiler zoptimalizoval pristupy do pameti pres dva pointery ? Z hlediska L2 cache to bude dost hruza.

citace:
Co znamenají optimalizace?
A C nebo C# ?
Všiml jsem si že když dám pryč ten cyklus tak poprvé se to provede za 4ms a pak už kolem těch 200ms ... nechápu.

C. Mozna bude problem v mereni pres clock(), pokud mas cpu ktere ti dynamicky meni frekvenci tak bych pouzil spis gettimeofday() (nebo nejaky windows ekvivalent pokud neni, queryperformancecounter atd.)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 23:20:03    Předmět: Odpovědět s citátem

Jo vidíš, to mě nenapadlo, po pár cyklech se "zařadí další převod"... ale to neřeším, těch 200 ms je i v C vzhledem k frekvenci výpisu odpovídající.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
JohnyDog



Založen: 17. 08. 2007
Příspěvky: 66

PříspěvekZaslal: 16. prosinec 2009, 23:27:03    Předmět: Odpovědět s citátem

Matasx napsal:
Jo vidíš, to mě nenapadlo, po pár cyklech se "zařadí další převod"... ale to neřeším, těch 200 ms je i v C vzhledem k frekvenci výpisu odpovídající.

Co je to za kompiler ?

Dalsi veci co me napada je ze tam porad nasobis, takze behem par cyklu se dostanes na +Infinity u vsech prvku, ale to by nemelo mit vliv.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 16. prosinec 2009, 23:30:52    Předmět: Odpovědět s citátem

V kompileru to taky není. Poslal jsem exe zkompilované u mě kámošovi a ten na zastaralém AMD hlásí 16 nebo 32... tak už mě napadá jen problém zvaný Vista.
EDIT: a nebo vypnout swap.
EDIT2: swapem to taky není. Uvidím až vyměním OS za W7 - pokud do té doby nezjistím čím to je.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 16. prosinec 2009, 23:47:18    Předmět: Odpovědět s citátem

Jak jsi to kompiloval? Tj: Jaká byla konfigurace projektu? Jaké jsi použil optimalizace kompilátoru? Link-time code generation? Bez SSE nebo s SSE1/2? Máš zapnutý frame pointer? Co třeba Buffer Security Check a použitý Floating Point Model?

Bez těchto informací je celý test k ničemu. Základní konfigurace projektu (Debug) může klidně dát 10x pomalejší kód.

Clock nepoužívej, použij performance counter.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna