Ik ben me vandaag pas daadwerkelijk grondig in proberen te lezen over tesselation en de verschillende implementaties tussen nVidia en AMD, jammer genoeg kan ik op het door jouw gelinkte whitepaper van nVidia bar weinig vinden over de kant van AMD, behalve jouw claim dat er bij AMD geen communicatie tussen de verschillende modules plaats kan vinden.
Hoezo 'claim'?
Het is heel simpel: AMD implementeert tessellation op de naieve manier. Daarom is er geen mooi verhaal zoals bij nVidia's PolyMorph, want er valt niet veel over te vertellen.
AMD gaat natuurlijk niet letterlijk roepen van: "Wij kunnen niet communiceren tussen verschillende SMs", want dat klinkt niet bepaald positief. Dus een dergelijk 'bewijs' ga je inderdaad niet vinden. Maar je vindt ook nergens een aanwijzing dat het WEL kan.
Wat AMD doet, stamt nog uit de tijd van de eerste geometry shaders (een technologie die ook niet van de grond kwam vanwege bottlenecks in de pipeline). Het feit dat hun oplossing totaal niet schaalt in de praktijk is al genoeg bewijs dat hun implementatie niet schaalt.
De reden is dus dat ze niet kunnen communiceren, en dat blijkt als je hun architectuur goed bestudeert.
Of de resultaten van de benchmarks natuurlijk...
Zo zie je dus dat hun GPUs met 4 geometry engines bij lage tessellation factors sneller zijn dan die met 2 geometry engines.
Maar de performance zakt ook 2 keer zo hard in (ondanks dat de architectuur nieuwer is, en de geometry engines zelf dus ook sneller dan de oudere met 2 engines).
Dat is dus gebrek aan communicatie:
Je hebt 4 geometry engines, dus je hebt 4 pipelines waar je je polygon patches naartoe kunt sturen ipv 2.
Dus bij weinig of geen tessellation gaat dat sneller.
Maar op het moment dat iedere pipeline honderden triangles per patch moet gaan genereren zie je het probleem: Je hebt je GPU in 4 stukken verdeeld ipv 2, en die honderden triangles moeten nu door een kleiner deel van de GPU verwerkt worden, dus langzamer.
Als er communicatie was, zou je dit probleem niet zien: je verdeelt je triangles gewoon altijd evenredig over de hele GPU, ipv dat ze 'opgesloten' blijven binnen 1 van de 4 pipelines waarin ze begonnen zijn.
Wat ik uit het relevante gequote stuk van nVidia kon opmaken is dat de reden dat Polymorph werkt grotendeels komt door de gedeelde L2 cahce.
Dan snap je nog steeds totaal niet wat PolyMorph is.
PolyMorph is dus een cluster van 16 geometry engines. Dat zijn er dus sowieso al 4 keer zo veel als wat AMD heeft.
Maar de echte 'magie' zit hem erin hoe nVidia zoveel geometry engines aanstuurt: ze kunnen dus compleet parallel werken, over de HELE GPU. Patches kunnen overal vandaan komen, door ieder van deze 16 geometry engines verwerkt worden, en er zijn dan ook 4 rasterizers waar de output triangles naartoe kunnen, die de triangles door iedere SM in de GPU kunnen laten rasterizen.
Snap je uberhaupt wat er gebeurt in een tessellator eigenlijk?
In het niet-tessellation-geval heb je gewoon een lijst triangles, en die kunnen evenredig verdeeld worden over alle geometry engines in een GPU. Vanaf daar is alles 1-op-1, dus alles kan simpel gepipelined worden. 1 triangle in is 1 triangle uit. Vrij simpel. Gooi het door een rasterizer, en stuur je pixel pipelines aan.
Maar bij tessellation gebeurt er dus dit:
Je stopt er 1 polygon patch in, en de tessellator deelt dit dan op in meerdere triangles. Als je dus een hoge tessellation factor gebruikt, kan een enkele patch wel honderden of duizenden triangles voortbrengen.
Het probleem is: waar moet je heen met die triangles? Bij AMD is het antwoord: alleen naar de hardwired geometry setup/rasterizer van dat deel van de GPU. Daar zit de bottleneck. Een geometry setup/rasterizer die normaal gesproken maar 1 triangle had hoeven verwerken per keer, krijgt er nu ineens duizenden te verwerken. Dat terwijl de andere geometry setup/rasterizers op dat moment misschien idle zijn.
Bij nVidia heb je dus sowieso al meer geometry setup units, en je kunt de triangles ook nog eens naar ieder van die units forwarden. Dus zelfs bij een enorme 'explosie' van polygons kun je nog steeds efficient parallel blijven renderen.
Dat is het fundamentele verschil, en de reden waarom nVidia's aanpak wel schaalt, en die van AMD niet.
Bij nVidia is het niet een hardwired pipeline, maar een dynamisch blok dat de workloads verdeelt over de hele GPU, op basis van welke resources er idle zijn.
Zoals ik al zei, zie het als het verschil tussen in-order en out-of-order execution bij CPUs. Het idee is vrijwel hetzelfde.
Ook dat noem ik een design keuze en ook daar had intel niet iets anders op de plank liggen...
Oh jawel. Intel had ook nog de Itanium en de Pentium M/Core.
Pentum 4 was wel een foute keuze, en Intel heeft er vooral ook veel te lang over gedaan om de Pentium M/Core-tak weer als mainstream CPU-lijn te gaan gebruiken. Maar ze hadden die technologie wel degelijk in huis.
Ondanks dat je mij nooit zal horen roepen dat het niet eerlijk is tesselation te gebruiken, vind ik het niet eerlijk AMD daar volledig op af te rekenen...
Waarom niet? AMD heeft nota bene zelf altijd over tessellation geroepen. Al sinds de Radeon 8500 was men bezig met tessellation.
En nu is het eindelijk gestandaardiseerd in DX11, en nu verzaakt AMD al 5 jaar om een deugdelijke implementatie af te leveren.
Hun implementatie is typisch een geval van een checkbox-feature.
Ja, technisch gezien zit het erop, maar de implementatie is dusdanig slecht dat je er in de praktijk niets mee kunt.
Dat verhaal hadden we ook al met de geometry shader in DX10. Daar kon je in de praktijk ook niets mee, vanwege dezelfde bottleneck.
In dat opzicht zou je ook kunnen stellen dat nVidia al 5 jaar lang voor niets geld en tijd heeft gestoken in een elegante oplossing.
Nee, want nVidia heeft dat gewoon 5 jaar geleden in 1 keer goed gedaan. Sindsdien hebben ze PolyMorph vrijwel onveranderd in hun nieuwe ontwerpen toegepast. Dat heeft ze dus weinig extra tijd en geld gekost.
AMD moet die stap ooit nog gaan maken, en die gaat pijn doen.
Dat is ook eigenlijk wat ik bedoelde met "optimaliseren". Zowel AMD als nVidia passen hun architectuur aan, naar wat er in de praktijk het meeste voorkomt.
Dat is onzin, tessellation was er al veel eerder dan dat er games waren die het gebruikten.
Zelfs nu nog zijn de games met tessellation op 1 hand te tellen.
Het aantal games dat tessellation gebruikt zoals het bedoeld is, is 0.
Dat komt mede door de consoles. Pas sinds de Xbox One/PS4 hebben die ook een DX11-compatible tessellator aan boord... Maar helaas, ook die is van AMD, dus ook die schaalt niet.
Dit is dan ook de reden geweest voor nVidia om in Maxwell de design keuze te maken de "overtollige" FP64 cores te schrappen en die ruimte op te vullen met FP32 cores om zo de prestaties in de praktijk een boost te geven...
Niet helemaal vergelijkbaar.
FP64 is typisch een feature voor niet-grafische toepassingen. Voor graphics heb je genoeg aan FP32. Misschien dat nVidia uit de Tesla-hoek signalen kreeg dat FP64 niet belangrijk genoeg is (ook daar kunnen ze vast de meeste berekeningen wel met FP32 af, en alleen FP64 gebruiken in uitzonderlijke gevallen).
Sowieso moeten we het nog zien, want GM200 is nog niet officieel geintroduceerd.
Maar tessellation is een techniek die nog niet echt van de grond gekomen is, en het is overduidelijk dat schaalbaarheid de sleutel is.
Heb je wel eens gehoord van Pixar? En van RenderMan? Moet je eens wat over lezen. Zij gebruiken een REYES-renderer.
In feite komt het er op neer dat ze alles modelleren met bezier-patches, die via tessellation worden onderverdeeld tot 'micropolygons': polygons kleiner dan 1 pixel. Deze worden dan 'gesplat' in een soort supersampling-buffer, en dan wordt er anti-aliasing toegepast.
De reden hiervoor is dat ze op enorm hoge resoluties renderen, en tessellation is de enige manier om efficient tot het 'ideaal' van micropolygons te komen. Als je iedere polygon apart in je mesh wil opnemen en renderen, dan lopen de memory requirements compleet uit de hand. En ook de processing is dan niet meer te doen. Tessellation is namelijk niet alleen 'geometry compression', maar het maakt bepaalde zaken ook nog eens efficienter.
Zo doe je animatie op je low-res control mesh, en daarna doe je pas tessellation. Daardoor hoef je dus veel minder polygons te animeren.
Willen we dus 'Pixar-kwaliteit' graphics in games, dan moeten we dat via tessellation doen. En hoe beter de hardware kan schalen naar hoge mate van subdivision, hoe efficienter alles wordt.
Er is dus een heel duidelijk aanwijsbare reden waarom je goede tessellation in graphics hardware wil.
In tegenstelling tot DP64.
Intel is in deze helemaal een geval apart, want ondanks dat ze dan wellicht een goed uitgedachte tesselation implementatie hebben weten te fabriceren zijn ze nog steeds niet in staat een gpu te maken die er daadwerkelijk nuttig gebruik van kan maken.
Onderschat Intel niet. Hun GPUs zitten behoorlijk goed in elkaar. Ze richten zich dan wel alleen op low-end, maar daarin zijn ze wel goed. Hun GPUs zijn erg efficient als je ziet met hoe weinig transitors Intel eigenlijk werkt. Want dat is voor Intel het meest interessant: GPUs die zo goedkoop mogelijk te produceren zijn, en zo min mogelijk stroom verbruiken.
Als Intel hun huidige architectuur zou opschalen naar het formaat van een high-end AMD/nVidia GPU, dan zou je nog wel eens raar kunnen staan kijken van hoe goed dat eigenlijk wel is.
Ik heb zelf een Bay Trail laptop met Intel GPU die maar 2 EUs heeft... Twee! Dat is eigenlijk niks! En toch kun je daar lichte games op spelen (Half-Life2 of Portal is geen probleem). Stel je voor als je er iets van 1024 van had, en dan ook nog eens wat hoger geklokt dan in een SoC van 4-6W.
[Reactie gewijzigd door Scalibq op 31 mei 2015 12:24]