Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 31. červenec 2011, 15:52:32 Předmět: Jak rychle se přepínají shadery |
|
|
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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. srpen 2011, 19:31:51 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 2. srpen 2011, 19:46:28 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 3. srpen 2011, 11:26:32 Předmět: |
|
|
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 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 |
|
 |
Khaj

Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 14. srpen 2011, 09:36:28 Předmět: |
|
|
Díky moc, tohle jsem přesně potřeboval - teď budu s klidnym svědomim dělat IFy. |
|
Návrat nahoru |
|
 |
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 9. září 2011, 12:17:39 Předmět: |
|
|
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 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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 9. září 2011, 13:12:35 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. září 2011, 13:31:33 Předmět: |
|
|
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 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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 9. září 2011, 14:06:25 Předmět: |
|
|
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 |
|
 |
franz
Založen: 30. 07. 2007 Příspěvky: 1325
|
Zaslal: 9. září 2011, 14:11:56 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 9. září 2011, 14:35:57 Předmět: |
|
|
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 |
|
 |
|