.[ ČeskéHry.cz ].
Raytracer
Jdi na stránku Předchozí  1, 2, 3
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
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: 14. červen 2009, 13:29:59    Předmět: Odpovědět s citátem

Vilem Otte: no asi tě zklamu, protože odpověď na polovinu tvých otázek je: optimalizace žádné Smile)
C# rozhodně není to pravé ořechové pro raytracer, takže i s využitím všech 4 (8 virtuálně) jader to trvá roky než se scéna vyrenderuje (i s málo objekty). Proto přemýšlím do jakého jazyka raytracer přepsat -> pak bych se teprve vrhl na optimalizace. Ale když v C# jen projetí pole boolean 800x600 a nastavení třeba na true trvá půl vteřiny, tak nemá cenu dělat nějaké optimalizace, protože to bude prostě slimák vždycky. Takže teď se jestě pokusím dopsat refrakci a přepíšu to do cpp.
Stíny: 25 samplů + náhodná malá odchylka.
No a tahle scéna byla vyrenderovaná za krásných 16 minut na Core i7 při plném vytížení všech jader. Nádhera že? Very Happy


a zájem o info + ukázku by určitě byl!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 14. červen 2009, 14:28:31    Předmět: Odpovědět s citátem

Matasx napsal:
Ale když v C# jen projetí pole boolean 800x600 a nastavení třeba na true trvá půl vteřiny, tak nemá cenu dělat nějaké optimalizace, protože to bude prostě slimák vždycky.

Tak to je někde něco hodně špatně. U mě taková operace trvá 3 ms Smile. Jinak, než to začneš přepisovat do C++, nechceš to zkusit pustit v Monu? Od verze 2.2 podporují některé SIMD instrukce, tak bys měl větší prostor pro optimalizace jako v Microsoftí implementaci .NETu Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



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

PříspěvekZaslal: 14. červen 2009, 15:06:21    Předmět: Odpovědět s citátem

posila: dík za tip, zkusím Smile (ale moc tomu nedávám)

EDIT: a jak dostanu tu knihovnu Mono.SIMD do windows? sem si z oficiálních stránek stáhl ten pack a nainstaloval, ale knihovny v systému nejsou...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 14. červen 2009, 17:56:28    Předmět: Odpovědět s citátem

Mono žije vedle .NETu a z Visual Studia (zatím) nejde pohodlně použít. Pokud nekompiluješ z command line, tak budeš potřebovat nějaké IDE, které Mono podporuje (třeba SharpDevelop) a v něm nastavit, že má targetovat pro Mono.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



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

PříspěvekZaslal: 14. červen 2009, 18:41:16    Předmět: Odpovědět s citátem

Tak nevím co sem udělal špatně, když si rozkliknu target framework, tak tam mám jen .NET, ale mono ne Exclamation Question
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



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

PříspěvekZaslal: 20. červen 2009, 21:19:48    Předmět: Odpovědět s citátem

No tak sem to nakonec přepsal do c++ (teda aspoň ten základ). Nějaká jednodušší scéna na nižší rozlišení cca. 7 vteřin. Teď snad bude trochu času tak si prostuduju nějaký dokumenty o raytraycingu (což jsem chtěl už dávno) a pokusím se to trošku optimalizovat. Pak by se mohly dostavit nějaké slušné výsledky.

A teď ještě dotázeček:
jaktože
kód:
        friend vector3 operator + ( const vector3& v1, const vector3& v2 )
        {
                vector3 c(0,0,0);

                _asm
                {
                        mov     eax, v1;
                        movups xmm0, [eax];
                        mov     ebx, v2;
                        movups xmm1, [ebx];
                        addps xmm0, xmm1;
                        movups c, xmm0;
                };
                return c;
        }

je uplně stejně rychlý jako
kód:
        friend vector3 operator + ( const vector3& v1, const vector3& v2 )
        {
                return vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
        }


proč sem vůbec očekával že to bude rychlejší? Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 20. červen 2009, 22:23:24    Předmět: Odpovědět s citátem

Kdyz uz psat SSE tak pouzivat aligned instrukce presunu movaps(s tim spojene vnuceni zarovnane adresy pro struktury).
Ale dost pochybuju ze i kdybys to cely prepsal do asm/sse/whatever tak dostanes vic jak 3% vykonu, spis naopak.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 20. červen 2009, 22:27:17    Předmět: Odpovědět s citátem

Preco myslis, ze by dostal len cca 3% vykonu ? Kompilator pri vectorizacii robi azda tak brutalny SSE kod ?
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: 21. červen 2009, 00:39:24    Předmět: Odpovědět s citátem

Z vlastní zkušenosti VC++2008 rozhodně nedělá o moc rychlejší kód s SSE než bez SSE. Zapnutí SSE může zrychlit i zpomalit (proč mi to v některých případech zpomalovalo, nevím). Kompilátor je prostě někdy tupý. S ručně napsaným SSE kódem by mělo být snadné jej překonat.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 21. červen 2009, 10:47:53    Předmět: Odpovědět s citátem

Jak tak ctu tak VC++ 2008 si nerozumi s inline assemblerem moc dobre a je lepsi pouzit intrinsic funkce.
Ono je to celkem logicky kdyz najednou v pulce kodu kdy pouziva nejaky registry tak mu zacne clovek cpat svuj kod a prepisovat jeho.
http://blogs.msdn.com/vcblog/archive/2007/10/18/new-intrinsic-support-in-visual-studio-2008.aspx
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



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

PříspěvekZaslal: 21. červen 2009, 11:03:44    Předmět: Odpovědět s citátem

johnnash: možná vyzkouším, ale neočekávám rozdíl...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 22. červen 2009, 16:01:49    Předmět: Odpovědět s citátem

Skutečně to příliš pouhým přepsáním do SSE/ASM moc neurychlíš, je třeba využít jeho výhody lépe - nejlépe provést s ním packet tracing, kdy budeš počítat 4 polopřímky najednou (což je výhoda).

Přepisovat tyto matematické operace s vektory na low-level smysl nemá (navíc já bych to vůbec nepsal způsobem jak to máš napsáno - pracoval bych s 4mi vektory najednou, nikoliv s celými vektory).
Určitě používej aligned instrukce přesunu, unaligned jsou mnohem pomalejší.

Ruční přepsání do ASM/SSE o něco urychlí, ale člověk to musí psát dobře - a měl by jsi spíše přepsat celou ray-triangle, ray-sphere a další výpočty průniku. Jinak také tolik nezískáš.
Jde zde hlavně především o packet tracing (kterým získáš se SIMD-SSE až 4x větší výkon (prakticky to nad 3.5 násobek nejde ... a i to je hodně dobré)). Ovšem jakmile ztratíš koherenci polopřímek je ti packet tracing k ničemu a výkon jde zase drasticky dolů.

VC++ 2008 si s ním docela rozumí (pokud tam nenapíšeš nějakou prasárnu), u ASM je podstatné aby člověk byl opatrný.
Ovšem intrinsic se mi zdají mnohem lepší (také z důvodu přehlednosti).

Každopádně tímto moc nezískáš, skutečné zrychlení ti přinesou až KD-trees, BVH, příp. další.

btw. malou ukázku videa a pár screenů k raytracingu tady postnu za chvilku Wink.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

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

Tak hodil jsem tady pár screenů na web - odkazy rovnou na screeny:
http://www.otte.cz/engine/Erata/screen01.png
http://www.otte.cz/engine/Erata/screen02.png
http://www.otte.cz/engine/Erata/screen03.png
http://www.otte.cz/engine/Erata/screen04.png
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3
Strana 3 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