Skrivet av tellus82:
@Yoshman: Du pratar om en sak jag om en annan och du blandar ihop saker rätt friskt. Sen att du försöker förlöjliga på den nivån är en aning pinsamt.
Igen skilj på äpplen och päron.
Vad jag tror vi i grunden diskuterar är varför Nvidia verkar äta mer CPU-kraft och framförallt: kan Nvidia göra något åt detta i DX12 (utöver det uppenbara att göra deras drivers generellt snabbare)?
Är inte helt stolt över förra inlägget, men ett visst mått av frustration inställer sig ändå när du flera gånger hävdar att det jag skriver är fel, det trots att länkarna (som bl.a. är den officiella beskrivningen från Nvidia, ingen random youtuber) visar på motsatsen.
Du har så här långt överhuvudtaget inte styrkt det du påstår med någon artikel eller white paper som beskriver det hela.
Tog ett tag att svara, min gamla laptop hade tydligen fått nog. Tangentbordet var på fallrepen och blev ohållbart till slut, men sitter nu med ny fin maskin.
Skrivet av tellus82:
AMD har hårdvarustöd i sin gpu scheduler för async compute, detta har inte nvidia, inte ens på pascal, där gör man en fullösning som egentligen inte hanterar async compute som det är tänkt. Detta i sak är separat från den arbetsfördelning som sedan sker av denna hantering.
Förstår vad du menar här och håller till största del med på den punkten. Är dock VÄLDIGT svårt att föra en diskussion när felaktiga termer används.
ALLA DX12 GPUer stödjer "async compute" då två operationer är asynkrona om de är oberoende på tidsaxeln. Vad du menar är att AMD har HW stöd för parallell exekvering av compute och 3d-shaders (rätt term är egentligen "kernel" för ett GPU-program).
Delen med om det saknas HW-stöd är fel i sak: både Pascal och Maxwell gen 2 har stöd för att samtidigt köra compute- och 3d-kernels. Till skillnad från GCN kan dock Pascal/Maxwell gen 2 endast köra compute- ELLER 3d-kernel per SM, däremot kan man vid ett visst tillfälle ha vissa SMs konfigurerade att ta jobb från grafik-kön medan de andra plockar jobb från beräkningskön.
Skillnaden är att uppdelningen är statisk i Maxwell och dynamisk i Pascal, den statiska uppdelningen gjorde det i praktiken värdelöst att köra compute- och 3d-kernels parallellt då det blev långsammare om man råkar göra en icke-optimal split. Så numera fungerar Maxwell gen 2 precis som Maxwell gen 1 och tidigare samt som Intels GPUer. D.v.s. finns fortfarande stöd för separata köer på DX12 nivå (direct and compute), men allt stoppas in i en och samma GPU-kö.
Hittade detta, är tydligen fler än jag som stör sig på att folk inte kan hålla isär "parallel" och "async". Här påpekas också helt korrekt att folk väldigt ofta använder termen "concurrent" på fel sätt. "Parallel execution" kräver minst två fysiska kärnor, "concurrent execution" går alldeles utmärkt att göra även på ett system med en CPU-tråd (multitrådning i Windows 95 t.ex.).
Några axplock vad som sägs i inlägget jag hittade:
"Pascal solves this problem with 'dynamic load balancing' ; the 8 SMs assigned to A can be reassigned to other tasks while Task B is still running; thus saturating the SMs and improving utilization.
For some reason many people have decided that Pascal uses preemption instead of async compute.
This makes no sense at all. Preemption is the act of telling a unit to halt execution of its running task. Preemption latency measures the time between the halt command being issued and the unit being ready for another assignment."
Han håller uppenbarligen med mig om punkten kring "preemption", finns liksom noll teknisk anledning varför man skulle implementera samtidig körning av compute- och 3d-kernels på det sättet. Är ju betydligt effektivare att bara köra dem sekventiellt, det är HELT tillåtet enligt både i DX12 och Vulkan (är fortfarande "async compute", dock inte parallell exekvering av compute/3d).
Har även plöjt denna Beyond3D tråd. Mycket matnyttigt där, bl.a. klarläggning av skillnaden på "async" och "parallel". Ser inte att något som framkommer där motsäger något jag skrivit om Nvidias DX12 drivare i den tråden.
En sak som nämndes i tråden om "context-switch" är att Nvidias GPUer har två kontext: ett för grafik och ett för compute. Detta kan nog förvirrat vissa till att dra slutsatsen att man aktivt hoppar mellan dessa i DX12. Så är inte fallet, kör man CUDA/OpenCL använder GPUn compute-läget (då har Kepler och framåt 32 köer). Kör man däremot DX12/Vulkan är man alltid i grafikläget, grafikkön är ett grundmängd av beräkningsköerna så allt som kan köras i compute-läget kan även köras i grafikläget.
Även om det tekniskt finns 1 grafikkö och 31 beräkningsköer från Maxwell gen 2 och framåt i grafikläget pekar det mesta på att man bara använder 1 + 1 för Pascal (i Maxwell gen 2 användes 1 + 1 ett tag men nu är det 1 + 0, d.v.s. allt går till 3d-kön på HW-nivå).
Skrivet av tellus82:
Problemet är att cpu belastningen av denna hantering och generell arbetstråd för gpu är på nvidia betydligt större än på AMD, dessutom så sprids detta cpu-arbete ut i dx11 på kärnor på ett vettig sätt så där märker man det inte speciellt mycket förutom i extremt cpu begränsade scenarion, där kommer en AMD GPU med samma prestanda annars vara betydligt snabbare då cpu inte blir en flaskhals för AMD gpu'n (trots högre fps). Edit: Kan tillägga att det tillkommer ännu en komplicerad vinkel på prestanda här och det är att trots AMD's lägre overhead så finns i dx11 problemet att deras huvudarbetstråd inte fördelas över mer än en tråd. Detta gör att prestanda vid cpu flaskhals blir extremt vansklig att bedömma mellan AMD & nV och skiljer från spel till spel beroende på t.ex. draw calls och geometri.
Fördelningen av detta arbete i dx11 på cpu'n står nVidias drivare för som det förklaras ganska ingående i videon, problemet kommer i dx12 där nVidia vill lägga över ansvaret på utvecklare att hantera deras fullösning till async shader/compute som tilkommer i dx12 titlar med async stöd. Detta orsakar en del problem som kan ses extremt tydligt i ROTR i just dx12 med Ryzen. Lösningen till problemen här ligger enbart hos nVidia då det defakto är deras mjukvarulösning som ställer til det. Om det vore spelet i sig eller OS så skulle man se samma resultat med en AMD gpu men det gör man inte, det sker enbart med nvidia gpu.
Frågor på detta?
Nu verkar vi långt mer överens än tidigare! Har hela tiden hävdat att Nvidia inte kan göra speciellt mycket i DX12 då drivern där inte har någon möjlighet alls att lägga ut jobbet på flera trådar. Det finns en form av schemaläggning som utförs, men den har absolut inget med "preemption" att göra (vilket du hävdat innan och jag hängt upp mig på).
Nvidia når långt närmare sina GPUers teoretiska kapacitet jämfört med AMD, en orsak av detta är garantera att Nvida lägger långt mer CPU-tid på att konstruera en optimal kernel för varje jobb. Att skapa en kernel kan förenklat liknas vid att kompilera ett program, bara att detta måste ske på millisekundnivå! Så länge man är GPU-bunden är Nvidias lösning lysande, man offrar mer CPU-cykler för att få ut mer av GPUn som är primär flaskhals.
Problemet med vad Nvidia gör är att det blir viktigare att endera ha väldigt hög prestanda per CPU-kärna alt. sprida jobbet väldigt jämnt mellan CPU-trådar. I DX11 gör Nvidia ett lysande jobb här, i DX12 måste detta göra i varje spel.
En viktig sak som skiljer här är att man vill hitta en optimal ordning att köra alla compute- och 3d-kernels. Inte alls säkert att man vill köra saker i samma ordning de postades till DX12/Vulkan köerna, båda dessa APIer innehåller explicita synkroniseringspunkter i form av barriärer (barriers) och uppsamlingspunkter (fences) som beskriver vad en viss kernel förutsätter ska vara färdigt när den når en viss barrier/fence.
AMD löser detta problem i HW via ACE medan Nvidia löser detta i drivers. Notera att CPUn endast bestämmer vilken ordning kernels ska köra och vilka som eventuellt kan köra parallellt, detta läggs in i en (eller i Pascal, potentiellt två 3d/compute queue) kö som processas av GPUn. När en kernel väl börja köra är CPUn helt ute ur ekvationen oavsett GPU (gäller även Intel).
Skrivet av tellus82:
Edit: Det går att slå av flertrådad optimering i nVidias drivare på pascal även för dx12, inte enbart dx11 (spelprofil, trådad optimering/threaded optimization). Körde nyss en benchmark i ROTR med trådat och otrådad optimering och det gav en rätt bra prestandaskjuts i dx12 med trådad optimering (25% på vissa ställen). Med andra ord så sköter drivarn fortfarande en utspridning av jobbet även i dx12, frågan som uppstår här är vad som sprids ut då drivarn egentligen inte ska ha med detta att göra i just dx12 enligt allas utsago...
Om det vore fallet stämmer ju inte Nvidias egna information. Rätt säker att man har olika optimeringspunkter för hur man synkroniserar anrop som görs från olika trådar, alla dessa ska ju serialiseras ner till underliggande en/två GPU-köer. Nvidia har en punkt kring detta i deras "do's and don'ts for DX12"
"don’t create too many threads or too many command lists
Too many threads will oversubscribe your CPU resources, whilst too many command lists may accumulate too much overhead
"
Detta är generellt sant, använder man för mycket parallellism kommer man till slut till en punkt där fler CPU-kärnor minskar prestanda i stället för att öka den. Det här fenomenet ser man i alla applikationer där trådarna måste kommunicera med varandra, är också därför Amdahls lag inte blir exakt utan det är en övre gräns på hur väl något kan skala.
Amdahls förutsätter att den seriella delen är konstant, i praktiken ökar den ju fler CPU-kärnor man slänger på då kostnad för synkronisering ökar, ännu en orsak varför jag har svårt att se 6-8 kärnor bli speciellt relevant på skrivbordet inom överskådlig tid. De flesta desktop-program är inte "embarrassingly parallel", så maximal prestanda per kärna trumfar nästan alltid fler långsammare kärnor (gick själv från fyra kärnor till två kärnor på min huvudlaptop, den nya är i praktiken snabbare på nästan allt jag gör och du snurrar ändå saker som Hyper-V/Ubuntu konstant i bakgrunden).
Är vi inte överens egentligen? Nvidia har en GPU-design som lägger mer ansvar på driverprogramvara, i DX12 är det helt upp till applikationer att sprida lasten -> Nvidia kan inte göra något utöver att generellt minska CPU-overhead (i DX11 kan de däremot själva bättre sprida lasten).
I slutändan är detta rätt mycket ett icke-problem, i alla fall med i7-7700K. Flaskhalsen är ju ändå nästan alltid GPU-delen och för tillfället har Nvidia monopol på high-end segmentet. D.v.s. även om AMD GPUer äter mindre CPU kommer ändå totalresultatet bli bättre med GTX 1070 eller bättre, det även om man har en Ryzen CPU. Problemet är att man inte kan veta hur mycket DX12/Vulkan utvecklingen tar far och framtida spel blir väsentligt mer CPU-tunga. DX12/Vulkan lär inte vara i majoritet än på något år i alla fall.