.[ ČeskéHry.cz ].
Jak rychle se přepínají shadery

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Grafika
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 31. červenec 2011, 15:52:32    Předmět: Jak rychle se přepínají shadery Odpovědět s citátem

Zdravím,

rád bych věděl, jestli je obecně na Windows s použitím DirectX rychlejší dát do pixel shaderu if (konkrétně třeba podmíněný čtení textur), nebo přepínat mezi (už načtenými) shadery co tuto funkci obsahují a shadery bez ní.

Asi to bude na každý grafárně jinak, zajímalo by mě jak je to pro tuto generaci graf. karet a jestli to do budoucna zůstane (tzn nezajímají mě starý grafárny).

Typicky totiž mám Volume rendering a každý z pohledů na ten samý volume má jiné parametry zobrazení (trikubická interpolace atp), některá využijí if, některá ne.
Zatím dělám v shader modelu v 3.0.

Díky moc.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. srpen 2011, 19:31:51    Předmět: Odpovědět s citátem

Ahoj, nedávno jsem zkoušel zrychlit kreslení právě rozdělením do více shaderů bez IFů. Pro začátek jsem IFy smazal a nechal běžet jen jednu větev a překvapilo mě, že se rychlost kreslení vůbec nezměnila. Mám tedy pocit, že se pro konstantní hodnoty (textury = 0/1) v shaderu "uzná" jen momentálně platná větev a zbylé na GPU k výpočtu vůbec nedoputují.

Něco o tom je tady... http://www.gamedev.net/topic/463535-hlsl-static-flow-control/

A tady... http://forums.create.msdn.com/forums/p/32907/188421.aspx
citace:
Also just to clarify what "static branching" means: static branching occurs when you use specific ASM branching instructions that branch on boolean values that are constant for an entire run of the shader (AKA, it's a uniform const whose value is set from your application code). These branches are supposed to be "free", since they get removed by the runtime when you apply the shader and draw.


Nicméně bych byl radši, kdyby se vyjádřil někdo zkušenější...
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
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: 2. srpen 2011, 19:46:28    Předmět: Odpovědět s citátem

Větvení kódu (IFy, cykly) by mělo být rychlý právě tehdy, když výrazy v podmínkách a počty iterací cyklů jsou stejné pro všechny pixely, které jeden Draw příkaz vykreslil.

Např.: když IFy závisí jenom na uniformních proměnných (nebo na výrazu, který je odvozen pouze z uniformních proměnných), rozhodně bych je použil.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 3. srpen 2011, 11:26:32    Předmět: Odpovědět s citátem

Presne tak, je to potom ovela prehladnejsie ako cely kod zamrdat ifdefmi, kompilator i runtime si s tym obvykle velmi dobre poradi. Dokonca by som sa nebal ani uplne dynamickeho branchingu, kde sa da predpokladat, ze velke skupiny vypocetnych jednotiek vyhodnotia podmienku zhodne. Ale to som nepovedal nic nove Very Happy Hlavne najprv mat funkcny kod a potom experimentovat s optimalizaciami.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 14. srpen 2011, 09:36:28    Předmět: Odpovědět s citátem

Díky moc, tohle jsem přesně potřeboval - teď budu s klidnym svědomim dělat IFy.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
franz



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

PříspěvekZaslal: 9. září 2011, 12:17:39    Předmět: Odpovědět s citátem

Eosie napsal:
Větvení kódu (IFy, cykly) by mělo být rychlý právě tehdy, když výrazy v podmínkách a počty iterací cyklů jsou stejné pro všechny pixely, které jeden Draw příkaz vykreslil.

Např.: když IFy závisí jenom na uniformních proměnných (nebo na výrazu, který je odvozen pouze z uniformních proměnných), rozhodně bych je použil.


a sakra, tak to abych přepsal tohle Smile Ví někdo jak?

kód:
if (ExpDepth < gl_FragColor.a) gl_FragColor.a=ExpDepth;
if (gl_FragColor.a > Color.a) gl_FragColor.a=Color.a;
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: 9. září 2011, 13:12:35    Předmět: Odpovědět s citátem

Co třeba přes min, max?

kód:
gl_FragColor.a = min(gl_FragColor.a, ExpDepth);
gl_FragColor.a = min(gl_FragColor.a, Color.a);

_________________
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
Marek



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

PříspěvekZaslal: 9. září 2011, 13:31:33    Předmět: Odpovědět s citátem

franz napsal:
Eosie napsal:
Větvení kódu (IFy, cykly) by mělo být rychlý právě tehdy, když výrazy v podmínkách a počty iterací cyklů jsou stejné pro všechny pixely, které jeden Draw příkaz vykreslil.

Např.: když IFy závisí jenom na uniformních proměnných (nebo na výrazu, který je odvozen pouze z uniformních proměnných), rozhodně bych je použil.


a sakra, tak to abych přepsal tohle Smile Ví někdo jak?

kód:
if (ExpDepth < gl_FragColor.a) gl_FragColor.a=ExpDepth;
if (gl_FragColor.a > Color.a) gl_FragColor.a=Color.a;


Proč to přepisovat? min/max bych rozhodně nepoužil, nechal bych to tak. Jedno podmíněný přiřazení je obecně dost rychlá záležitost a chytrej shader compiler takový kód umí transformovat do kódu bez podmínek. (hardware má instrukce na podmíněné přiřazení, tzn. není potřeba IF).

Problém u větvení bych viděl, až tam těch příkazů v jedné větvi bude víc. Ale ani s tím bych si hlavu nelámal. Bez větvení kódu se někdy obejít nedá.
_________________
AMD Open Source Graphics Driver Developer
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: 9. září 2011, 14:06:25    Předmět: Odpovědět s citátem

citace:
Proč to přepisovat? min/max bych rozhodně nepoužil, nechal bych to tak. Jedno podmíněný přiřazení je obecně dost rychlá záležitost a chytrej shader compiler takový kód umí transformovat do kódu bez podmínek. (hardware má instrukce na podmíněné přiřazení, tzn. není potřeba IF).

Problém u větvení bych viděl, až tam těch příkazů v jedné větvi bude víc. Ale ani s tím bych si hlavu nelámal. Bez větvení kódu se někdy obejít nedá.

Proč? - min/max/clamp jsou implementovány v hardware a neprovádějí žádný branching.

Hm, když tak nad tím uvažuju ... je fakt, že toto jednoduché větvení bude kompilér překládat na SLT

EDIT: Otázkou je, co zůstane rychlejší - jestli 2x MIN, nebo 2x SLT ... hm...
EDIT2: Překlep instrukce ... už opraveno
_________________
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
franz



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

PříspěvekZaslal: 9. září 2011, 14:11:56    Předmět: Odpovědět s citátem

Mně se na první pohled zdá, že min/max vždy přiřazuje nějaký hodnoty, zatímco if jen v případě splněné podmínky (vycházím z toho, že nevím, jak to funguje uvnitř)
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: 9. září 2011, 14:35:57    Předmět: Odpovědět s citátem

Min/max funguje bez jakéhokoliv větvení na gpu, na cpu ho obvykle implementuješ jako:
kód:
float max(float x, float y)
{
  return x > y ? x : y;
}

Což je kondicionální (teď nevím jak to má SSE instrukce MAXSS nebo MAXPS, musel bych se kouknout, ale myslím že ten to kondicionálně nemá).

Na GPU ale min/max jsou dělány přímo hardwarově (obvodem), ten je docela snadný (dá se vymyslet i z hlavy, když znáš nějaké základy elektroniky).

Ten min/max přiřadí vždy hodnotu (ale jako jednu hodnotu můžeš dodat tu proměnnou, do které chceš výsledek, čímž získáš prakticky totéž co kondicionální move), SLT (nebo-li kondicionální MOV pokud je podmínka menší než) jen pokud je podmínka splněna.

Možná že kompilér je možná tak dobrý, že min/max někdy nahradí kondicionálním movem (je-li rychlejší!), nebo naopak... to už ale nevím.
_________________
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 -> Grafika Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
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