Skrivet av kelthar:
Även på AMDs sida ... är detta nån fanboy-diskussion bara för att snackar i en "Polaris-tråd"? Jag vet att du är hårt knuten till Nvidia och det får du gärna vara. Jag bryr mig inte så jävla mycket.
Det jag tänkte säga om artikeln är att det är synd att de inte inkluderade fler grafikkort. Men det går väl att leta upp fler artiklar som undersöker detta fenomen. Om man tittar på dooms implementation, som verkar vara mycket vettigare, så ser man att alla tillverkare får en bra ökning. OpenGL har definitivt inte varit bra för AMD och kan väldigt troligt vara sämre optimerat än vad DX har varit. Dock så får att kort en positiv förändring med det "lågnivå-api:et". Antingen har Dooms optimering varit skit sedan innan, eller så har de gjort rätt. Det får vi se när vi har mer testdata att tillgå. (http://imgur.com/vmRddOm)
Så jag tror inte att man ska dra slutsatser att lågnivå API är dåliga, bara för att alla inte implementerat dem korrekt än så länge eller för att några kort avviker i vissa scenarion.
Kort och gott så skulle jag vilja säga att ifall man får bättre prestanda i "högnivå-api" än vad man får i ett "lågnivå-api", där man har större möjlighet själv att bestämma vad som händer, så måste man göra något fel eller så byggdes "högnivå-api:et" med hjälp av älvstoff / magi.
Reducerad overhead = prestandaökning. Ingen flaskhals i de flesta fall, som du säger, men summan av det är att man kan få bättre prestanda. Återigen, om man vet vad man gör. Och det kommer finns de som vet hur man ska göra. Människor är fantastiska.
Om nu flaskhalsen inte är kostnaden för "draw-calls" och det är den man primärt vinner med DX12/Vulkan så kvittar det ju om man "vet vad man gör".
Tittar man historiskt på hur det brukar gå för lågnivå-APIer riktade mot marknader med relativt heterogen maskinvarukonfiguration så är utsikterna att DX12/Vulkan blir succéer rätt låg. För att vara ett "low-level" API är DX12/Vulkan ändå rätt högnivå, vilket ändå ökar chansen att det ändå blir något bra i slutändan.
Om nu lågnivå är så väldigt bra, varför skriver vi inte alla program i assembler eller i alla fall C/C++?
Naturligtvis en retorisk fråga. Dels tar det betydligt längre tid att göra nästan allt i assembler och endast en försvinnande liten fraktion av alla programmerare skulle producera assembler som är snabbare än moderna kompilatorer. Det är helt enkelt betydligt vettigare att lägga lågnivåoptimeringar samt kunskap om egenheter hos specifika kretsar i kompilatorn än att kräva att alla ska ha kunskapen och den ska implementeras i alla program.
Google har gjort forskning på just prestanda i kod skriven i C++ kontra kod skriven i Java. Vad de kom fram till är att majoriteten av alla utvecklare producerar kod där Java-versionen faktiskt är snabbare än deras C++-version. Dock såg man att de personer som hade djup förståelse för designen i moderna CPUer samt en väldigt stor erfarenhet att skriva prestandakritisk kod klarade av att utnyttja C++ på "rätt" sätt och de kunde få ett bättre resultat där än i Java som inte ger samma kontroll.
Så frågan är om DX12 kontra DX11 är mer lik assemblerfallet eller Java/C++ fallet.
Jobbade själv också med lågnivå APIer för nätverksapplikationer för ett par år sedan. Finns faktiskt flera paralleller mellan vad vi nu ser med DX12 och vad man då höll på med i lågnivå APIer som DPDK och ODP. Bl.a. kunde man utnyttja flera CPU-kärnor långt bättre i dessa lågnivå APIer, förutsatt att man hade extremt detaljerad kunskap om cache-design och kostnader för olika lågnivå-operationer.
Designade bl.a. en plattform ovanpå detta som kunde hantera 5 miljoner HTTP-transaktioner per kärna på en Xeon E5-2670 (det var vid tillfället en av de absolut snabbast systemen som fanns i världen på den maskinvaran). Microsoft är ju glada att man totalt når över 1 miljon HTTP-transaktioner totalt över hela systemet i .NET tidigare i år...
Varför tog inte det vi och många andra jobbade med över världen då om de resultat vi såg fortfarande är långt snabbare än vad mer "normala" plattformar ser idag? Problemet med de extremt snabba system som var relativt tunna lager ovanpå extremt lågnivå APIer för nätverksaccess var att det krävde att de som använde systemen förstod lika mycket om CPU/cache-design som de som designat TCP/IP-stacken. Så även om användarna inte behövde förstå detaljer kring nätverksprotokoll behövde de förstå något annat som extremt få programmerare i praktiken har kunskap om, d.v.s. i praktiken blev det extremt dyrt att använda detta.
De slutgiltiga spikarna i kistan var att de flesta större applikationer hade andra flaskhalsar som blev enormt dominerade när kostnaden för själva nätverksdelen minskade med ungefär en faktor tio. Så den faktiska prestandavinsten blev inte alls lika imponerande, typiskt mellan noll till en faktor två med kanske 20-30 % som genomsnitt. Och det var alltid svårare att skriva program mot den snabbare plattformen.
Den absolut sista spiken var att man ställde frågan: varför kan man göra saker som är en tiopotens snabbare än vad man normalt sett gör i OS-kärnor och varför skalar den koden inte lika bra? Det tog en rad år, lite små justeringar på högnivå APIerna och rejäla modifikationer i designen av nätverkoden (i Linux i detta fall) och idag är prestandaskillnaden inte i närheten en faktor tio längre utan mer kanske en faktor 2. I verkliga applikationer blir då skillnaden typiskt några procent så i princip ingen tycker det är värt den högre utvecklingskostnaden.
Och "hårt knuten till Nvidia"? Tja, nog känns det som att man skulle bemötas med ett betydligt större mått av acceptans om man deltog i ett av Livets Ords bibelläger som ateist än vad man möts av här om man råkar skriva något som uppfattas som kritik mot någons favoritföretag. Har genom alla år haft två Nvidia-kort för stationär PC, Geforce256 samt 970. I övrigt har jag haft ATI/AMD (och har en lång rad Athlons/Phenoms). Det är däremot helt korrekt att jag anser att Nvidia utan tvekan haft ledartröjan ändå sedan man lanserade 900-serien och tyvärr verkar gapet öka snarare än minska
Blir så klart svårt att se elefanten i rummet när man bara letar efter bevis för "fanboyism". Självklart kan man hitta andra resultat än det jag postade ovan, poängen var att belysa det absolut största problemet med "low-level" APIer när man inte har en helt homogen maskinvarukonfiguration att jobba mot. 285 och Fury X är logiskt sett identiska ändå gav de tidiga DX12 resultaten totalt olika resultat, det medan båda korten presterade som väntat med DX11.
I ett lågnivå API måste man optimera för alla konfigurationer i alla program. Verkar det optimalt? Och hur optimerar för kort som ännu inte är lanserade? Med ett högnivå API för GPUer ligger ju majoriteten av optimeringarna i drivers, skapa optimala drivers och alla titlar ser bra prestanda.
På en konsol är det å andra sidan självklart varför lågnivå API är vettigt. Det finns bara en konfiguration och den kommer aldrig ändras under livstiden för del spel som släpps till konsolen. Ska bli väldigt spännande att se hur PS4 kontra PS4 Pro rör om i den sanningen...
Jämförelsen med Polaris var dels för att i någon mån hålla sig till ämnet men främst att peka på att saker som borde vara positiva (att Polaris redan i kislet är en mer effektiv krets än tidigare modeller) kan te sig negativa om måttet på "bra" är att man kan visa att DX12 visst är bättre än DX11.
Jämför man 970 och 390 så har den senare ungefär 50 % högre kapacitet på pappret, jämför man i stället 1060 och 480 så har den senare ungefär 30 % högre kapacitet på pappret. I praktiken presterar dessa par GPUer i det närmaste identiskt. Pascal är något mer effekt än Maxwell, så Polaris är långt mer effekt än GCN1.1 redan i DX11. En effekt är då att potentialen för DX12 är mindre hos Polaris, men är det dåligt? Nej, det visar bara att Polaris är ett betydligt bättre designat kisel!
Och säger inte att svaret är inte att behålla DX11, det är en förlegad abstraktion av ett grafikkort. Men kanske är så att Apple valde en bättre väg med sitt Metal. Där har men en bra abstraktion av moderna GPUer, men det är ändå relativt "high-level". D.v.s. Apple kanske träffade C++/Java fallet medan DX12/Vulkan är mer assemblerfallet.
OBS: Ovan är självklart kryddat med massor av spekulation och personliga gissningar. Kan absolute inte kalla mig expert på 3D då det är över 15 år sedan jag jobbade med 3D-grafik. Men har hyfsad koll på OS-kernel utveckling, programvaruutveckling för multicore-system samt optimering för riktiga low-end system (i princip det jag jobbat med de senaste 15 åren). Och detta är trots allt ett diskussionsforum.