Novice » Grafične kartice » ATI Hemlock že novembra?
Brane2 ::
Brane2: Same transformacije verteksov bodo cenejše kot testiranje če je pixel znotraj kroga ali ne. Stencil je pa neuporaben za kaj takega.
Zakaj ? Narišeš lep krog v stencil, nato pa povsod tja, kjer bi imel krogec narišeš kvadratek skozi okrogel stencil in fertik.
Če pa je vsak krog svoje sorte, potem pač vsakega narišeš s svojim pixel shaderjem. Za risanje krogov ni treba veliko HW in dolgega programja.
Sploh ker lahko uporabljaš cordic in ker za vsak izračun pixel lahko takoj s preprosto manipulacijo koordinat narišeš še sedem drugih. Ni ti treba izračunati torej celotnega kroga, ampak samo 1/8...
BTW, a se da dobiti kake podatke o tem, kako so pagei RAM čipov "zviti" v tile na določeni kartici ?
POnavadi imajo RAM čipi "strani", in so podatki na isti strani hitreje dosegljivi kot pa pri čisto random dostopu.
Ponavadi gre za 8K lokacij ali kaj podobnega. Pri grafičnih čipih pa je dostop do RAMa ponavadi tako organiziran, da so te vrtice "zvite" v kockice od recimo 64x64 pikslov ali kaj takega. To pomeni, da lahko dosegam RAM hitreje, če ostajam v teh področjih in ne skačem iz enega v drugega in nazaj brez veze. Je kje kakšen CUDA register ali spremenljivka s tem podatkom ?
Za ostalo hvala, bom preštudiral. Najprej moram obnoviti snov, ki sem jo vedno prešprical- linarno algebro, matrike in determinante.
On the journey of life, I chose the psycho path.
Brane2 ::
@Senitel:
Pri tistem algotu za risanje krogov, gre, če prav razumem:
- za zmanjševanje "zla"- ki ga prinaša "triangle fan-out" način. Še vedno je problematičen izris maljona trikotnikov, čeprav je žrtev manjša, ker jij je večina majhnih.
- še vedno je treba vsa oglišča ročno zračunati, če se ne motim.
Tu bi s CUDA IMHO pridobil kar nekaj. Izračun meje kroga ni tako drag, pa ne bi rabil za to matrat glavni proc...
No, bo treba probat...
Pri tistem algotu za risanje krogov, gre, če prav razumem:
- za zmanjševanje "zla"- ki ga prinaša "triangle fan-out" način. Še vedno je problematičen izris maljona trikotnikov, čeprav je žrtev manjša, ker jij je večina majhnih.
- še vedno je treba vsa oglišča ročno zračunati, če se ne motim.
Tu bi s CUDA IMHO pridobil kar nekaj. Izračun meje kroga ni tako drag, pa ne bi rabil za to matrat glavni proc...
No, bo treba probat...
On the journey of life, I chose the psycho path.
BoLhCa ::
No če še komu javi težavo, kot sem jo imel sam, naj preklopi na svojem X-Fi-ju na Game mode... v Entertainment modu omenjeni bench ne deluje, ker ni OpenAL podpore.
Senitel ::
Brane2:
-Stencil si predtavljaš narobe. Ne moreš tega bufferja shiftat sem ter tja. Če narišeš v stencil buffer krog na 10, 10 z radijem 5 ti to čisto nič ne pomaga pri risanju kroga z istim radijem v color buffer na 130, 99.
-Memory tiling ne pride več v poštev pri GeForce 8 in gor (za Radeone ne vem kako imajo), vse je "generally linear". Pri starejših čipih pa so bile teksture tilane (read only data), render targeti (read/write) pa linearni. Teksture so bile tilana v celoti (pač oni cik cak vzorec). Glede razporeditve po page-ih ti ni treba skrbet. Glede poravnav in tega je pa v programming guide sekcija 5.1.2.1.
-Kako hitro misliš da lahko narediš krog direkt v CUDA/pixel shaderjih? Renderiraš kvadrat, ki vsebuje cel krog. Vsak pixel znotraj bo moral naredit test ali je znotraj kroga ali zunaj. Optimalen primer bi bil pixel shader in daš UV koordinate, ki gredo od -1 do 1 (torej center kvadrata/kroga ravno 0, 0). Sedaj rabiš 2D skalarni produkt in branch če je rezultat večji ali manjši od 1. Težava sedaj je ker moraš krog ali blendat s tistim kar je že v color bufferju (read write color bufferja) ali pa clipat pixle (kar ubije early z). CUDA bo počasnejša, ker tega hecka ne moreš naredit, ker nimaš dostopa do interpolatorjev.
Če narediš isto zadevo z geometrijo, generiraš vertex buffer 1x s CPU-jem (polarne koordinate, narediš toliko vertexov kot ti paše) in generiraš index buffer, ki zveže vertexe v trikotnike tako kot kaže slikca za "max area" na prejšnjem linku. Sedaj vsakič ko hočeš narisat krog v vertex shaderju samo prišteješ koordinato kje ga hočeš imet, pixel shader pa je trivialen. Ker boš verjetno imel več različnih velikosti si pač narediš malo več krogov. Recimo z 16, 256, 1024,... vertexi in potem to skaliraš glede nato kako velika bo stvar dejansko na zaslonu.
-Fora onega algoritma za risanje krogov je v tem, da se izogiba trikotnikom, ki so v eni dimenziji ogromni, v drugi pa minimalni. Če recimo rišeš trikotnik (1,1), (800,1), (800,3) je to slabo. Radeon bo šel čez to v 8x8 blokih, torej 100 blokov in 6400 pixlov, čeprav je trikotnik velik samo 1200 pixlov. GeForce bo šel čez v 16x2 blokih, torej 67 blokov in 2144 pixlov... Skratka potrata shader in ROP ciklov. Če narediš krog s pahljačo, ali pa stripom boš pa sproduciral en kup ravno takih trikotnikov.
-Stencil si predtavljaš narobe. Ne moreš tega bufferja shiftat sem ter tja. Če narišeš v stencil buffer krog na 10, 10 z radijem 5 ti to čisto nič ne pomaga pri risanju kroga z istim radijem v color buffer na 130, 99.
-Memory tiling ne pride več v poštev pri GeForce 8 in gor (za Radeone ne vem kako imajo), vse je "generally linear". Pri starejših čipih pa so bile teksture tilane (read only data), render targeti (read/write) pa linearni. Teksture so bile tilana v celoti (pač oni cik cak vzorec). Glede razporeditve po page-ih ti ni treba skrbet. Glede poravnav in tega je pa v programming guide sekcija 5.1.2.1.
-Kako hitro misliš da lahko narediš krog direkt v CUDA/pixel shaderjih? Renderiraš kvadrat, ki vsebuje cel krog. Vsak pixel znotraj bo moral naredit test ali je znotraj kroga ali zunaj. Optimalen primer bi bil pixel shader in daš UV koordinate, ki gredo od -1 do 1 (torej center kvadrata/kroga ravno 0, 0). Sedaj rabiš 2D skalarni produkt in branch če je rezultat večji ali manjši od 1. Težava sedaj je ker moraš krog ali blendat s tistim kar je že v color bufferju (read write color bufferja) ali pa clipat pixle (kar ubije early z). CUDA bo počasnejša, ker tega hecka ne moreš naredit, ker nimaš dostopa do interpolatorjev.
Če narediš isto zadevo z geometrijo, generiraš vertex buffer 1x s CPU-jem (polarne koordinate, narediš toliko vertexov kot ti paše) in generiraš index buffer, ki zveže vertexe v trikotnike tako kot kaže slikca za "max area" na prejšnjem linku. Sedaj vsakič ko hočeš narisat krog v vertex shaderju samo prišteješ koordinato kje ga hočeš imet, pixel shader pa je trivialen. Ker boš verjetno imel več različnih velikosti si pač narediš malo več krogov. Recimo z 16, 256, 1024,... vertexi in potem to skaliraš glede nato kako velika bo stvar dejansko na zaslonu.
-Fora onega algoritma za risanje krogov je v tem, da se izogiba trikotnikom, ki so v eni dimenziji ogromni, v drugi pa minimalni. Če recimo rišeš trikotnik (1,1), (800,1), (800,3) je to slabo. Radeon bo šel čez to v 8x8 blokih, torej 100 blokov in 6400 pixlov, čeprav je trikotnik velik samo 1200 pixlov. GeForce bo šel čez v 16x2 blokih, torej 67 blokov in 2144 pixlov... Skratka potrata shader in ROP ciklov. Če narediš krog s pahljačo, ali pa stripom boš pa sproduciral en kup ravno takih trikotnikov.
Brane2 ::
Kako hitro misliš da lahko narediš krog direkt v CUDA/pixel shaderjih? Renderiraš kvadrat, ki vsebuje cel krog. Vsak pixel znotraj bo moral naredit test ali je znotraj kroga ali zunaj.
To je res, če si se namenil uporabit čimveč pixel shaderjev na krogu. Če pa rišeš en krog z enim shaderjem, pa ne. Če se recimo omejiš na področja 16x16 na zaslonu in vsakega obdelaš s svojim shaderjem, bi IMHO moral dobiti dokaj pošten izkoristek hardvera...
-Fora onega algoritma za risanje krogov je v tem, da se izogiba trikotnikom, ki so v eni dimenziji ogromni, v drugi pa minimalni. Če recimo rišeš trikotnik (1,1), (800,1), (800,3) je to slabo. Radeon bo šel čez to v 8x8 blokih, torej 100 blokov in 6400 pixlov, čeprav je trikotnik velik samo 1200 pixlov. GeForce bo šel čez v 16x2 blokih, torej 67 blokov in 2144 pixlov... Skratka potrata shader in ROP ciklov. Če narediš krog s pahljačo, ali pa stripom boš pa sproduciral en kup ravno takih trikotnikov.
To vem, ampak še vedno bo dela veliko več, kot če bi krog narisal samo enkrat. Sploh pa, a ni lažje in ceneje krog filat s kvadrati in pravokotniki kot s trikotniki - vsaj v prvih nekaj iteracijah ?
On the journey of life, I chose the psycho path.
Senitel ::
Ok time out. Ti bi torej risal krog znotraj 16x16 polja z enim samim threadom, oziroma tvoji threadi iz CUDA kernela ne bi tekli na pixlih ampak na krogih?
Kaj točno misliš pod "narisal krog samo enkrat". Zrenderiral enkrat in potem memcopy okrog?
Kaj točno misliš pod "narisal krog samo enkrat". Zrenderiral enkrat in potem memcopy okrog?
Brane2 ::
ja, nekaj takega sem imel v mislih.
Naredim pointer na krogce in druge primitive, ki jih je treba narisat in spustim nadnje threade. Vsak thread izriše svoj krogec/polkrog/arc/črto/whatever v svojih recimo 16x16 kvadratku.
Pod "samo enkrat" mislim da pač ne rišeš krog kot vsoto maljarde trikotnikov ampak kot eno primitivo- krog. Izračunaš njegove robne točke ( oziroma izračunaš samo eno osmino - od 0 do PI/4, te pa potem prezrcališ v ostale),med njimi potegneš vodoravne črte in fertik deu.
Naredim pointer na krogce in druge primitive, ki jih je treba narisat in spustim nadnje threade. Vsak thread izriše svoj krogec/polkrog/arc/črto/whatever v svojih recimo 16x16 kvadratku.
Kaj točno misliš pod "narisal krog samo enkrat". Zrenderiral enkrat in potem memcopy okrog?
Pod "samo enkrat" mislim da pač ne rišeš krog kot vsoto maljarde trikotnikov ampak kot eno primitivo- krog. Izračunaš njegove robne točke ( oziroma izračunaš samo eno osmino - od 0 do PI/4, te pa potem prezrcališ v ostale),med njimi potegneš vodoravne črte in fertik deu.
On the journey of life, I chose the psycho path.
Senitel ::
Ne, ne,... Tole ne bo dobra ideja. Branch granularity bo problem, praktično random output iz kernela bo problem. RAW/WAR problemi. Sicer bi imel teh primitivov ogromno ampak se mi zdi, da se bo zadeva preveč časa ukvarjala z IO.
GPU-ji potegnejo 600+M tritkonikov/s, zakaj nebi tega izrabil?
GPU-ji potegnejo 600+M tritkonikov/s, zakaj nebi tega izrabil?
Brane2 ::
V bistvu res. Crap. Kdaj končno bo lahko vsak thread resnično neodvisen od drugih ?
Sem nekako upal na novi GT300, pa kot je videti, še ne bo nič s tem...
Sem nekako upal na novi GT300, pa kot je videti, še ne bo nič s tem...
On the journey of life, I chose the psycho path.
Brane2 ::
Ampak drugo vprašanje pa še vedno ostane- namesto prikazanega filanja kroga s trikotniki a ne bi bilo pametneje uporabit kvadrate/pravokotnike če ne do konca pa vsaj v prvih nekaj iteracijah ?
On the journey of life, I chose the psycho path.
Senitel ::
Fermi lahko potegne half warp iz drugega kernela ampak to ti v tem primeru ne pomaga kaj dosti. Tvoj pristop bi IMO deloval vredu samo na CPU-ju z veliko količino L2 predpomnilnika.
Kvadrat/pravokotnik (GL_QUAD) se razstavi na dva trikotnika. Če to gre normalno čez pixel shader in stvar narediš tako kot sem napisal prej, bo to simpl in vredu. Niti ti ni treba filat vseh 4 vertexov, za krog rabiš samo enega (in potem generiraš 4 vertexe v geometry shaderju). Edino hardware AA nebo imel efekta, early z ne bo delal (če nimaš ogromno overdraw-ja ne bo problem).
Kvadrat/pravokotnik (GL_QUAD) se razstavi na dva trikotnika. Če to gre normalno čez pixel shader in stvar narediš tako kot sem napisal prej, bo to simpl in vredu. Niti ti ni treba filat vseh 4 vertexov, za krog rabiš samo enega (in potem generiraš 4 vertexe v geometry shaderju). Edino hardware AA nebo imel efekta, early z ne bo delal (če nimaš ogromno overdraw-ja ne bo problem).
Brane2 ::
Hmm. Moja 8800GT ima 14 multiprocesorjev. Vsak laufa 32threadov v Warpu in do 24 Warpov v bloku.
Tako na uč ne bi smel biti problem napisati rutino, po kateri bi vsak krog risal z enim Warpom precej učinkovito.
S tem bi rešil precej problemov, tudi lokalnost dostopa do RAM-a, sploh če bi imel tabelo objektov, ki jih je treba narisati zgenerirano tako, da laufajo vsi multiprocesorjih na podatkih v istem pageu, če se da...
Tako na uč ne bi smel biti problem napisati rutino, po kateri bi vsak krog risal z enim Warpom precej učinkovito.
S tem bi rešil precej problemov, tudi lokalnost dostopa do RAM-a, sploh če bi imel tabelo objektov, ki jih je treba narisati zgenerirano tako, da laufajo vsi multiprocesorjih na podatkih v istem pageu, če se da...
On the journey of life, I chose the psycho path.
boset ::
čez eno leto ?
Ali v začetku 2010?
Ali v začetku 2010?
Main Desktop:
i9 14900k | EK Custom loop S480 | Asus APEX Encore Z790 | RTX4090 Strix OC
G.Skill 32Gb DDR5 7200 | WD_Black 850XNVMe | ThorII 1200W
i9 14900k | EK Custom loop S480 | Asus APEX Encore Z790 | RTX4090 Strix OC
G.Skill 32Gb DDR5 7200 | WD_Black 850XNVMe | ThorII 1200W
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | AMD Radeon HD 8xxx (strani: 1 2 3 )Oddelek: Strojna oprema | 21693 (15539) | klkkkkkkkkkk |
» | Novo najhitrejše grafično jedroOddelek: Novice / Grafične kartice | 9337 (7924) | Senitel |
» | Profesionalni FermiOddelek: Novice / Grafične kartice | 11817 (10762) | Jst |
» | Izdelanih že 800.000 Radeonov HD 5000Oddelek: Novice / Grafične kartice | 4588 (3567) | Machiavelli |
» | ATI Hemlock že novembra? (strani: 1 2 )Oddelek: Novice / Grafične kartice | 9826 (7126) | Machiavelli |